阅读:1299回复:3
VXD与应用层通过事件同步怎么不灵,请指教!
各位大侠,我通过应用层创建EVENT: hEventRing3,并将该事件通过OpenVxDHandle()转化为hEventRing0,并将该hEventRing0送给VXD,这些都完成了。当我在VXD中调用_VWIN32_SetEvent后,应用层WaitForSingleObject(hEventRing3,INFINITE);能够正常响应并自动重置该时间。但我在VXD中调用_VWIN32_Wain_SingleObject时却不能够停下来等候应用层SetEvent(hEventRing3)来通知,而是直接跑下去了!!!
我的VXD层代码如下: DWORD dwTemp1=0xffffffff; DWORD dwTemp2=0; _asm{ mov ebx,[hEventRing0] mov edx,[dwTemp1] mov eax,[dwTemp2] } VMMCall(_VWIN32_Wait_SingleObject); 应用层通过SetEvent(hEventRing3);来通知。但VXD却不听话,直接跑了下去!!! 恭请各位大侠提点!!! |
|
最新喜欢:![]()
|
沙发#
发布于:2001-10-26 11:48
不但如此,有时候你 _VWIN32_SetWin32Event不能换醒外部等待线程,但却能陷入 _VWIN32_Wait_SingleObject的等待中,从而导致死锁。
我估计是由于此时系统不适宜调用 _VWIN32 服务的原因,尝试过使用调度系统虚拟机事件的方式SetEvent,但并没有完全解决这一问,现在正在试用调度应用程序事件方式,估计比较可行。 如果你已有解决办法,不要忘记说来听听。 |
|
|
板凳#
发布于:2001-10-29 20:56
我已经找到原因了,谢谢大侠回复!
在_VWIN32_WaitSingleObject()之前,我还调用了一句自己封装的打印调试语句:TRACE_ENTER("Begin Wait Event0");该调用使用了DbgPrint()函数,影响了Ebx=0,使该事件无法等待。 但是:如果将Eax置为0,等待应用程序通知时,由于该标志将导致IRP等请求无法响应,从而应用层有可能与该VXD发生死锁,如果改为Eax = 1,则有可能并非该事件发生时,Wait就返回了(有IRP要求响应时),此时该如何将应用层与VXD可靠同步? |
|
|
地板#
发布于:2001-11-15 00:19
我用的是循环判断的方式, 直到特定的请求结构中的数据完成标志为真时退出循环。
倒是您说的 IRP请求的事求,我不是很了解,能不能详述一下,或者是哪里可找到详细文档说明。 或者我们可以一起找到方法解决这一问题,我的 Email 是 linsuyi@sina.com,有空的话联系。 |
|
|