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驱动程序中,我们使用带缓冲的
方式。
发布评论