阅读:3011回复:12
驱动程序与应用程序之间的事件同步
各位达人,是否有驱动与应用层事件同步的资料,共享内存的也行。
还有,如果在驱动程序中,在回调函数中进行事件的waitforsingleobject ,setevent 等操作是否会有稳定性问题。 |
|
|
沙发#
发布于:2007-06-28 14:45
在回调中做waitforsingleobject ,setevent 立刻蓝脸。
懂朋友的留步啊,如何做到驱动与应用程序同步交互呢。 |
|
|
板凳#
发布于:2007-06-28 15:00
非常稳定的说,是标准技术。
下面是主要代码片段。(内核先建立,然后用户态打开,等待) 用户态: HANDLE hProcessEvent = OpenEvent(SYNCHRONIZE, FALSE, "sssss"); 等待 while( WaitForSingleObject(hProcessEvent, INFINITE) == WAIT_OBJECT_0 ) { break; } 内核态: // 建立内核事件 RtlInitUnicodeString(&uszProcessEventString, EVENT_NAME); ProcessEvent = IoCreateNotificationEvent(&uszProcessEventString, &hProcessHandle); // 设置它为非受信状态 KeClearEvent(ProcessEvent); |
|
地板#
发布于:2007-06-28 15:32
to : xscott
我也是按着别人的思路写的,与你的例子刚好相反,是在ring3 创建的事件,大致是: 在ring3 初始化时: HANDLE hEvent = NULL; hEvent = CreateEvent(NULL,FALSE,FALSE,EVENT_FLAG); 通过 DeviceIoControl ,将 hEvent 传给ring0 . ring 0 : 通过转换获的g_pEvent 。 hEvent = *(HANDLE *)g_pInBuffer; status = ObReferenceObjectByHandle(hEvent, SYNCHRONIZE, *ExEventObjectType, KernelMode, (PVOID *)&g_pEvent, NULL ); if(!NT_SUCCESS(status)) { g_pEvent = NULL; } 然后后在回调函数中,根据情况判断,通知ring 3. KeSetEvent(g_pEvent,0,false); // 此处就蓝了。 |
|
|
地下室#
发布于:2007-06-28 15:36
我一会按你思路写一个试试 。
只是现在不知道为何一KeSetEvent 就出问题呢。 |
|
|
5楼#
发布于:2007-06-28 15:46
我一会按你思路写一下,
只是现在我不明白为何一keSetEvent 就出问题。 |
|
|
6楼#
发布于:2007-06-28 17:12
1.g_pEvent确定不为空吗
2. 是在什么级别调用的? 3.调用kesetevent时第三个参数Wait true还是fales 4.用windbg分析一下蓝屏文件,把!analyze -v的结果贴上来 |
|
7楼#
发布于:2007-06-28 17:41
谢谢 zhaock 的关注。
在 setEvent 前 对 g_pEvent 判断了。 if(g_pEvent != NULL) { KeSetEvent(g_pEvent,0,false); DbgPrint("KeSetEvent 完毕\n"); KeWaitForSingleObject(g_pEvent, Executive, KernelMode, FALSE, NULL ); DbgPrint("收到ring3 事件\n"); } } 不过现在的问题变成了执行到ring 3 处代码蓝屏了 while (!pThis->m_bExit) // 该条语句在线程中。 { WaitForSingleObject(hEvent,INFINITE); // 等待Ring 0 事件 ResetEvent(hEvent); pThis->m_FilterList.InsertItem(pThis->m_nFilterListCount,"",0); pThis->m_FilterList.SetItemText(pThis->m_nFilterListCount,0,"收到ring0信息"); ....... // 其他代码。 } WaitForSingleObject(hEvent,INFINITE); // 执行到这时,蓝屏或无限期的等待。 我继续调试一下看看。 |
|
|
8楼#
发布于:2007-06-28 18:43
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2007-06-29 17:11
问题基本弄清楚了,
驱动代码: if(g_pEvent != NULL && g_bRecvEvent) { for( i = 0; i < 1000000; i++) if(i == 1000000) { KeSetEvent((PKEVENT)g_pEvent,0,false); DbgPrint("KeSetEvent 完毕\n"); KeWaitForSingleObject(g_pEvent, Executive, KernelMode, FALSE, NULL ); // 出问题的地方 DbgPrint("收到ring3 事件\n"); } } 以上代码是在系统的回调当中,执行到KeWaitForSingleObject 蓝屏。 加入判断 KIRQL irql=KeGetCurrentIrql(); if(irql<DISPATCH_LEVEL) { DbgPrint("level less Dispath_level\n"); KeWaitForSingleObject (g_pEvent,Executive,KernelMode,0,0); } 一切正常了,但也因此,失去了我要求同步的功能,应该如何解决这个问题呢。 |
|
|
10楼#
发布于:2007-06-30 09:33
蓝屏的提示是 :
A wait operation, attach process, or yield was attempted from a DPC routine. This is an illegal operation. |
|
|
11楼#
发布于:2007-06-30 09:48
在dpc level,不能KeWaitxxx等待,这是ms的一个基本原则,另一个是不能访问分页内存.修改你的设计,不要在dpc 做等待来同步.
|
|
12楼#
发布于:2007-07-02 09:40
嗯,我好好考虑修改一下。
|
|
|