3.在应用中创建事件,然后通过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: if(gpEventObject) ObDereferenceObject(gpEventObject);