我如何在delphi中定义IOCTL_ATA_PASS_THROUGH?

Sal*_*dor 4 c++ delphi winapi delphi-xe

我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

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

RRU*_*RUZ 9

CTL_CODE宏定义为

#define CTL_CODE(DeviceType, Function, Method, Access) (
  ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
)
Run Code Online (Sandbox Code Playgroud)

所以IOCTL_ATA_PASS_THROUGHconst 的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);
Run Code Online (Sandbox Code Playgroud)

注意:遗憾的是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;
Run Code Online (Sandbox Code Playgroud)

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

Flag:=CTL_CODE(IOCTL_SCSI_BASE, $040B , METHOD_BUFFERED, (FILE_READ_ACCESS or FILE_WRITE_ACCESS));
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以使用delphi中的这个,例如来恢复硬盘的SMART数据. (2认同)