阅读:1032回复:0
请教:双事件对象通知的问题!!
我在应用程序中和驱动中各创建一个事件对象。然后在应用程序中创建新线程并阻塞等待驱动置位事件,驱动置位事件后,则转入阻塞等待。具体代码如下:
应用程序中: 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); 注释掉的话,则是完全没有问题的,线程可以正常唤醒。。。。 请大家帮帮忙,帮我看看出了什么问题吧,或者给我个思路也行,谢谢了!!! |
|