请教一个问题:
   对于 DeviceIoControl()这个函数 ,我们需要输入一个宏定义的dwIoControlCode , 有的时候MSDN 给出的很多control code 不够使用的,所以对于Windows API 中没有提供的一些硬件读取的control code ,该怎么样子实现啊?是不是我需要在Driver中声明一下这些我自己需要的 control code 呢? BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);谢谢!

解决方案 »

  1.   

    是要这样,比如在windows内核开发中经常需要定义自己的control code:IOCTL_MyCtl equ CTL_CODE(FILE_DEVICE_UNKNOWN,\
    800h, METHOD_BUFFERED,\
    FILE_READ_ACCESS + FILE_WRITE_ACCESS)以上是win32汇编定义,你可以自己转成c定义,另外可以在我的博客找到更多
    内容。
      

  2.   

    谢谢你的回答,但是可不可以把Windows 内核中对于 control code 定义或者声明 说的再清楚一些呢?
    Thanks!
      

  3.   

    4.2.7 I/O控制代码    设备驱动程序可以被当作内核模式函数包来看待,I/O控制代码就是用来指定访问其中的哪个函数的。DeviceIoControl函数的dwIoControlCode参数就是这个代码,它指出了我们需要进行的操作,以及如何进行操作。
        控制代码是32位数字型常量,可以CTL_CODE宏来定义,它们定义在winioctl.inc和ntddk.inc文件中。    控制代码中各数据位字段的含义如下:
    ◎ DeviceType--设备类型(16bit)指出了设备的类型,微软保留了0-7FFFh的取值,剩下的8000h-0FFFFh供开发商定义新的内核模式驱动程序。我们可以在\include\w2k\ntddk.inc文件中找到一组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驱动程序中,我们使用带缓冲的方式。
        读者可以手工去定义I/O控制代码,但是使用CTL_CODE宏会方便得多,它提供了创建IOCTL值的算法,具体如下:CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0>
        EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method))
    ENDM    CTL_CODE宏在winioctl.inc文件和ntddk.inc文件中都有定义。