Как я могу определить IOCTL_ATA_PASS_THROUGH в Delphi? - PullRequest
4 голосов
/ 18 января 2012

Я работаю с функцией 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)

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

Ответы [ 2 ]

9 голосов
/ 18 января 2012

Макрос CTL_CODE определен как

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

Таким образом, delphi-эквивалент константы 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);

Примечание: к сожалению, 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));
1 голос
/ 18 января 2012

Имеет значение $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!

...