您的位置:首页 > 职场人生

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

2010-10-26 21:09 585 查看
在应用中创建事件,然后通过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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息