我可以帮您翻译成中文:我在哪里可以找到 IOCTL 常量值?

5

我需要了解各种字符串的IOCTL常量(例如IOCTL_ATA_PASS_THROUGH常量的值)。在互联网上搜索后,我发现这些常量是在头文件Ntddscsi.h中定义的,但这些常量是错误的。例如,IOCTL_ATA_PASS_THROUGH常量的值应该是4D02C,而在头文件中它是40B。

问题是:我在哪里可以找到包含所有正确值的列表?

谢谢

编辑:

我已经找到http://www.ioctls.net/,其中列出了所有代码。无论如何感谢您解释为什么Ntddscsi.h中的值不是“最终”值。

1个回答

13

这些定义位于 ntddscsi.h 文件中,该文件位于 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\ 目录下(在 64 位系统上)。它们的定义如下:

#define IOCTL_ATA_PASS_THROUGH          CTL_CODE(IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

IOCTL_SCSI_BASE是什么?

#define IOCTL_SCSI_BASE                 FILE_DEVICE_CONTROLLER

来自同一文件

以及这些来自WinIoCtl.h

#define METHOD_BUFFERED                 0
#define FILE_DEVICE_CONTROLLER          0x00000004
#define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe

CTL_CODE 则源自于 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\WinIoCtl.h。

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \

因此,您对于IOCTL_ATA_PASS_THROUGH的最终值将为:

(4 << 16 | (1 | 2) << 14 | 0x040b << 2 | 0) = 315436 = 4D02C 

如果你对其他IO_....宏使用这些计算,你会找到相应的值。另一方面,编写一个简短的应用程序以十六进制打印出它们的值要容易得多😉


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接