阅读:1828回复:3
清教 CTL_CODE 如何计算
如我在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 使用什么方法计算的? 谢谢!! |
|
沙发#
发布于: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头文件。 |
|
|
板凳#
发布于:2004-10-31 18:58
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ ) |
|
|
地板#
发布于:2004-10-31 19:24
re:AllenZh
怎样才能把分给你啊? |
|