Event事件处理(Ring3到Ring0, Ring0到Ring3)

1.Ring3到Ring0 Event的处理

用户层创建Event:

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    //手动复位, 初始无法信号

用户层等待Event:

WaitForSingleObject(hEvent, INFINITE);

用户层向内核层传入Event:

DWORD ret_length = 0;
DeviceIoControl(
        hDevice,        //已经打开的Driver设备
        IOCTL_SET_EVENT,//自定义
        &hEvent,
        sizeof(hEvent),
        NULL,
        0,
        &ret_length,
        NULL);

内核层获得用户层传入Event:

HANDLE hUserEvent = NULL;
PKEVENT pEvent = NULL;

//
对应的派遣函数 NTSTATUS DDKDispatchDvCtl ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { ... case IOCTL_SET_EVENT: //把传递进来的用户层等待事件取出来   hUserEvent = *(HANDLE *)pIrp->AssociatedIrp.SystemBuffer; //将用户层事件转化为内核等待对象, pEvent即所得 status = ObReferenceObjectByHandle(hUserEvent, EVENT_MODIFY_STATE, *ExEventObjectType, KernelMode, (PVOID*)&pEvent, NULL); ObDereferenceObject(pEvent); break; ... }

内核层设置Event 有信号:

KeSetEvent(pEvent, IO_NO_INCREMENT, FALSE);

内核导设置Event 无信号:

KeResetEvent(pEvent);

 

2.Ring0到Ring3 Event的处理

内核层创建Event :

WCHAR wEventName[]=L"\\BaseNamedObjects\\SharedEvent"; 
UNICODE_STRING uEventName;
HANDLE hEvent;
PKEVENT hyevent;

RtlInitUnicodeString(&uEventName,wEventName);
hyevent=IoCreateNotificationEvent(&uEventName,&hEvent);

KEVENT event;
KeInitializeEvent(  
        &event,  
        SynchronizationEvent,//SynchronizationEvent为同步事件  
        FALSE//  当是TRUE 时初始化事件是有信号状态.,当是FALSE时初始化事件是没信号状态,如果此处为TRUE,则为有信号状态,KeWaitForSingleObject会直接通过,此时需要调用KeResetEvent来设置为无信号  
        );  

内核层等待 Event:

//等待信号  
KeWaitForSingleObject (   
    &event,//可以为 时间  信号,线程,时钟,互斥对象  
    Executive,//等待  
    KernelMode ,
    FALSE,//模式为KernelMode时,最好设置为FALSE
    0
    );

用户层获取内核层 Event:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS,False,L"\\BaseNamedObjects\\SharedEvent");

用户层设置Event 有信号:

SetEvent(hEvent);

用户层设置Event 无信号:

ReSetEvent(hEvent);

 

posted @ 2015-01-22 22:52  银河彼岸  阅读(510)  评论(0编辑  收藏  举报