upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3011回复:12

驱动程序与应用程序之间的事件同步

楼主#
更多 发布于:2007-06-27 15:13
各位达人,是否有驱动与应用层事件同步的资料,共享内存的也行。
还有,如果在驱动程序中,在回调函数中进行事件的waitforsingleobject ,setevent 等操作是否会有稳定性问题。
烦了,不想搞了?
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-06-28 14:45
    在回调中做waitforsingleobject ,setevent 立刻蓝脸。
懂朋友的留步啊,如何做到驱动与应用程序同步交互呢。


 
烦了,不想搞了?
xscott
驱动牛犊
驱动牛犊
  • 注册日期2007-06-26
  • 最后登录2010-05-17
  • 粉丝0
  • 关注0
  • 积分151分
  • 威望17点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
板凳#
发布于: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);
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于: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);       // 此处就蓝了。

  
    
 
烦了,不想搞了?
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-06-28 15:36
我一会按你思路写一个试试 。
只是现在不知道为何一KeSetEvent  就出问题呢。
烦了,不想搞了?
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-06-28 15:46
我一会按你思路写一下,
只是现在我不明白为何一keSetEvent 就出问题。
烦了,不想搞了?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-06-28 17:12
1.g_pEvent确定不为空吗
2. 是在什么级别调用的?
3.调用kesetevent时第三个参数Wait true还是fales
4.用windbg分析一下蓝屏文件,把!analyze -v的结果贴上来
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
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);  // 执行到这时,蓝屏或无限期的等待。

我继续调试一下看看。
烦了,不想搞了?
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
8楼#
发布于:2007-06-28 18:43
用户被禁言,该主题自动屏蔽!
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
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);
            }

一切正常了,但也因此,失去了我要求同步的功能,应该如何解决这个问题呢。
烦了,不想搞了?
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分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.
烦了,不想搞了?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-06-30 09:48
在dpc level,不能KeWaitxxx等待,这是ms的一个基本原则,另一个是不能访问分页内存.修改你的设计,不要在dpc 做等待来同步.
upjonny
驱动牛犊
驱动牛犊
  • 注册日期2005-10-17
  • 最后登录2019-04-30
  • 粉丝0
  • 关注0
  • 积分318分
  • 威望53点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-07-02 09:40
嗯,我好好考虑修改一下。
烦了,不想搞了?
游客

返回顶部