Manchen interessiert, ob die Schublade geöffnet oder geschlossen ist. Mit der Funktion DeviceIoControl, dem Controlcode IOCTL_SCSI_PASS_THROUGH_DIRECT und dem Record TMechanismStatus läßt sich dies feststellen. Quelle dafür ist die TIsoLib. Dies sieht zum Beispiel so aus:
function TfrmMain.DriveDoor(const aDrive: AnsiChar; var bOpen: Boolean): Boolean;
{*******************************************************************************
* Status der Schublade - geschlossen/geöffnet. Auf Basis der TISOLib
}
var
hDevice : THandle;
nReturned : Cardinal;
bSCSIBuffer : array[0..1023] of AnsiChar;
pSCSIBuffer : PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
MechStatus : TMechanismStatus;
begin
{
* Init
}
bOpen := False;
Result := False;
nReturned := 0;
{
* Das Handle auf das Laufwerk holen.
}
hDevice := CreateFile(PAnsiChar(Format('\\.\%s:', [aDrive])),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_READ,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
{
* Bei einem gültigen Handle Wert Struktur füllen und Befehl senden.
}
if hDevice <> INVALID_HANDLE_VALUE
then begin
ZeroMemory(@bSCSIBuffer, 1024);
ZeroMemory(@MechStatus, SizeOf(MechStatus));
pSCSIBuffer := PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER(@bSCSIBuffer);
pSCSIBuffer^.sptd.Length := SizeOf(SCSI_PASS_THROUGH_DIRECT);
pSCSIBuffer^.sptd.CdbLength := 11;
pSCSIBuffer^.sptd.SenseInfoLength := 32;
pSCSIBuffer^.sptd.DataIn := SCSI_IOCTL_DATA_IN;
pSCSIBuffer^.sptd.DataTransferLength := SizeOf(TMechanismStatus);
pSCSIBuffer^.sptd.TimeOutValue := 120;
pSCSIBuffer^.sptd.DataBuffer := @MechStatus;
pSCSIBuffer^.sptd.SenseInfoOffset := 48;
pSCSIBuffer^.sptd.Cdb[0] := $BD;
pSCSIBuffer^.sptd.Cdb[8] := HiByte(SizeOf(TMechanismStatus));
pSCSIBuffer^.Sptd.Cdb[9] := LoByte(SizeOf(TMechanismStatus));
Result := DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT,
pSCSIBuffer, SizeOf(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER),
pSCSIBuffer, SizeOf(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER),
nReturned, nil);
{
* War die Ausführung erfolgreich, Ergebnis auswerten
}
if Result
then begin
{
* Bit 4 auswerten.
}
bOpen := MechStatus.MechanismStatusHeader.MechanismState_DoorOpen_CurrentSlot
and 16 = 16;
end;
CloseHandle(hDevice);
end;
end;
Erweiterte Demo:

Mechanik 4 (podMech04.7z - 234 kb) MD5 (1 kb). Stand: 26. Dezember 2011
Fr_An - Letzte Änderung: 26. Dezember 2011
seit 28. Juli 2010