对 Windows驱动开发技术详解 第八章的(驱动程序的同步处理)自我理解
2011-11-30 10:48
731 查看
对 Windows驱动开发技术详解 第八章的(驱动程序的同步处理)自我理解 BY:ALALMN—飞龙 QQ:316118740 BLOG:http://hi.baidu.com/alalmn 本章主要对等待 创建新线程 对事件进行初始化操作 信号灯 互斥体 从R0和R3都做了介绍方便大家对比 /////////////////////////////////////////////////////////////////////////////// 中断请求(IRQ)中断控制器(PIC) PIC的中断向量 IRQ编号 设备名称 用途 IRQ0 Tine 计算机系统计时器 IRQ1 KeyBoard 键盘 IRQ2 Redirect IRQ9 与IRQ9相接,MPU-401 MDI使用该IRQ IRQ3 COM2 串口设备 IRQ4 COM1 串口设备 IRQ5 LPT2 建议声卡使用该IRQ IRQ6 FDD 软驱传输控制用 IRQ7 LPT1 打印机传输控制用 IRQ8 CMOS Alert 即时时钟 IRQ9 Redirect IRQ2 与IRQ2相接。可设定给其他硬件使用 IRQ10 Reversed 建议保留给网卡使用该IRQ IRQ11 Reversed 建议保留给AGP显卡使用 IRQ12 PS/2Mouse 按PS/2鼠标,若无也可以设定给其他硬件使用 IRQ13 FPU 协处理器用,例如FPU(浮点运算器) IRQ14 Primary IDE 主硬盘传输控制用 IRQ15 Secondary lde 从硬盘传输控制用 中断请求有32个中断请求级别 0-2级别为软件中断。 3-31级为硬件中断(这里包括APIC中的24个中断) /////////////////////////////////////////////////////////////////////////////// 用户模式的等待 WaitForSingleObject等待一个同步对象 DWORD WaitForSingleObject( HANDLE hHandle, //同步对象句柄 DWORD dwMilliseconds //等待时间 ms(毫秒) ); WaitForMultipleObjects等待多个同步对象 DWORD WaitForMultipleObjects( DWORD nCount, //同步对象数组元素个数 const HANDLE* lpHandles, //同步对象数组指针 BOOL bWaitAll, //是否等待全部同步对象 DWORD dwMilliseconds //等待时间 ); 用户模式CreateThread创建新线程 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全属性 DWORD dwStackSize, //初始化堆栰大小 LPTHREAD_START_ROUTINE lpStartAddress, //线程运行的函数指针 LPVOID lpParameter, //传入函数中的参数 DWORD dwCreationFlags, //开启线程时的状态 LPDWORD lpThreadId //返回线程ID ); 另外,创建线程的时候最好不是用CreateThread函数,而使用_beginthreadex函数。 _beginthreadex函数是对CreateThread函数的封装,其参数与CreateThread完全一致。 _beginthreadex函数的函数名前面有个下滑线,是应为它不是标准C语言提供的运行时函数。 (这个是Windows驱动开发技术详解 第227页说到的) /////////////////////////////////////////////////////////////////////////////// 用户模式 对事件进行初始化操作 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 BOOL bManualReset, // 复位方式 BOOL bInitialState, // 初始状态 LPCTSTR lpName // 对象名称 ); /////////////////////////////////////////////////////////////////////////////// 用户模式 信号灯 CreteSemaphore函数负责创建信号灯 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //安全属性 LONG lInitialCount, //初始化计数个数 LONG lMaximumCount, //计数器最大个数 LPCWSTR lpName //命名 ); ReleaseSemaphore函数增加信号灯的计数器 BOOL ReleaseSemaphore( HANDLE hSemaphore, //信号灯句柄 LONG lReleaseCount, //本次操作增加的计数 LPLONG lpPreviousCount //记录以前的计数 ); /////////////////////////////////////////////////////////////////////////////// 用户模式 互斥体 初始化互斥体 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, //安全属性 BOOL bInitialOwner, //是否被占有 LPCTSTR lpName //命名 ); /////////////////////////////////////////////////////////////////////////////// 内核模式下的同步 kewaitforsingleobject等待一个同步对象 NTSTATUS KeWaitForSingleObject( IN PVOID Object, //是一个同步对象的指针,注意这里不是句柄。 IN KWAIT_REASON WaitReason, //表示等待的原因,一般设为Executive IN KPROCESSOR_MODE WaitMode, //是等待模式,说明这个函数是在用户模式下等待还是在内核模式下等待。此参数一般设为KernelMbde IN BOOLEAN Alertable, //指明等待是否是"警惕"的,一般设置为FALSE IN PLARGE_INTEGER Timeout OPTIONAL //等待时间。如果这个参数设置为NULL,则代表无限期等待,直到等待的同步对象变为激发态。 时间以100ms(纳米)为单位。 ); kewaitformultipleobjects等待多个同步对象 NTSTATUS KeWaitForMultipleObjects( IN ULONG Count, //等待同步对象的个数 IN PVOID Object[], //同步对象数组 IN WAIT_TYPE WaitType, //指示是等待任意一个同步对象还是等待所有的同步对象 IN KWAIT_REASON WaitReason, //表示等待的原因,一般设为Executive IN KPROCESSOR_MODE WaitMode, //是等待模式,说明这个函数是在用户模式下等待还是在内核模式下等待。此参数一般设为KernelMbde IN BOOLEAN Alertable, //指明等待是否是"警惕"的,一般设置为FALSE IN PLARGE_INTEGER Timeout OPTIONAL, IN PKWAIT_BLOCK WaitBlockArray OPTIONAL //等待时间。如果这个参数设置为NULL,则代表无限期等待,直到等待的同步对象变为激发态。 时间以100ms(纳米)为单位。 ); /////////////////////////////////////////////////////////////////////////////// 内核模式下开启多线程 创建新线程 NTSTATUS PsCreateSystemThread( OUT PHANDLE ThreadHandle, //用于输出,这个参数得到新创建的线程句柄 IN ULONG DesiredAccess, //是创建的权限 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, //是该线程的属性,一般设为NULL IN HANDLE ProcessHandle OPTIONAL, //指定是创建用户线程还是系统进程。如果该值为NULL,则为创系统线程。如果该值是一个进程句柄,则新创建的线程属于这个指定的进程。DDK提供的宏NtCurrentProcess可以得到当前进程的句柄。 OUT PCLIENT_ID ClientId OPTIONAL, //为新线程的运行地址 IN PKSTART_ROUTINE StartRoutine, //为新线程接收的参数 IN PVOID StartContext ); 创建线程必须用函数PsTerminateSystemThread强制线程结束。否则该线程是无法自动退出的。 /////////////////////////////////////////////////////////////////////////////// 内核模式下事件对象 VOID KeInitializeEvent( IN PRKEVENT Event, //这个参数是初始化事件对象的指针 IN EVENT_TYPE Type, //这个参数是时间的类型。事件的类型分为两类,一类是"通知事件",对应参数是NotificationEvent.另一类是"同步事件",对应参数是SynchronizationEvent IN BOOLEAN State //这个参数如果为真,事件对象初始化状态为激发状态。如果该参数为假,则事件对象的初始化状态为未激发态 ); /////////////////////////////////////////////////////////////////////////////// 内核模式下信号灯 KeInitializeSemaphore对信号灯对象初始化 VOID KeInitializeSemaphore( IN PRKSEMAPHORE Semaphore, //这个参数获得内核信号灯对象指针 IN LONG Count, //这个参数是初始化时的信号灯计数 IN LONG Limit //这个参数指明信号灯计数的上限值 ); /////////////////////////////////////////////////////////////////////////////// 内核模式下互斥体 KeInitializeMutex初始化互斥对象 VOID KeInitializeMutex( IN PRKMUTEX Mutex, //这个参数可以获得内核互斥对象的指针 IN ULONG Level //保留值,一般设为0 ); /////////////////////////////////////////////////////////////////////////////// 互锁函数 ExInterlockedXX系列函数通过自旋锁实现 不可以操作分页数据 ExInterlockedXX互锁操作函数 内核函数 功能 ExInterlockedAddLargeInteger 64位整数加法互锁操作 ExInterlockedAddLargeStatistic 64位整数加法互锁操作 ExInterlockedAddUlong 32位整数加法互锁操作 ExInterlockedAllocateFromZone 分配互锁操作 ExInterlockedCompareExchange64 两个32位整数互换互锁操作 ExInterlockedDecrementLong 32位整数减法互锁操作 ExInterlockedExchangeAddLargeInteser 64为整数加法互锁操作 ExInterlockedExchangeUlong 两个整数互换互锁操作 ExInterlockedFlushSList 删除链表全部元素的互锁操作 ExInterlockedIncrementLong 32位整数自增互锁操作 ExInterlockedInsertHeadList 插入双向链表互锁操作 ExInterlockedInsertTailList 插入双向链表互锁操作 ExInterlockedPopEntryList 删除单向链表互锁操作 ExInterlockedPopEntrySList 删除单向链表互锁操作 ExInterlockedPushEntryList 插入单向链表互锁操作 ExInterlockedPushEntrySList 插入单向链表互锁操作 ExInterlockedRemoveHeadList 插入双向链表互锁操作 InterlockedXX系列函数不通过自旋锁实现 可以操作分页数据 InterlockedXX互锁操作函数 内核函数 功能 InterlockedCompareExchange 比较互锁操作 InterlockedCompareExchangePointer 比较互锁操作 InterlockedDecrement 整型自减互锁操作 InterlockedExchange 整型交换互锁操作 InterlockedExchangeAdd 两个整型相加互锁操作 InterlockedExchangePinter 为指针赋值互锁操作 InterlockedIncrement 整型自增互锁操作 ///////////////////////////////////////////////////////////////////////////////
相关文章推荐
- 对 Windows驱动开发技术详解 第九章的(IRP的同步)自我理解
- <学习笔记>Windows驱动技术开发详解__驱动程序的基本结构
- <学习笔记>Windows驱动开发技术详解__驱动程序的同步处理
- windows驱动开发技术详解 VC6与DDK搭配使用的设置
- <学习笔记>Windows驱动开发技术详解__Windows内存管理
- windows驱动开发技术详解 第五章 windows内存管理
- windows驱动开发技术详解 总结
- Windows驱动开发(10) - 驱动程序的同步处理(一)
- windows驱动开发技术详解 VC6与DDK搭配使用的设置
- <学习笔记>Windows驱动开发技术详解__派遣函数
- <学习笔记>Windows驱动开发技术详解__Windows内核函数
- windows驱动开发技术详解勘误5-6章
- 11、Windows驱动开发技术详解笔记(7) 基本语法回顾
- <学习笔记>Windows驱动开发技术详解__IRP的同步
- windows驱动开发技术详解 VC6与DDK搭配使用的设置 .
- windows驱动开发技术详解 VC6与DDK搭配使用的设置
- 12、Windows驱动开发技术详解笔记(8) 基本语法回顾
- Windows驱动开发技术详解__派遣函数
- <学习笔记>Windows驱动开发技术详解__Windows内存管理
- <学习笔记>Windows驱动开发技术详解__派遣函数