2024年3月14日发(作者:)

DeviceIoControl解读

时间:2011-4-30 9:59:17 点击:109

设备驱动程序可以被当作内核模式函数包来看待,I/O控制代码就是用来指定访问其

中的哪个函数的。DeviceIoControl函数的dwIoControlCode参数就是这个代码,它指

出了我们需要进行的操作,以及如何进行操作。

控制代码是32位数字型常量,可以CTL_CODE宏来定义,它们定义在

和文件中。

控制代码中各数据位字段的含义如下:

◎ DeviceType--设备类型(16bit)指出了设备的类型,微软保留了0-7FFFh的取

值,剩下的8000h-0FFFFh供开发商定义新的内核模式驱动程序。我们可以在

文件中找到一组FILE_DEVICE_XXX符号常量,这些值都是微软

保留的值,我们可以使用其中的FILE_DEVICE_UNKNOWN。当然你也可以定义另外一个

FILE_DEVICE_XXX值

◎ Access--存取代码(2bit)指明应用程序存取设备的方式,由于这个字段只有2位,

所以只有4种可能性:

· FILE_ANY_ACCESS (0)--最大的存取权限,就是什么操作都可以

· FILE_READ_ACCESS (1)--读权限,设备将数据传递到指定的缓冲区

· FILE_WRITE_ACCESS (2)--写权限,可以从内存中向设备传递数据

· FILE_READ_ACCESS or FILE_WRITE_ACCESS (3)--读写权限,设备和内存缓冲区之

间可以互相传递数据

◎ Function--功能代码(12bit)用来描述要进行的操作,我们可以用800h-0FFFh

来定义自己的I/O控制代码,0-7FFh之间的值是被微软保留的,用来定义公用的I/O控

制代码

◎ Method--缓冲模式(2bit)表示I/O管理器如何对输入和输出的数据进行缓冲,

这个字段的长度是2位,所以有4种可能性:

· METHOD_BUFFERED (0)--对I/O进行缓冲

· METHOD_IN_DIRECT (1)--对输入不进行缓冲

· METHOD_OUT_DIRECT (2)--对输出不进行缓冲

· METHOD_NEITHER (3)--都不缓冲

缓冲模式的管理我们会在后面进行更详细的讨论,当前最重要的是,虽然进行缓冲会

带来一些额外的内存开销,但却是最安全的,因为系统已经做好了相关的全部工作。在传

输的数据小于一页(4Kb)的时候,驱动程序通常使用缓冲方式的I/O,因为对大量小块内

存进行内存锁定带来的开销也是很大的。在 VirtToPhys驱动程序中,我们使用带缓冲的

方式。