IRP详解(1)----请求类型

    常见的 I/O请求的类型一般有如下几种:create, close, read, write, 以及I/O control。


1:Create请求

    我们知道,应用程序在打开一个文件或者设备时,一般会调用CreateFile这个API,告知系统我将要打开一个文件,接下来I/O管理器将创建一个文件对象并将发送一个创建请求  给目标设备,WDF收到该创建请求后将创建一个与I/O管理器的文件对象相对应的WDF文件对象。


2:Clearup和Close请求

    上层应用程序关闭文件或者设备句柄一般是通过调用CloseHandle这个API来实现的,每调用一次该API,I/O管理器就将该文件对象的句柄计数减去1,当句柄计数变成0时(即该文件对象的所有句柄都关闭),I/O管理器将发送一个Clearup请求给驱动程序,驱动程序应该取消所有该文件对象的未完成I/O请求。当该对象的引用计数值等于0时,I/O管理器发送一个Close请求给驱动程序来完成设备的关闭。


3:Read和Write请求

     读写请求很好理解,我们的上层程序调用ReadFile, WriteFile 这两个API时,I/O管理器将分别向驱动程序发送读请求和写请求。与以上两中请求所不同的是,读写请求里都包含一个缓冲区来存放读回或者写入的数据。


4:Devive I/O Control请求

     有时候,我们需要对设备进行一些既不是读也不是写的操作,这时候就需要用到Devive I/O Control请求了,上层应用程序调用DeviceIoControl这个API时,将会向驱动发起该请求。我们可以通过定义不同的I/O控制代码来实现不同的操作。


        除了以上总结的这5中请求类型外,还有一些其他的IRP类型,如针对即插即用的请求,电源管理的请求等,详细可以参考MSDN里的文档,这里就不一一解释了。简单的把IRP类型罗列如下:

IRP major function 代码
IRP_MJ_CLEANUP
IRP_MJ_CLOSE
IRP_MJ_CREATE
IRP_MJ_DEVICE_CONTROL
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_PNP
IRP_MJ_POWER
IRP_MJ_READ
IRP_MJ_SHUTDOWN
IRP_MJ_SYSTEM_CONTROL
IRP_MJ_WRITE

你可能感兴趣的:(IRP详解(1)----请求类型)