Avatar
www.fr-an.de

Mechanik

Status der Schublade

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