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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)