阅读:3045回复:9
關於用戶OpenEvent與Kernel IoCreateNotificationEvent的問題
應用程式使用IOCTL 通知 tdi filter 建立IoCreateNotificationEvent 核心事件
然後應用程式用OpenEvent (這個時候我用WinObj看/BaseNameObjects才有事件物件產生) 應用程式用 WaitForSingleObject 等待 然後正常是有網路事件....tdi filter 的 dispatch routine 裡面做 KesetEvent 與 KeClearEvent 的動作 問題來了.... 當我應用程式不正常終止的時候.....\BaseNameObject\xxxxEvent 這個物件會消失 但是tdifilter驅動 還是會繼續正常運作下... 當有網路事件發生的時候 KesetEvent 會發生...0xA的錯誤 或說 IRQL_LESS_OR_EQUAL...這個BSOD 想請問各位先進...= =..我要怎麼判斷 或處理 這樣的問題 才會是一個比較好的方法... 單純就判斷 Kernel Event 是否在同一個位址上...或指向的內容 似乎也沒用... 主要的問題我想還是出在...為什麼是OpenEvent的時候才會建立該事件物件....而不是在IoCreateNotificationEvent的時候... 任何指教討論都願虛心接受 //===================user mode========================== InitialKernelEvent(); HANDLE hProcessEvent = ::OpenEvent(SYNCHRONIZE, FALSE, "XXXEvent"); // wait event notification from kernel object WaitForMultipleObjects(2, (const HANDLE*)pEvent, FALSE, INFINITE); . //===================kernel mode========================== g_ProcessEvent = IoCreateNotificationEvent(&g_uszProcessEventString, &g_pDevExt->hProcessHandle); KeClearEvent(g_ProcessEvent); // event notify KeSetEvent(g_ProcessEvent, 0, FALSE); KeClearEvent(g_ProcessEvent); |
|
沙发#
发布于:2007-11-22 21:56
好久没玩Tdi_Filter了。。KesetEvent 会导致BSOD?
|
|
|
板凳#
发布于:2007-11-22 22:01
IoCreateNotificationEvent must be running at IRQL = PASSIVE_LEVEL.
还有,我喜欢在Ring3中创建Event,在Ring0中进行引用。 |
|
|
地板#
发布于:2007-11-22 22:05
KeSetEvent(g_ProcessEvent, 0, FALSE);
KeClearEvent(g_ProcessEvent); 上面二句很有问题。。设置Event信号状态,马上又重置它。。你这样使用Event问题很多的。。 |
|
|
地下室#
发布于:2007-11-22 22:07
IRQL_LESS_OR_EQUAL,并不一定是IRQL级别太高所造成的,操作空指针也有可能会造成这个BSOD。
|
|
|
5楼#
发布于:2007-11-23 10:13
Re:關於用戶OpenEvent與Kernel IoCreateNotificationE
我想應該是操作空指針發生的錯誤吧...我想應該是在user mode程式關閉時,kernel mode事件的對象不見了...造成keEvent 在KesetEvent的時候去操作到一個已經release 的 object....= =.. 至少我目前是這樣想的.......XD KeSetEvent(g_ProcessEvent, 0, FALSE); KeClearEvent(g_ProcessEvent); 這是因為上面的帶碼user mode不能直接重置kernel event的狀態, 所以在kernel mode 馬上 clear signal |
|
6楼#
发布于:2007-11-23 17:34
Re:關於用戶OpenEvent與Kernel IoCreateNotificationE
= =最後我用了監測進程 建立與 刪除的事件通知...來確定自己的 applicaiton是否...已經停止...然後設flag= =...雖然不是正解...當總比當機好過十倍.. 謝謝各位 |
|
7楼#
发布于:2007-11-24 21:18
建议你在驱动层创建event 这样内核不会down掉
|
|
8楼#
发布于:2008-01-15 00:46
我也遇到这个问题了,请问如何解决?
|
|
|
9楼#
发布于:2008-02-03 09:50
Re:關於用戶OpenEvent與Kernel IoCreateNotificationE
应该是在驱动层创建event |
|