阅读:1914回复:4
内核事件的计数器处理问题.
关于使用事件实现驱动与Win32 AP通迅的例子已经很多了。
但我在实际使用中,发现了一些关于Windows 计数的问题,请各位指教一下: 案例一: 我希望驱动建立一个事件,然后由Win32 AP来读取信息。 于是Win32 AP启动时,会如下操作: h1=CreateFile("\\.\Driver1") DeviceIoControl(h,Cmd_EventReady,...) //驱动建立事件 Event1 h2=OpenEvent("Event1") Driver中的例程: DeviceIoControl(obj, irp) case Cmd_EventReady: Event=IoCreateSynchronizationEvent(&EventName,&EventHandle); 这时建立成功, Event指针为FCEA59B0, 用windbg 查看, !object FCEA59B0 HandleCount: 2 PointerCount: 3 这时, 两个 Handle 均为 Win32 AP相关,如果Win32程序退出,那么 事件Event1会消失,这是什么原因呢? 有办法在Driver中,创建完事件后,就立即增加其 HandleCount 计数吗? 我试过所有 ObReferenceObject ,但它们只会增加 PointerCount。 我能在驱动中,用 ZwCreateFile 来打开的事件,以达到增加事件的HandleCount的值吗? 或者还有其它的方法? |
|
|
沙发#
发布于:2005-01-22 03:07
你建立共享事件的位置大约没有问题吧?
再有就是你为什么要驱动建立事件而不是APP呢? 关于使用事件实现驱动与Win32 AP通迅的例子已经很多了。 [编辑 - 1/22/05 by simba] |
|
板凳#
发布于:2005-01-22 11:52
其实由Win AP来建立事件,也是一样的。
由 Win AP来建立事件,也需要将 Win AP的事件句柄传进Driver中,再由Driver使用 ObReferenceObjectByHandle( *((PHANDLE)Irp->AssociatedIrp.SystemBuffer), 0, (POBJECT_TYPE) NULL, UserMode, (PVOID)&UserEvent, (POBJECT_HANDLE_INFORMATION) NULL); 相关的资料说,这时会增加 事件的 handleCount,但我检测不到。 我采用由驱动建立,是因为我在上面有多个AP。我现在在Driver中建立的事件的方法是 // Create event for user-mode processes to monitor RtlInitUnicodeString(&uszNotifyEventString, L"\\BaseNamedObjects\\KnotifyEvent"); extension->NotifyEvent = IoCreateNotificationEvent(&uszNotifyEventString, &extension->NotifyHandle); 这个 NotifyHandle,有什么用呢?我发现这个 NotifiyHandle好像也属于Win App(因为我的IoCreate由Win App触发),一旦Win App close, 那 NotifyHandle 也失效 |
|
|
地板#
发布于:2005-01-22 15:43
换个简单的说法
我在Win32APP中创建一个事件,然后传给driver(用obRefereByHandle获得kevent)。但当 Win32APP关闭时,事件对象就消失了,要怎样才能固定这个事件呢? 让下次 Win32 App 可以直接 OpenEvent即可. 我测试了,无论 事件是先由 APP 创建,还是先由 Driver 创建(在DeviceIoControl),也是一样的。 前者还说得过去,但后者,事件由Driver用IoCreateSynchronizationEvent创建,为什么Win32APP关闭后,也会消失呢? 注:事件消失是指在 \BaseNameObjects 下找不到了(用Windbg监视得到) |
|
|
地下室#
发布于:2005-01-22 17:20
嗯...看来你是还有好几个APP并行,难怪,不过不止一种方法约定这个事件,如果APP建可以传handle然后用obRefereByHandle,也可以先约好名称,直接IoCreateSynchronizationEvent,我用的后者,事件存在的周期受ZwClose(Handle)和CloseHandle(hEvent)影响,但不用在驱动里找handle。
还有就是你的APP什么时候CloseHandle(hEvent)的?呵呵 |
|