关闭

IRP与派遣函数

标签: IRP 派遣函数
443人阅读 评论(0) 收藏 举报
分类:

1.派遣函数是WINDOWS驱动程序中的重要概念。驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求时在派遣函数中处理的。


2.用户模式下所有驱动程序的I/O请求,全部由操作系统化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同的派遣函数(Dispatch Functin )中,这也是派遣函数名字的由来。


3.IRP的处理机制类似Windows应用程序的“消息处理”机制,驱动程序接收到不同的类型的IRP后,会进入不同的派遣函数,在派遣函数中IRP得到处理。


4.IRP是一个很复杂的数据结构,IRP两个基本的属性,一个是MajorFunction,另一个是MinorFunction,分别记录IRP的主类型和子类型。操作系统根据MajorFunction将IRP“派遣”到不同的派遣函数中,在派遣函数中还可以这个IRP属于哪种MinorFunction


5.DriverEntry有个函数指针数组MajorFunction.都是派遣函数地址。对于没有设置IRP类型,系统默认这些IRP类型与_IopInvalidDeviceRequest函数关联。还有些IRP是由系统的某个组件创建的。


6.下表列出了IRP的类型,并对其产生的来源做了说明。


7.应用程序和驱动程序有3中通信方式
1.DO_BUFFER_IO
2.DO_DIRECT_IO
3.其他
8.在使用第3种读写设备时,派遣函数直接读写应用程序提供的缓冲区地址。ReadFile,WriteFile提供的缓冲区内存地址,可以在派遣函数中通过IRP的UserBuffer字段得到。


9.除了用ReadFile和WriteFile以外,应用程序还可以通过另外一个DeviceIoControl操作设备。DeviceIoControl内部会使用操作系统创建IRP_MJ_DEVICE_CONTROL类型的IRP,然后操作系统会将这个IRP转发到派遣函数中。它可以让应用程序和驱动程序进行通信。
10.通信必备参数:输入,输出地址,MDL结构(直接)


11.IO_STACK_LOCATION  即I/O堆栈,这个数据结构和IRP紧密相连。当IRP可能在设备栈中转发多次,为了记录IRP在每层设备中做的操作,IRP会有个IO_STACK_LOCATION数组。每个IO_STACK_LOCATION元素记录着对应设备中做的操作。对于本层可以通过IoGetCurrentIrpStackLocation函数得到。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38841次
    • 积分:919
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:23篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论