【问题标题】:How I can define the IOCTL_ATA_PASS_THROUGH in delphi?如何在 delphi 中定义 IOCTL_ATA_PASS_THROUGH?
【发布时间】:2012-01-18 16:32:13
【问题描述】:

我正在使用DeviceIoControl 函数,我需要将IOCTL_ATA_PASS_THROUGH 值传递给该函数。我找不到这个常量的任何 delphi 翻译,只是我找到了这个 C++ 定义。

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

但我在使用 CTL_CODE 宏将该值转换为 delphi 时遇到问题。问题是如何在 delphi 中定义 IOCTL_ATA_PASS_THROUGH?

【问题讨论】:

    标签: c++ delphi winapi delphi-xe


    【解决方案1】:

    CTL_CODE 宏定义为

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

    所以IOCTL_ATA_PASS_THROUGH const 的 delphi 等价物是这样的

    uses
      Windows;
    
    const
    //#define IOCTL_ATA_PASS_THROUGH  CTL_CODE(IOCTL_SCSI_BASE, 0x040B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    IOCTL_SCSI_BASE       = FILE_DEVICE_CONTROLLER;
    IOCTL_ATA_PASS_THROUGH= (IOCTL_SCSI_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or ($040B shl 2) or (METHOD_BUFFERED);
    

    注意:很遗憾,delphi 不支持宏,但你可以创建一个函数

    function CTL_CODE(DeviceType, _Function, Method, Access: Cardinal): Cardinal;
    begin
      Result := (DeviceType shl 16) or (Access Shl 14) or (_Function shl 2) or (Method);
    end;
    

    并以这种方式在运行时获取值

    Flag:=CTL_CODE(IOCTL_SCSI_BASE, $040B , METHOD_BUFFERED, (FILE_READ_ACCESS or FILE_WRITE_ACCESS));
    

    【讨论】:

    • 但是你甚至可以在 Delphi 中使用这些东西吗?那个驱动程序不是特定的吗? (+1)
    • 是的,您可以在 delphi 中使用它,例如检索 S.M.A.R.T.硬盘数据。
    【解决方案2】:

    它的值为$0004d02c。我通过以下 C 程序获得了它。

    #include <windows.h>
    #include <Ntddscsi.h>
    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
        printf("%.8x", IOCTL_ATA_PASS_THROUGH);
        return 0;
    }
    

    我个人觉得使用实际的 Windows 头文件比尝试翻译更安全,但也许这只是因为我对 C 的了解不够!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 2012-05-20
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多