Jub*_*bba 4 .net c++ vb.net msdn
我需要知道各种字符串的IOCTL常量(例如IOCTL_ATA_PASS_THROUGH的常量值).在网上搜索我发现这些常量是在标题Ntddscsi.h中定义的,但那些常量是错误的.例如,IOCTL_ATA_PASS_THROUGH的常量值应该是4D02C,而在头文件中它是40B
问题是:我在哪里可以找到包含所有正确值的列表?
谢谢
编辑:
我找到了http://www.ioctls.net/,其中列出了所有代码.无论如何,谢谢你解释为什么Ntddscsi.h中的值不是"最终"值
Fer*_*eak 12
它们位于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)
Run Code Online (Sandbox Code Playgroud)
并且IOCTL_SCSI_BASE
是
#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER
Run Code Online (Sandbox Code Playgroud)
来自同一个文件
这些来自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
Run Code Online (Sandbox Code Playgroud)
而CTL_CODE
来自WinIoCtl.h发现在C:\ Program Files文件(x86)的\微软的SDK \的Windows\v7.0A \包含\
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
Run Code Online (Sandbox Code Playgroud)
)
所以IOCTL_ATA_PASS_THROUGH的最终值将是:
(4 << 16 | (1 | 2) << 14 | 0x040b << 2 | 0) = 315436 = 4D02C
Run Code Online (Sandbox Code Playgroud)
:d
如果您将这些计算应用于其他IO _....宏,您将找到这些值.另一方面,编写一个简短的应用程序只是为了将它们的值打印为十六进制,这要容易得多;)