应用和驱动之间用事件通讯的办法(转载)

IoCreateNotificationEvent 同步r3和r0 r3和r0共享对象来同步 阅读详情
1. 驱动中IoCreateNotificationEvent,KeClearEvent
  应用中OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME)
  这样,只能在应用中WaitForSingleObject,而不能SetEvent,ResetEvent
  驱动中可以KeSetEvent,(而且必须紧接着KeClearEvent,因为在应用中不能修改核心态创建的对象的状态,只能在这个时候清除状态了),即只能由驱动通知应用,在某些应用只需要等待通知的场合足够了,如应用等待数据准备好的通知,这时可以在中断处理函数中设置事件有信号
  注意,OpenEvent第一个参数不能为EVENT_ALL_ACCESS,因为应用没有这么大权限操作在系统上下文创建的事件

2.在驱动中创建事件,并把时间句柄传给应用,应用不必OpenEvent。应用程序可以随意set,reset事件,这样可以和驱动中的系统线程进行同步
这种方法的前提条件是,event是在应用的进程上下文(在系统上下文创建的话就不可以)创建,并传给应用的,比如可以在某个IOCtl分支中创建事件并传给应用。
解释:在使用EVENT的PROCESS context中创的HANDLE就在这个进程的句柄表里,经检验没有权限限制,可以由应用直接使用;而在system context中创建的HANDLE当然就在SYSTEM进程里啦,若单单传句柄值给应用,而句柄表里根本就没有对应的句柄,当然不成功了。

代码如下
驱动中:
void ppppp(PVOID event)
{
KeWaitForSingleObject((PKEVENT)event,Executive,UserMode,0,0);
//......验证处
}
......
WCHAR wEventNameBuf[]=L"//BaseNamedObjects//SharedEvent";
UNICODE_STRING uEventName;
PKEVENT pEvent;
HANDLE hEvent,hThread;
......
case IOCTL_******:
RtlInitUnicodeString(&uEventName,wEventNameBuf);
pEvent = IoCreateNotificationEvent(&uEventName,&hEvent);
KeResetEvent(pEvent);
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&hEvent,4);
PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,0,0,0,ppppp,pEvent);


应用中:
if(!DeviceIoControl(hDevice,IOCTL_******,0,0,&Handle,4,&Bytes,0))
MessageBox("DeviceIo Error!");
esle{
wsprintf(str,"%x,%x,%x",hDevice,Bytes,Handle);
MessageBox(str);
if(!SetEvent((HANDLE)Handle))
......
}
会看到,点击MessageBox OK后ppppp的确继续执行了。

3.在应用中创建事件,然后通过ioctl传给驱动,驱动中ObReferenceObjectByHandle来引用该事件对象。
这样应用和驱动中都可以检查和修改事件状态。
应用程序:
HANDLE m_hCommEvent = CreateEvent(NULL,
                      false,
                      false,
                      NULL);
// download event object to device driver,
// m_hCommDevice is the device object

DeviceIoControl(m_hCommDevice,
          IO_REFERENCE_EVENT,
          (LPVOID) m_hCommEvent,
          0,
          NULL,
          0,
          dwReturn,
          NULL);
在需要的地方等待
while(true)
{
  WaitForSingleObject(m_hCommEvent, INFINITE);
  // After this function, the event is set to
  // non signaled. Get information and deal with it.
}

驱动程序:
case IO_REFERENCE_EVENT:
hEvent = (HANDLE) irpStack->
    Parameters.DeviceIoControl.Type3InputBuffer;

status = ObReferenceObjectByHandle(hEvent,
                        GENERIC_ALL,
                        NULL,
                        KernelMode,
                        &gpEventObject,
                        &objHandleInfo);
the gpEventObject is a PRKEVENT object, so we can use KeEventXXX and KeWaitForXXX to operate it.
当事件发生时,置信号
KeSetEvent(gpEventObject, 0, FALSE);
当不再需要事件对象时:
case IO_DEREFERENCE_EVENT:
if(gpEventObject)
    ObDereferenceObject(gpEventObject);

微服务【同步和异步通讯详解】第6章 同步通讯和异步通讯介绍 阅读详情

相关推荐

在unity urp项目中 通过图片创建材质(透明光晕)

unity中通过图片创造材质(urp管道)

m0_49721415的博客 1541

Ring3与Ring0通信方法若干

本人在[(原创)应用程序与驱动通信的若干方式]文章中阐述了,上下层通信的技术实现部分,但没有结合应用,下面的文章就具体应用给大家展示了使用方法,希望能够大家一些启发。               Ring3与Ring0同步是很有用的手段,在此做一个简要的整理,希望对开发这方面程序的朋友有帮助,好了,开始吧。          1 同步的策略          初写驱动的朋友都知道,通过Dev

2220

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7488

驱动事件对象

事件对象 驱动程序可以使用一个事件对象挂起当前线程等待直到底下一层驱动程序处理一个等待者驱动程序建立的IRP。 拥有驱动创建的线程的驱动程序,或者在一个同步IO请求的completion例程上等待的驱动派遣例程同样可以使用一个事件对象在他们的线程和(或)其他驱动例程之间同步操作。 这一章包含以下主题: 定义和使用一个事件对象 标准事件对象 定义和使用一个事件对象 任何使用一个事

死胖子的博客 1290

海思Hi3516平台集成IMX214 Sensor实战:从I2C调试到VI通路构建

本文详细记录了在海思Hi3516平台上集成索尼IMX214图像传感器的完整实战过程。从硬件I2C通讯调试、驱动层适配,到上层VI通路构建与ISP配置,提供了系统性的排查步骤与代码修改要点,旨在帮助开发者快速打通从Sensor到屏幕的完整视频采集链路,解决集成过程中的常见问题。

tcp8optimizer的博客 597

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

Windows驱动 - 事件

0x00 函数 KeWaitForSingleObject将当前线程置于等待状态,直到给定的Dispatcher对象被设置为一个信号状态,或者(可选)直到等待超时。 PsCreateSystemThread 创建一个以内核模式执行并返回线程句柄的系统线程。 PsTerminateSystemThread 终止当前系统线程。 ZwClose关闭一个对象句柄。 KeInitializeEvent 将事件对象初始化为同步(单个侍者)或通知类型事件,并将其设置为已发出信号或未发出信号的状态。 KeS..

qq726232111的博客 859

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 416

IoCreateNotificationEvent 中文翻译

IoCreateNotificationEvent 该例程创建或者打开一个命名的通知事件用于通知一个或多个线程一个事件已经发生. PKEVENT  IoCreateNotificationEvent( IN PUNICODE_STRING EventName,   指向一个以NULL结尾的UNICODE字符串,该字符串包含事件的名称 OUT PHANDLE EventHandle

cosseen的专栏 1552

PaddleOCR 与 PaddleX 调试

本文介绍了PaddleOCR与PaddleX的安装调试过程及应用对比。首先详细说明了环境准备步骤,包括安装ccache、设置环境变量及创建conda虚拟环境,提供了精简安装和源码安装两种方式。接着展示了使用PaddleOCR进行发票和手写汉字识别的测试结果,指出部分手写识别存在误差。随后对比了两者的差异:PaddleOCR专注于OCR算法优化,PaddleX则提供全流程工具链和标准化部署方案。最后演示了如何通过PaddleX部署OCR服务,包括API启动方法和客户端调用示例,为开发者提供了两种不同场景下的O

weixin_42176639的博客 1452

遥感影像建筑物变化检测

遥感影像建筑物变化检测

yilvyangguang520的博客 423

(转载)总结应用和驱动之间用事件通讯的办法

总结应用和驱动之间用事件通讯的办法 1. 驱动中IoCreateNotificationEvent,KeClearEvent    应用中OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME)    这样,只能在应用中WaitForSingleObject,而不能SetEvent,ResetEvent    驱动中可以KeSetEvent,(而且必须紧接着KeClear

Sodier的专栏 1975

手把手教你学simulink(57.3)--电励磁同步电动机场景示例:基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论需求分析电励磁同步电动机(Electr

MHD0815的博客 505

驱动程序和应用程序之间通信(ForWinCE)(转载)

WinCE上驱动程序的模型相对比较简单,实现一个驱动程序不是什么难事。尽管如此,本文还是实现了一个比较通用一点的通讯接口。应用程序发给信息驱动程序有两种方式,同步调用和异步调用。同步调用能够让驱动程序立即处理应用程序的请求,并返回驱动程序处理后的结果。如:#define MSG_TYPE_TEST_1            0x00000000#define MSG_TYPE_ICMP_PACKE

IT强哥的专栏 2842

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

**事件驱动编程中的发散创新**在软件开发的众多技术中,事件驱动编程是一种核心思想,它广泛应用于各种编程语言和框架中。

事件驱动编程中的发散创新在软件开发的众多技术中,事件驱动编程是一种核心思想,它广泛应用于各种编程语言和框架中。本文将探讨事件驱动编程的基本概念,并结合实际案例展示如何在实践中发散创新。一、事件驱动编程概述事件驱动编程是一种基于事件的编程模式,其核心思想是将程序的控制流程与事件相关联。当某个事件发生时,程序会调用相应的处理函数或方法,从而执行相应的操作。这种编程模式使得代码更加模块化、易于维护和扩展。二、事件驱动编程的优势在事件驱动编程中,我们可以通过以下几个方面来发散创新:自定义事件的创建与使用 在事件驱动

2501_92227435的博客 444

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

《领域驱动设计之php实现》- 领域事件【转载】

软件事件即系统中其它组件感兴趣的事物。PHP 程序员工作中普遍不使用事件,因为这不是该语言的特性。不过,现在更常见的是,新的框架和库采用它们来提供一种新的解耦,重用和加速代码的途径。 领域事件是领域发生改变时相关的事件。领域事件即发生在领域内的事件,是领域专家所关心的。 在领域驱动设计中,领域事件是基础构建块,它们可以: 与其它界限上下文通讯 提高性能和可扩展性,推进最终一致性 作为历史归档记录 领域事件的本质是异步通信。有关此主题的详细信息,我们推荐 Gregor Hohpe 和 Bobby Wool

tiway的博客 436

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《领域驱动设计之php实现》- 服务【转载】

软件事件即系统中其它组件感兴趣的事物。PHP 程序员工作中普遍不使用事件,因为这不是该语言的特性。不过,现在更常见的是,新的框架和库采用它们来提供一种新的解耦,重用和加速代码的途径。 领域事件是领域发生改变时相关的事件。领域事件即发生在领域内的事件,是领域专家所关心的。 在领域驱动设计中,领域事件是基础构建块,它们可以: 与其它界限上下文通讯 提高性能和可扩展性,推进最终一致性 作为历史归档记录 领域事件的本质是异步通信。有关此主题的详细信息,我们推荐 Gregor Hohpe 和 Bobby Wool

tiway的博客 395

Android 组件间通信--事件驱动

在android中,组件间通信常用的方式: 1、使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可 例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化。当点击菜单时发送广播通知容器变化显示的Fragment 2、使用接口方式:activity实现特定的接口,在子类或者Fragment中...

aaronyan1990的博客 199

Android应用模块之间通信模式

Android应用程序开发中通常需要多个模块进行通信(相互调用),如果不注意避免耦合,未来功能扩展以及调整会使得代码十分混乱,容易发生错误,并且维护困难。例如,Fragment直接通过(MainActivity)getActivity()的方式来使用其公共成员方法,Fragment和MainActivity之间紧耦合。 1 public class FragmentPage{ 2...

weixin_30561425的博客 540

内核事件KEVENT(同步)

转载请您注明出处:http://www.cnblogs.com/lsh123/p/7358702.html   一.驱动程序与驱动程序的事件交互    IoCreateNotificationEvent ———> IoCreateNotificationEvent      在内核驱动中可以通过给某个内核对象创建一个命名对象,然后在另一个驱动中通过名字来获取这个对象,然后操作它来实现两个驱

dadahahaha的博客 448

【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明...

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1 通讯机制说明 通讯的总体机制采用呼叫应答方式,就是上位机软件主动发送请求数据命令,下位机终端接收到命令后,并校验成功,返回相应的数据。 (1)串口通讯机制包括:轮询模式。 串口总线涉及到一对一的通讯、一对多的通讯,为了避免总线上数据的冲突问题以及环境干扰的问题,...

weixin_30568591的博客 295

[转载]微服务实践(五):微服务的事件驱动数据管理

【编者的话】本文是使用微服务创建应用系列的第五篇文章。第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点;第二和第三篇描述了微服务架构模块间通讯的不同方面;第四篇研究了服务发现中的问题。本篇中,我们从另外一个角度研究一下微服务架构带来的分布式数据管理问题。 微服务和分布式数...

chuanwan9049的博客 132

转载:CAN知识

作者:柏拉凃 链接:https://www.zhihu.com/question/35630289/answer/650086824 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1 有汽车电子工程师的地方就有CAN 智能网联汽车的浪潮席卷了全球背景下,大数据、云平台、人工智能、自动驾驶...早已成为汽车电子从业者耳熟能详的词汇。然而,诞生于1986 年的CAN总线技术却是经久不衰,生机勃勃。可以预见的是,在未来很长一段时间内CAN总线还是车载网络的主力军之一。 .

gonggong11qqqww的博客 2662

使用SerialPort类设计串口通讯程序 (VS2005)[转载]

一.概述在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在Microsoft.Net技术广泛应用的今天,Visual Studio.Net没有将此控件加入控件库,所以人们采用了许多方法在Visual Stud

在水一方 1955

【转】WF事件驱动

转自:http://www.cnblogs.com/Mayvar/category/315963.html 这系统的教程有代码可以下载 WF事件驱动(5) 摘要: 之前,我通过4篇文章介绍了在WF4中开发基于事件的工作流的范例。请参考下面的链接。 这一篇是这个系列的最后一篇,介绍如何通过配置文件,而不是代码的方式启动宿主。这在现实工作中是相当有用的,请大家参考下面的实例。【注意】有朋友也...

weixin_34258782的博客 238
上一篇: 零拷贝技术研究与实现
下一篇: 内核级HOOK要走到头了吗?Patching the kernel for x64-Based Systems
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值