xiaomao_he
驱动牛犊
驱动牛犊
  • 注册日期2004-05-11
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1828回复:3

清教 CTL_CODE 如何计算

楼主#
更多 发布于:2004-10-31 17:20
如我在VC下定义:
#define Function_IOCTL_DRV_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
以后在程序里就可以直接使用 Function_IOCTL_DRV_VERSION
它的值是 CTL_CODE 宏计算出来的,
请问:CTL_CODE 使用什么方法计算的?
       谢谢!!  
xuhaiqg
驱动牛犊
驱动牛犊
  • 注册日期2004-04-12
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-31 18:27
定义I/O控制代码
DeviceIoControl的Code参数是一个32位数值常量,图9-9显示了操作系统分割这个32位代码的一种方式。

Device type(31-16),A(15-14),Function code(13-2),M(1-0)    

图9-9. I/O控制代码中的域

这些域的解释如下:

Device type(16位,CTL_CODE宏的第一个参数) 指出能实现这个控制操作的设备类型。我并不知晓Windows 98或Windows 2000中的任何“IOCTL police”,但是我认为该域的内容实际上是任意的。习惯上我们使用与驱动程序中调用IoCreateDevice时使用的同一个值(例如,FILE_DEVICE_UNKNOWN)。
访问代码(“A”占2位,CTL_CODE的第四个参数) 指出使用设备句柄发出这个控制操作时,应用程序必须具有的访问权限。
Function code(12位,CTL_CODE的第二个参数) 指出该代码描述的是哪一个控制操作。Microsoft保留了该域的前半部分,从0到2047的值。因此我们只能使用从2048到4095之间的值。
缓冲方式(“M”占两位,CTL_CODE的第三个参数) 指出I/O管理器如何处理应用程序提供的输入输出缓冲区。在后面段中当讲述如何实现IRP_MJ_DEVICE_CONTROL时,我会更详细地讲述这个域。
需要阐明一点,编写驱动程序时,你可以自由地设计一系列IOCTL操作,应用程序也可以使用这些IOCTL操作与你的驱动程序对话。虽然有时你定义的IOCTL操作在数值上与其它人定义的完全相同,但系统不会被这种重叠所迷惑,因为你定义的IOCTL代码仅被你的驱动程序解释。

通常,如果应用程序开发者需要调用你的驱动程序,简单的办法是把你所有的IOCTL定义都放到一个专用的头文件中。光盘上的每个例子驱动程序工程都有一个名为IOCTLS.H的头文件,如下例:

#ifndef CTL_CODE
  #pragma message ("CTL_CODE undefined. Include winioctl.h or wdm.h")
#endif

#define IOCTL_GET_VERSION_BUFFERED \
  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_GET_VERSION_DIRECT \
  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_GET_VERSION_NEITHER \
  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS)
 

#pragma语句指出未找到CTL_CODE定义时的警告信息,应该包含winioctl.h或wdm.h头文件。
纸上来得终觉浅 绝知此事要躬行
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-31 18:58
#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xiaomao_he
驱动牛犊
驱动牛犊
  • 注册日期2004-05-11
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-31 19:24
re:AllenZh

   怎样才能把分给你啊?
    
游客

返回顶部