驱动层与应用层共享事件方法

在应用中创建事件,然后通过ioctl传给驱动,驱动中ObReferenceObjectByHandle来引用该事件对象。  
这样应用和驱动中都可以检查和修改事件状态。  
应用程序 创建事件  把句柄传输给驱动:  
HANDLE   m_hCommEvent   =   CreateEvent(NULL,  
                                                                    false,  
                                                                    false,  
                                                                    NULL);  
//   download   event   object   to   device   driver,  
//   m_hCommDevice   is   the   device   object  

DeviceIoControl(m_hCommDevice,  
                                IO_REFERENCE_EVENT,  
                                (LPVOID)   m_hCommEvent,  
                                0,  
                                NULL,  
                                0,  
                                dwReturn,  
                                NULL);  
应用层使用方法  在需要的地方等待  
while(true)  
{  
      WaitForSingleObject(m_hCommEvent,   INFINITE);  
      //   After   this   function,   the   event   is   set   to  
      //   non   signaled.   Get   information   and   deal   with   it.  
}  

驱动层程序:  
case   IO_REFERENCE_EVENT:           取得事件对象
    hEvent   =   (HANDLE)   irpStack->  
              Parameters.DeviceIoControl.Type3InputBuffer;  

    status   =   ObReferenceObjectByHandle(hEvent,  
                                                                          GENERIC_ALL,  
                                                                          NULL,  
                                                                          KernelMode,  
                                                                          &gpEventObject,  
                                                                          &objHandleInfo);  
the   gpEventObject   is   a   PRKEVENT   object,   so   we   can   use   KeEventXXX   and   KeWaitForXXX   to   operate   it.  
当事件发生时,置信号  
KeSetEvent(gpEventObject,   0,   FALSE);  
当不再需要事件对象时:  
case   IO_DEREFERENCE_EVENT:       free事件对象
    if(gpEventObject)  
            ObDereferenceObject(gpEventObject);

你可能感兴趣的:(职场,休闲,应用层,全局事件,驱动层)