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);