2012-01-18 34 views
4

私はDeviceIoControl関数を使っているので、その関数にIOCTL_ATA_PASS_THROUGHの値を渡す必要があります。私はこの定数のためのデルファイ変換を見つけることができません、ちょうど私はこのC + +の定義を発見した。デルファイで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マクロはそうIOCTL_ATA_PASS_THROUGHのconstのデルファイ当量がこの

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

ノートのようなものである

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

次のように定義されます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で取得するこのようにn時間になる。

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

でも、Delphiでこのようなものを使用できますか?そのドライバーは具体的ではありませんか? (+1) – TLama

+2

はい、デルファイからこれを使用して、たとえばS.M.A.R.Tを再評価することができます。 hddのデータ。 – RRUZ

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について十分に知っていないという理由だけです!

関連する問題