当前位置: 首页 > news >正文

Windows驱动与用户态程序通信机制总结

Windows驱动与用户态程序通信机制总结

IOCTL

用户态程序使用DeviceIoControl,IO管理器创建一个IRP_MJ_DEVICE_CONTROL请求发送给驱动程序,驱动程序在对应的派遣函数中进行处理。

根据缓冲区传递的方式的不同(由CTL_CODE的参数决定),又可以细分为三种类型:

1. METHOD_BUFFERED

如果指定了该参数,IO管理器会根据用户态程序提供的缓冲区长度分配内核缓冲区,并复制用户缓冲区到内核非分页池,驱动通过Irp->AssociatedIrp.SystemBuffer访问。

2. METHOD_IN_DIRECT / METHOD_OUT_DIRECT

用户缓冲区被锁定,驱动通过 Irp->MdlAddress获取 MDL 来访问物理内存。

3. METHOD_NEITHER

直接传递用户模式地址,驱动需在发起线程上下文中谨慎访问。

ReadFile/WriteFile

用户态程序通过 ReadFile和 WriteFile与驱动通信,分别对应驱动的 IRP_MJ_READ和 IRP_MJ_WRITE分发例程。

通过在创建设备时指定Flag属性,又可以将该种通信方式细分为三种:

DO_BUFFERED_IO

以缓冲区方式写设备时,操作系统将WriteFile提供的用户模式的缓冲区复制到内核模式地址下。这个地址由WriteFile创建的IRP的AssociatedIrp.SystemBuffer子域记录。

DO_DIRECT_IO

除了“缓冲区”方式读写设备外,另外一种方式是直接方式读写设备。这种方式需要创建完设备对象后,在设置设备属性的时候,设置为DO_DIRECT_IO。

直接方式读写设备,操作系统会将用户模式下的缓冲区锁住。然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区指向的是同一区域的物理内存。无论操作系统如何切换进程,内核模式地址都保持不变。

操作系统先将用户模式的地址锁定后,操作系统用内存描述符表(MDL数据结构)记录这段内存。

其他方式读写操作

在调用IoCreateDevice创建设备后,对pDevObj->Flags既不设置DO_BUFFERED_IO,也不设置DO_DIRECT_IO,此时采用的读写方式就是其他读写方式。

在使用其他方式读写设备时,派遣函数直接读写应用程序提供的缓冲区地址。在驱动程序中,直接操作应用程序的缓冲区地址是很危险的。只有驱动程序与应用程序运行在相同线程上下文的情况下,才能使用这种方式。

用其他方式读写时,ReadFile或者WriteFile提供的缓冲区内存地址,可以在派遣函数中通过IRP的pIrp->UserBuffer字段得到。读取的字节数可以从I/O堆栈中的stack->Parameters.Read.Length字段中得到。使用用户模式的内存时要格外小心,因为ReadFile有可能把空指针地址或者非法地址传递给驱动程序。因此,驱动程序使用用户模式地址。

Shared Memeory

共享内存通常结合事件(Event)​ 或信号量实现同步。应用程序创建事件对象,将句柄传递给驱动;驱动在数据就绪后设置事件状态。有两种实现方式:

驱动分配并映射

驱动调用 MmAllocatePagesForMdl或 ExAllocatePool分配非分页内存,创建 MDL,然后通过 MmMapLockedPagesSpecifyCache将其映射到用户进程地址空间。

用户态程序提供缓冲区

应用程序分配内存,将其地址和长度通过IOCTL发送给驱动,驱动通过MDL锁定并访问。

总结

除了上面提到的方式,还可以WMI、pipe、邮槽、RPC等通信方式。

http://www.zskr.cn/news/1441102.html

相关文章:

  • 沈阳正规门店倾情推荐,细数回收套路帮你安全顺利变现 - 奢侈品回收测评
  • NBTExplorer:如何可视化编辑Minecraft游戏数据的终极指南
  • 2026长春搬家公司真实测评:老兵搬家凭什么拿下12万企业大单? - 优质企业观察收录
  • Galactic Unicorn开发板全解析:从MicroPython编程到物联网项目实战
  • 《经营分析师》-经营分析视角
  • 2026 功能性户外服装优质品牌盘点 多场景出行实用选购参考 - 深度智识库
  • 2026年大连搬家公司全场景实力盘点:同城、长途、企业搬迁一站到位 - 优质企业观察收录
  • 如何判断市场是否拥挤
  • [分享]FV悬浮球 全功能手势+OCR免费
  • 显卡安装全攻略:从硬件兼容到驱动优化,避免新手常见误区
  • OpenCV cv::warpAffine()实战:5分钟搞定证件照换底色与标准裁剪(C++保姆级教程)
  • 系统提示词、开发者指令和用户输入的优先级
  • AI作为课堂“坏学生”:教育融合中的挑战与教学策略
  • TuxGuitar终极指南:免费开源吉他谱编辑软件从入门到精通
  • 5分钟快速上手:用ImageToSTL将图片变成立体3D模型的完整实用指南
  • Sora 2动作捕捉模拟的“黑箱”被拆解了:3大隐式运动先验+2类时空一致性损失函数详解
  • 2026年宁夏钢结构源头工厂全景报告:银川厂房建设与冷库工程供应商综合挑选 - 优质企业观察收录
  • 从‘韩信点兵’到‘中国剩余定理’:一个趣味算法背后的数学原理与Python代码实现
  • 如何彻底解决Windows Defender干扰:开源工具defender-control深度技术指南
  • 拆解行业套路!2026 合肥黄金回收四大商家真实测评 - 合扬奢侈品交易中心
  • 手把手教你用Gazebo仿真Livox Mid-360激光雷达(附Avia/Mid-70等型号切换教程)
  • 如何3分钟搭建B站视频解析API?bilibili-parse工具完整指南
  • 2026年钢结构源头工厂全景盘点:银川厂家直供 vs 外采,差距究竟在哪里? - 优质企业观察收录
  • 2026年宁夏钢结构源头工厂实力盘点:银川压型钢板与西北装配式建筑采购全攻略 - 优质企业观察收录
  • 2026电力检测设备维修服务商推荐:全国多区域选型指南 - 资讯快报
  • 2026降AIGC平台亲测:10款网站对比,学术合规技巧盘点
  • 基于ESP32与红外传感器的物联网门锁监控系统DIY教程
  • APM32E103功耗优化实战:如何通过精细配置时钟系统,让你的嵌入式项目续航翻倍
  • 2026年石墨纸技术哪家强?这里有你想知道的答案! - GrowthUME
  • 找工作哪个 APP 好用?实用求职软件深度对比解析 - 资讯速览