2012-01-18 4 views
4

Я работаю с функцией DeviceIoControl, и мне нужно передать значение IOCTL_ATA_PASS_THROUGH этой функции. Я не могу найти перевод delphi для этой константы, только я нашел это определение на C++.Как я могу определить IOCTL_ATA_PASS_THROUGH в delphi?

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

, но у меня есть проблемы, чтобы перевести это значение в Дельфы с помощью CTL_CODE макроса. вопрос в том, как я могу определить IOCTL_ATA_PASS_THROUGH в delphi?

ответ

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 Дельфи не поддерживает макросы, но вы можете создать a

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; 

и получите значение в en n-time таким образом

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

Но можете ли вы использовать этот материал в Delphi? Разве это не тот конкретный драйвер? (+1) – TLama

+2

Да, вы можете использовать это из delphi, например, чтобы вернуть 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!

Смежные вопросы