【问题标题】:Where can I find IOCTL constant values?在哪里可以找到 IOCTL 常量值?
【发布时间】:2012-06-22 08:04:36
【问题描述】:

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

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

谢谢

编辑:

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

【问题讨论】:

    标签: c++ .net vb.net msdn


    【解决方案1】:

    它们位于 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 来自 WinIoCtl.h,位于 c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\

    #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_.... 宏,您将找到这些值。另一方面,编写一个简短的应用程序只是将它们的值打印为十六进制要容易得多;)

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2013-09-11
      • 2010-10-17
      • 2023-04-09
      • 1970-01-01
      • 2011-05-22
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多