IRP与派遣函数

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的类型,并对其产生的来源做了说明。

IRP与派遣函数_第1张图片

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函数得到。

你可能感兴趣的:(内核)