石头山
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2002-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1298回复:3

VXD与应用层通过事件同步怎么不灵,请指教!

楼主#
更多 发布于:2001-10-26 10:23
各位大侠,我通过应用层创建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却不听话,直接跑了下去!!!
恭请各位大侠提点!!!

最新喜欢:

zh002008zh0020...
mountain
Linsuyi
驱动牛犊
驱动牛犊
  • 注册日期2001-05-26
  • 最后登录2003-04-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-10-26 11:48
  不但如此,有时候你 _VWIN32_SetWin32Event不能换醒外部等待线程,但却能陷入 _VWIN32_Wait_SingleObject的等待中,从而导致死锁。

  我估计是由于此时系统不适宜调用 _VWIN32 服务的原因,尝试过使用调度系统虚拟机事件的方式SetEvent,但并没有完全解决这一问,现在正在试用调度应用程序事件方式,估计比较可行。

  如果你已有解决办法,不要忘记说来听听。
箫林(Lsy)
石头山
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2002-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-10-29 20:56
我已经找到原因了,谢谢大侠回复!
在_VWIN32_WaitSingleObject()之前,我还调用了一句自己封装的打印调试语句:TRACE_ENTER("Begin Wait Event0");该调用使用了DbgPrint()函数,影响了Ebx=0,使该事件无法等待。

但是:如果将Eax置为0,等待应用程序通知时,由于该标志将导致IRP等请求无法响应,从而应用层有可能与该VXD发生死锁,如果改为Eax = 1,则有可能并非该事件发生时,Wait就返回了(有IRP要求响应时),此时该如何将应用层与VXD可靠同步?
mountain
Linsuyi
驱动牛犊
驱动牛犊
  • 注册日期2001-05-26
  • 最后登录2003-04-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-11-15 00:19
  我用的是循环判断的方式, 直到特定的请求结构中的数据完成标志为真时退出循环。
  倒是您说的 IRP请求的事求,我不是很了解,能不能详述一下,或者是哪里可找到详细文档说明。 或者我们可以一起找到方法解决这一问题,我的 Email 是 linsuyi@sina.com,有空的话联系。
箫林(Lsy)
游客

返回顶部