2012-01-18 44 views
4

我正在使用DeviceIoControl函數,我需要將IOCTL_ATA_PASS_THROUGH值傳遞給該函數。我找不到這個常量的delphi轉換,只是我找到了這個C++定義。如何在delphi中定義IOCTL_ATA_PASS_THROUGH?

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

,但我有問題,該值轉換使用CTL_CODE宏德爾福。問題是我如何在delphi中定義IOCTL_ATA_PASS_THROUGH?

回答

9

的CTL_CODE宏定義爲

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

所以德爾福相當於IOCTL_ATA_PASS_THROUGH常量的是這樣的

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); 

注:Unfortunally德爾福不支持宏,但您可以創建功能

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; 

並獲得RU值正時這樣

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

但是,你甚至可以在Delphi中使用這個東西嗎?這不是特定的驅動程序嗎? (+1) – TLama 2012-01-18 16:40:55

+2

是的,你可以在delphi中使用它,例如重新引用S.M.A.R.T. hdd的數據。 – RRUZ 2012-01-18 16:43:39

1

它的$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!

相關問題