阅读:2105回复:19
用事件同步驱动跟应用程序时碰到的一个问题
应用程序中创建一个命名事件,传递给驱动。由应用程序来SetEvent,驱动KeWaitForSingleObject并KeResetEvent。
一般情况下正常,但是当先关闭应用程序后驱动由于没有得到有信号event,一直等待。但是重新开去应用程序打开该命名事件,并且SetEvent,驱动还是无响应?! |
|
沙发#
发布于:2008-05-13 15:18
调试发现是该事件已经被系统注销掉。但是我已经在驱动里调用ObReferenceObjectByHandle来增加计数器啊。
然后我发送几次事件给驱动,驱动就调用几次ObReferenceObjectByHandle,但是关闭应用程序后事件还是被系统注销?! |
|
板凳#
发布于:2008-05-13 15:46
呵呵,你应用程序退出后 该进程对应的乱七八糟的内核对象被系统强制回收了!
|
|
地板#
发布于:2008-05-13 15:53
但是我已经在驱动里调用ObReferenceObjectByHandle来增加计数器啊,应用程序推出,事件计数器应该只会减1啊。
那如果应用程序一推出,事件就被注销掉,共享事件岂不是意义不大?应用程序很容易被终止啊。 |
|
地下室#
发布于:2008-05-13 16:34
事实上那是你一厢情愿的以为,哈哈!
|
|
5楼#
发布于:2008-05-13 21:18
那应该是怎么样呢,我应该如何做?
|
|
6楼#
发布于:2008-05-13 21:30
这不是我一厢情愿的以为,是微软的文档说明
|
|
7楼#
发布于:2008-05-14 11:22
文档错了,实际系统为准,具体怎么搞 我也关注ing 哈哈
驱动ObReferenceObjectByHandle,如果失败就别等了,就这样吧 |
|
8楼#
发布于:2008-05-14 13:26
驱动ObReferenceObjectByHandle,如果失败就别等了---------》问题是该函数返回成功啊!
文档错了? |
|
9楼#
发布于:2008-05-14 13:36
不知用windbg是否可以看到Event的参考计数器值
|
|
10楼#
发布于:2008-05-16 10:01
帮忙UP
|
|
11楼#
发布于:2008-05-16 21:31
不使用Event,用Callgate或者其他~
嘿嘿~ 要暴力,要暴力~ 不走寻常路,兼容各种操作系统~ |
|
|
12楼#
发布于:2008-05-17 12:43
我是用APC 嘿嘿 稳定可靠
|
|
13楼#
发布于:2008-05-19 14:01
直接呼叫或者用APC可以得到用户程序的完成信息么?如果用户程序异常终止会如何?
|
|
14楼#
发布于:2008-05-19 14:54
尽量不要在驱动里面wait吧!用户完成后通过DeviceIoControl通知驱动啊
|
|
15楼#
发布于:2008-05-19 15:14
但是我需要等待用户程序完成工作后才能IoCompleteRequest IRP啊,否则不能做下一次工作。
|
|
16楼#
发布于:2008-05-19 15:15
我刚才试着设定超时值0xFFFFFFFF,结果每次都超时!算起来要等待400多秒啊,怎么会这样?
|
|
17楼#
发布于:2008-05-20 17:23
尽量不要在驱动里面wait吧!用户完成后通过DeviceIoControl通知驱动啊----------------------------->试了不等待,直接在完成后通过deviceiocontrol通知驱动,然后驱动再完成IRP,巨慢,系统被卡住动不了。
|
|
18楼#
发布于:2008-05-21 07:52
你不会是在驱动里面这么写吧?
while (not 完成); 这样还不如用事件等呢 |
|
19楼#
发布于:2008-05-21 09:27
没有等,这样等死机是正常的吧。我是在驱动里直接做动作,但是不调用IoCompleteRequest IRP,而是在用户程序通过deviceiocontrol发送特定信息时才调用IoCompleteRequest IRP。
|
|