您的位置:首页 > 其它

对 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                     整型自增互锁操作

///////////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: