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 @   银河彼岸  阅读(525)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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)
点击右上角即可分享
微信分享提示