IRP数据的传输方式,对应彭荣
来源:互联网 发布:乐视手机移动网络设置 编辑:程序博客网 时间:2024/05/18 01:18
Windows 操作系统家族支持三种数据传输机制:
对于标准的IO 请求,例如IRP_MJ_READ和IRP_MJ_WRITE,由驱动在设备刚创建后,马上通过修改DeviceObject->Flags域的值来指定支持那一种传输机制。
缓存IO
为了以缓存IO 的方式接收读、写的请求,驱动会在初始化时在DeviceObject->Flags域上设置DO_BUFFERED_IO标志。当驱动收到了一个缓存IO的请求,在特定的Irp->AssociatedIrp.SystemBuffer域中会放有驱动应该操作的内核模式缓冲区的地址。IO管理
器在进行读请求时将数据由内核模式缓冲区拷贝到用户模式缓冲区,或者在进行写请求时从用户模式缓冲区向内核模式缓冲区拷贝数据。
直接IO
为了以直接IO的方式接收读、写请求,驱动会在初始化时在DeviceObject->Flags域上设置DO_DIRECT_IO标志。当驱动接收到一个直接IO请求,特定的Irp->MdlAddress域中会放有一个用来描述请求缓冲区的MDL的地址。这个MDL 列出了缓冲区的虚拟地址和尺寸,连同相应缓冲区中的物理页表(physical pages)。IO管理器会在将请求发送给驱动之前锁定这些物理页,并在(请求)完成的过程中解锁。驱动千万不能使用MDL中列举的用户模式缓冲区地址,而必须通过调用MmGetSystemAddressForMdl
非缓存非直接IO
为了接收非缓存非直接IO的方式的请求,驱动初始化时在DeviceObject->Flags 域上既不设置DO_BUFFERED_IO标志,也不设置DO_DIRECT_IO 标志。当驱动接收到这样的请求,相应的Irp->UserBuffer域会放有附属于这个请求的数据地址。因为这个缓冲区在用户地址空间上,驱动程序必须在用之前使相应的地址合法化。驱动程序在try/except块里调用ProbeForRead 或者ProbeForWrite函数来合法化特定的指针。驱动还必须完全在try/except块里处理所有对这一缓冲区的访问。
另外,驱动还必须在应用(manipulating)数据之前将它拷贝到池(thepool)或堆栈里一个安全的内核模式地址。将数据拷贝到内核模式缓冲区确保了用户模式的调用者不会在驱动已经合法化数据之后再修改它。
1.MmProbeAndLockPages并不将物理页面映射到内核地址空间,而仅锁定物理页面;MappedSystemVa的变化可以显示这一点
2.buf的地址=StartVa+ByteOffset;
3.MmGetSystemAddressForMdlSafe进行实际的映射操作,并设置MdlFlags的MDL_MAPPED_TO_SYSTEM_VA标志。
- IRP数据的传输方式,对应彭荣
- 数据的获取 (IRP) 7.2
- 数据的传输方式及数据接收
- 不同的方式处理 IRP 速查表
- 创建IRP的四种不同方式
- 创建IRP的四种不同方式
- 缓冲区方式与IRP的关系
- 上行传输对应的HARQ
- 两个apk之间对应传输数据
- 三种DBus传输数据的方式的比较
- Http chunk方式传输数据
- 使用GZIP压缩的方式向客户端传输响应数据
- C#网络编程,传输数据的3种方式
- C#网络编程,传输数据的3种方式
- 传感器数据上传至云端的主要传输方式
- Mybatis按顺序查询出对应的数据字段方式
- 基于I/O请求包(IRP)的工作方式
- https的传输方式
- Oralce:远程连接数据库ORA-12638
- JSON 教程
- UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
- spring boot中使用JdbcTemplate
- 用Android写注册界面
- IRP数据的传输方式,对应彭荣
- Python时间序列LSTM预测系列教程(2)-单变量
- django学习(二)之分页、vue.js数据绑定及模态对话框的使用
- python相关的安装指南
- Mariadb安装
- Spring之WebSocket网页聊天以及服务器推送
- 数学建模(9)——霍夫(Hough)变换圆检测
- HDU1950[Bridging signals] LIS模型 (nlogn)
- java进阶书籍推荐(不包括基础)