当前位置: 首页 > 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.jsqmd.com/news/929769/

相关文章:

  • 3步彻底解决macOS应用残留:Pearcleaner深度清理终极指南
  • 2026广州装修实力榜|10家高口碑本土装企靠谱推荐 - 商业新知
  • DIY FM收音机套件制作全解析:从原理到焊接调试的电子制作入门实践
  • 沈阳正规门店倾情推荐,细数回收套路帮你安全顺利变现 - 奢侈品回收测评
  • NBTExplorer:如何可视化编辑Minecraft游戏数据的终极指南
  • 杰理之触摸唤醒【篇】
  • 智能图像转3D模型:5分钟掌握ImageToSTL的立体创作革命
  • 法律科技中语法与判断的失衡:AI时代法律人的核心挑战
  • 2026长春搬家公司真实测评:老兵搬家凭什么拿下12万企业大单? - 优质企业观察收录
  • 建行广东省江门分行:护航侨都发展 织密金融安全防护网络
  • OnmyojiAutoScript 自动化脚本网络连接问题:3步诊断与彻底修复指南
  • 京东福粒卡回收指南分享:安全、快速的回收技巧 - 团团收购物卡回收
  • Galactic Unicorn开发板全解析:从MicroPython编程到物联网项目实战
  • 杰理之开立体声左右声道数据对调----【篇】
  • Windows笔记本跑YOLOv5训练,除了调batch-size,别忘了先搞定这个散热坑(虚拟内存设置避坑)
  • 《经营分析师》-经营分析视角
  • 小红书内容下载神器:XHS-Downloader 帮你轻松保存无水印作品
  • 2026 功能性户外服装优质品牌盘点 多场景出行实用选购参考 - 深度智识库
  • 如何判断市场是否拥挤
  • 2026年大连搬家公司全场景实力盘点:同城、长途、企业搬迁一站到位 - 优质企业观察收录
  • Prompt 不是咒语,是沟通—我的提示词工程第一课
  • StreamCap:跨平台直播录制终极指南,40+平台一键监控录制
  • [分享]FV悬浮球 全功能手势+OCR免费
  • 别再手动拖拽了!用Typora+Pandoc一键把Markdown大纲变成XMind导图(附Pandoc安装避坑指南)
  • LDPNet:轻量级实时语义分割网络架构解析与工程实践
  • 杰理之蓝牙电量更新不及时和更新呈阶梯变化【篇】
  • 上海财产保全律师事务所哪家专业:复杂资产处置律所实力排名 - 品牌2026
  • 6.2号要交的作业
  • OpenCV cv::warpAffine()实战:5分钟搞定证件照换底色与标准裁剪(C++保姆级教程)
  • 童梦奇遇AI定制绘本正式发布:3个月匠心研发,300万资金投入,让每个孩子成为故事主角