4 Stimmen

Wie kann ich das IOCTL_ATA_PASS_THROUGH in Delphi definieren?

Ich arbeite mit der DeviceIoControl Funktion und muss den Wert IOCTL_ATA_PASS_THROUGH an diese Funktion übergeben. Ich habe keine Delphi-Übersetzung für diese Konstante gefunden, nur diese C++-Definition.

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

Aber ich habe Probleme, diesen Wert auf Delphi mithilfe des CTL_CODE Makros zu übersetzen. Die Frage ist, wie kann ich IOCTL_ATA_PASS_THROUGH in Delphi definieren?

10voto

RRUZ Punkte 132753

Das CTL_CODE-Makro ist definiert als

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

Also wäre das Delphi-Äquivalent der IOCTL_ATA_PASS_THROUGH Konstante etwa so

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

Hinweis: Leider unterstützt Delphi keine Makros, aber Sie können eine Funktion erstellen

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;

und den Wert zur Laufzeit auf diese Weise erhalten

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

1voto

David Heffernan Punkte 585606

Es hat einen Wert von $0004d02c. Dies habe ich mit dem folgenden C-Programm erhalten.

#include 
#include 
#include 

int main(int argc, char* argv[])
{
    printf("%.8x", IOCTL_ATA_PASS_THROUGH);
    return 0;
}

Persönlich finde ich es sicherer, die tatsächlichen Windows-Headerdateien zu verwenden, als zu versuchen, zu übersetzen, aber vielleicht liegt das nur daran, dass ich nicht genug über C weiß!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X