它们位于 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\(在 64 位系统上)的 ntddscsi.h 中。它们被定义为:
#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
:D
如果您将这些计算应用于其他 IO_.... 宏,您将找到这些值。另一方面,编写一个简短的应用程序只是将它们的值打印为十六进制要容易得多;)