阅读:1680回复:5
初学迷惑
我在书中看到这样的程序
PWDM2_DEVICE_EXTENSION dx = (PWDM2_DEVICE_EXTENSION)fdo->DeviceExtension; ... dx->Stopping = true; KeResetEvent(&dx->StoppingEvent); ... KeWaitForSingleObject(&dx->StoppingEvent, Executive,KernelMode,FALSE,NULL); dx->Stopping = false; // stop our device before passing down StopDevice(dx); ... 请问KeResetEvent重设事件后,KeWaitForSingleObject是怎样等待dx->StoppingEvent触发的 |
|
|
沙发#
发布于:2001-09-08 11:31
大家怎么都不说话呀???
|
|
|
板凳#
发布于:2001-09-08 12:46
好象是(记不清楚了)
UnlockDevice中InterlockedDecrement(&dx->...) 如果减到0,则除法STOPPINGEVENT |
|
地板#
发布于:2001-09-08 17:20
jeosph:你好
书中确实有UnlockDevice(),它把记录打开的I/O的请求数目的dx->UsageCount减1。但是,是否是UnlockDevice将dx->UsageCount减为0,程序就会自己执行KeWaitForSingleObject()。 那么,为什么UsageCount减为0,就会自己执行KeWaitForSingleObject()。 |
|
地下室#
发布于:2001-09-10 10:44
你仔细看一下UNLOCKDEVICE的代码
count减到零后,有一个KeSetEvent(&dx->Stoppintevent,..) 语句,这就是使dx->StoppingEvent成为信号态,就会触发在此事件上等待的被阻塞的线程 KeWaitForSingleObject(&dx->StoppingEvent,...)第一个参数就是这个事件啊!所以就.... 或者你就理解成KeWaitForSingleObject是个触发器,而KeSetEvent是个时钟就可以了,失重3信号有了,触发器也就该动作啦! event,mutex,semophore,timer这些都是内核同步对象,在使用之前都需要申明,此后内核会在非分页内存中给你一个存储单元,内核负责一些具体的检测、触发过程。 实在不能理解,你仔细阅读ONEY的书chapter 4-synchronization. |
|
5楼#
发布于:2001-09-10 18:07
谢谢jeosph,小弟在此作揖了。
|
|
|