huoxy
驱动小牛
驱动小牛
  • 注册日期2002-03-01
  • 最后登录2014-02-24
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1185回复:3

Event什么时候复位?

楼主#
更多 发布于:2002-07-17 13:00
我阅读了WinDDK2000附带的BulkUsb例子,其中使用了许多的事件,但是只看到了对置位事件的调用KeSetEvent,而没有复位的调用KeClearEvent or KeResetEvent,(我没写错函数名吧)。

Event有两种,Sync Event and Noti Event,例子使用的事件都是Noti Event,按照帮助的意思,应该显示的调用KeResetEvent or KeClearEvent来复位,但是例子没有调用。我认为这样会出问题,因为如果假设a==0则设置Ev1,但是当a<>1时却没有复位Ev1,那么,如果经历过一次a==0,则以后无论什么时候使用KeWaitSingleObject(函数名忘了),都会立刻返回,因为Ev1已经\"为真\",不知道我的分析是否正确?期待前辈释疑。

另外,即使使用Sync Event,如果已经有一次a==0 -> Ev1=True,然后a<>0(这时Ev1应该依然TRUE),如果这时需要等待 a 再次 == 0 而调用KeWait(Ev1),但是Ev1这时已经=TRUE,这样KeWait会立刻返回,而没有经历a==0,也就是说,没有达到我们的“等待a==0”这个要求。是不是这样?
好好学习,天天向上,做一个乖宝宝。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-17 13:41
复位,可能不是在驱动层做的

在应用层等待事件发生,然后复位
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-07-17 13:48
有道理 :cool:
huoxy
驱动小牛
驱动小牛
  • 注册日期2002-03-01
  • 最后登录2014-02-24
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-18 09:54
我的疑惑是:KeWait等待一个事件发生,这个事件应该从开始调用KeWait后发生才有效,如果在KeWait调用前,此事件已经设置为Signaled状态,这不是我们所希望的。

比如:我们开始处理一个Irp,这时应该设置NoPendingIoEvent为无效状态,等Irp处理结束后,设置NoPendingIoEvent为Signaled状态。
我觉得应该是这样的,因为假如在\"意外删除\"事件时要使用KeWait(NoPendingIoEvent),而NoPendingIoEvent在第一个Irp结束后就被设置为Signaled状态,以后都始终是Signaled状态,这样调用KeWait时,即使还有一个Irp正在处理,KeWait也立刻返回,因为此时Event为Signaled状态,KeWait没有起到等待所有Irp处理结束的作用。我想这不是我们所希望的。

所以,我觉得应该有一个复位过程。
好好学习,天天向上,做一个乖宝宝。
游客

返回顶部