WeiChen
驱动牛犊
驱动牛犊
  • 注册日期2001-06-28
  • 最后登录2005-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1680回复:5

初学迷惑

楼主#
更多 发布于:2001-09-07 10:42
我在书中看到这样的程序

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触发的
越学越无知!唉!
WeiChen
驱动牛犊
驱动牛犊
  • 注册日期2001-06-28
  • 最后登录2005-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-08 11:31
大家怎么都不说话呀???
越学越无知!唉!
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-08 12:46
好象是(记不清楚了)

UnlockDevice中InterlockedDecrement(&dx->...)
如果减到0,则除法STOPPINGEVENT
guest
驱动牛犊
驱动牛犊
  • 注册日期2001-06-12
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-08 17:20
jeosph:你好

书中确实有UnlockDevice(),它把记录打开的I/O的请求数目的dx->UsageCount减1。但是,是否是UnlockDevice将dx->UsageCount减为0,程序就会自己执行KeWaitForSingleObject()。
那么,为什么UsageCount减为0,就会自己执行KeWaitForSingleObject()。
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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.


WeiChen
驱动牛犊
驱动牛犊
  • 注册日期2001-06-28
  • 最后登录2005-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-09-10 18:07
谢谢jeosph,小弟在此作揖了。
越学越无知!唉!
游客

返回顶部