Windows驱动程序之IRP的域及结构域
每个IRP可以被看成由两部分组成: 固定部分和一个I/O堆栈。IRP的固定部分包含关于请求的信息, I/O堆栈则包含一系列I/O堆栈单元(I/O Stack location), 单元的数目应与驱动程序堆栈中处理这一请求的驱动程序数目相同, 每个单元对应一个将处理该IRP的驱动程序。
Windows驱动程序之IRP固定部分的域
什么是IRP?Windows驱动程序IRP指什么?
- MdlAddress(Memory Descriptor List, MDL): 指向一个内存描述表。当驱动程序使用直接I/O时, MDL用来描述一个与该请求相关联的用户模式缓冲区
- AssociatedIrp: 该域是一个三指针联合, 其中与WDM驱动程序相关的指针是AssociatedIrp.SystemBuffer。如果设备执行缓冲I/O, 则SystemBuffer指针指向系统空间缓冲区, 否则为NULL。
- RequestorMode: 取值为一个枚举常量UserMode或KernelMode, 指定请求初始化的模式为用户模式还是核心模式。驱动程序有时需要查看这个值来决定是否需要信任某些参数
- Cancel: 该域为BOOLEAN类型。如果为TRUE, 则表明IoCancelIrp已被调用, 该函数用于取消这个请求。如果为FALSE, 则表明没有调用IoCancelIrp函数。
- CancelIrql: 一个IRQL(I/O Request Query Level)值, 表明那个专用的取消自旋锁是在这个IRQL上获取的。当驱动程序在取消例程中释放自旋锁时应该参考这个域。
- CancelRoutine: 指向驱动程序取消例程的地址。应该使用IoSetCancelRoutine函数设置CancelRoutine域而不是直接修改该域
Windows驱动程序之IRP堆栈单元中的域
任何内核模式程序在创建一个IRP时, 同时还创建了一个与之关联的I/O堆栈。堆栈中的I/O堆栈单元由IO_STACK_LOCATION结构定义, 每个堆栈单元都对应一个将处理的IRP的驱动程序。
为了在一个给定的IRP中确定当前的IRP I/O堆栈单元, 驱动程序可以调用IoGetCurrentIrpStackLocation函数, 该函数返回当前I/O堆栈单元的指针。
- MajorFunction: 该IRP的主要功能代码, 它指出所要执行的I/O操作类型。例如: 主功能代码IRP_MJ_READ表示通过Win32 API函数“Create File”发送的请求。主功能代码与驱动程序对像的MajorFunction表中的某个分发函数指针相对应。
- MinorFunction: 该IRP的副功能代码, 它进一步指出该IRP属于哪个主功能类。例如: IRP_MJ_PNP请求有十几个副功能代码, 包括IRP_MN_START_DEVICE、IRP_MN_REMOVE_DEVICE等。
- DeviceObject: 指向该堆栈单元对应的设备对象地址, 该域由IoCallDriver函数负责填写。
- FileObject: 指向与一个I/O请求有关的文件对象地址。
Windows驱动程序之部分IRP首部结构域
------------------------------------------------
域 描述
------------------------------------------------
- IO_STATUS_BLOCK IoStatus IRP的完成状态
- PVOID AssociatedIrp.SystemBuffer 系统空间缓冲区(用于缓冲I/O)
- BOOLEAN Cancel 设置IRP是否已经被取消
- ULONG Flags IRP标志
------------------------------------------------
I/O功能代码
- IRP_MJ_CREATE: 打开设备 “Create File”
- IRP_MJ_CLEANUP: 在关闭设备时, 取消挂起的I/O请求 CloseHandle
- IRP_MJ_CLOSE: 关闭设备 CloseHandle
- IRP_MJ_READ: 从设备获得数据 “Read File”
- IRP_MJ_WRITE: 向设备发送数据 ”Write File“
- IRP_MJ_DEVICE_CONTROL: 对用户模式或内核模式客户可用的控制操作 DeviceControl
- IRP_MJ_INTERNAL_DEVICE_CONTROL: 只对内核模式客户程序可用的控制操作 没有对应的Win32 API
- IRP_MJ_QUERY_INFORMATION: 得到文件的长度 GetFileLength
- IRP_MJ_SET_INFORMATION: 设置文件的长度 SetFileLength
- IRP_MJ_FLUSH_BUFFERS: 写输出缓冲区或丢弃输入缓冲区 FlushFileBuffers FlushConsoleInputBuffer PureComm
- IRP_MJ_SHUTDOWN: 系统关闭 InitialSystemShutdown
版权声明:
作者:驱动外包
链接:http://www.51qudong.net/28.html
来源:算法优化_驱动外包_直播算法优化_MAC驱动开发_Linux驱动开发_usb驱动移植外包
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论