troylees
驱动牛犊
驱动牛犊
  • 注册日期2006-05-10
  • 最后登录2009-05-01
  • 粉丝0
  • 关注0
  • 积分678分
  • 威望128点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
阅读:986回复:0

请教:双事件对象通知的问题!!

楼主#
更多 发布于:2007-03-12 20:23
  我在应用程序中和驱动中各创建一个事件对象。然后在应用程序中创建新线程并阻塞等待驱动置位事件,驱动置位事件后,则转入阻塞等待。具体代码如下:

应用程序中:
unsigned ThreadId;    
DWORD BytesReturned;

//获得设备句柄  
hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
//创建共享事件    
hShareE = CreateEvent(NULL,TRUE,FALSE,NULL);
//传递创建共享事件的I/O控制代码  
DeviceIoControl(hDevice,SHARE_EVENT_CRT,&hShareE,4,NULL,0,&BytesReturned,NULL);
//创建新线程                    
_beginthreadex(NULL,0,&ppppp,(void*)hShareE,0,&ThreadId);
                    
新线程中:
unsigned __stdcall ppppp(void*(hShareE))
{  
    while(1)
    {
            //阻塞等待
        WaitForSingleObject((HANDLE) hShareE,INFINITE);
            //通知用户
        ::MessageBox(NULL,"Event Set!",NULL,MB_OK);
            ResetEvent((HANDLE) hShareE);
     }

   _endthreadex(0);
    return 0;
}

驱动中:
//共享事件
WCHAR wEventNameBuf[]=L"\\BaseNamedObjects\\SharedEvent";
UNICODE_STRING uEventName;
PKEVENT pEventApp,pEventDrv;
HANDLE hEventDrv,hEventApp;
//互斥对象
KMUTEX    H_FuncMutex;

//共享事件创建  
case SHARE_EVENT_CRT:  
                              
RtlCopyMemory(&hEventApp,pIrp->AssociatedIrp.SystemBuffer,4);
//从应用事件句柄获取事件指针
ObReferenceObjectByHandle(hEventApp,EVENT_MODIFY_STATE,*ExEventObjectType,pIrp->RequestorMode,(PVOID*) &pEventApp,NULL);
                            
//驱动事件创建                  
RtlInitUnicodeString(&uEventName,wEventNameBuf);                            
pEventDrv = IoCreateNotificationEvent(&uEventName,&hEventDrv);
if(pEventDrv != NULL)
      KeClearEvent(pEventDrv);
break;  

驱动中的hook函数:
//互斥进入临界区
KeWaitForMutexObject(&H_FuncMutex,Executive,KernelMode,FALSE,NULL);
//置位事件通知应用程序
KeSetEvent(pEventApp, IO_NO_INCREMENT, FALSE);

//阻塞等待
KeWaitForSingleObject((PKEVENT)pEventDrv,Executive,UserMode,0,0);
KeClearEvent(pEventDrv);  
    
//退出临界区
KeReleaseMutex(&H_FuncMutex,FALSE);


可是现在的问题是:在驱动中的hook函数里KeSetEvent成功了,但是在等待的新线程却没有反应,我强行置位,让hook函数继续执行下去,则如此经过3次之后,线程才被唤醒。如果把驱动中的hook函数里面的
//阻塞等待
KeWaitForSingleObject((PKEVENT)pEventDrv,Executive,UserMode,0,0);
KeClearEvent(pEventDrv);  
注释掉的话,则是完全没有问题的,线程可以正常唤醒。。。。

请大家帮帮忙,帮我看看出了什么问题吧,或者给我个思路也行,谢谢了!!!
游客

返回顶部