阅读:1185回复:3
Event什么时候复位?
我阅读了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”这个要求。是不是这样? |
|
|
沙发#
发布于:2002-07-17 13:41
复位,可能不是在驱动层做的
在应用层等待事件发生,然后复位 |
|
|
板凳#
发布于:2002-07-17 13:48
有道理 :cool:
|
|
地板#
发布于: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处理结束的作用。我想这不是我们所希望的。 所以,我觉得应该有一个复位过程。 |
|
|