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

 

转载于:https://www.cnblogs.com/DreamOfGalaxy/articles/4242920.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值