download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3045回复:9

關於用戶OpenEvent與Kernel IoCreateNotificationEvent的問題

楼主#
更多 发布于:2007-11-22 21:38
應用程式使用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);






ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-11-22 21:56
好久没玩Tdi_Filter了。。KesetEvent 会导致BSOD?
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-11-22 22:01
IoCreateNotificationEvent must be running at IRQL = PASSIVE_LEVEL.
还有,我喜欢在Ring3中创建Event,在Ring0中进行引用。
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-11-22 22:05
KeSetEvent(g_ProcessEvent, 0, FALSE);
KeClearEvent(g_ProcessEvent);
上面二句很有问题。。设置Event信号状态,马上又重置它。。你这样使用Event问题很多的。。
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-11-22 22:07
IRQL_LESS_OR_EQUAL,并不一定是IRQL级别太高所造成的,操作空指针也有可能会造成这个BSOD。
人不靓仔心灵美,版头不正红花仔!
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
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
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-11-23 17:34
Re:關於用戶OpenEvent與Kernel IoCreateNotificationE
= =最後我用了監測進程 建立與 刪除的事件通知...來確定自己的 applicaiton是否...已經停止...然後設flag

= =...雖然不是正解...當總比當機好過十倍..   謝謝各位
dfbb7788
驱动牛犊
驱动牛犊
  • 注册日期2007-07-07
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望106点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-24 21:18
建议你在驱动层创建event 这样内核不会down掉
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-15 00:46
我也遇到这个问题了,请问如何解决?
bbs.80dnst.com -- 驱动/逆向
suaigui
驱动牛犊
驱动牛犊
  • 注册日期2002-06-26
  • 最后登录2009-08-19
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望17点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-02-03 09:50
Re:關於用戶OpenEvent與Kernel IoCreateNotificationE
应该是在驱动层创建event
游客

返回顶部