Projekte > Optische Laufwerke > Schublade

Sperren und Entsperren

Das Sperrung bewirkt, das die Schublade nicht mehr geöffnet bzw. das Medium nicht mehr ausgeworfen werden kann. Ist die Schublade geöffnet, lässt sie sich schließen. Für das Sperren bzw. Entsperren wird die Funktion DeviceIoControl mit dem Controlcode IOCTL_CDROM_MEDIA_REMOVAL oder besser IOCTL_STORAGE_MEDIA_REMOVAL verwendet. Diesem Befehl wird eine Struktur mitgegeben, mit welchem mitgeteilt wird, ob das Laufwerk gesperrt oder entsperrt werden soll. Diese Struktur wird im folgenden Beispiel vereinfacht:

 
  function TOptDrives.DriveLockUnlock(aValue: Boolean): Boolean;
  {*******************************************************************************
  *  Laufwerksschublade bzw Auswurf sperren und entsperren.
  }
  var
    hDevice               : THandle;
    nReturned             : Cardinal;
    PREVENT_MEDIA_REMOVAL : Byte;
  begin
    {
    *  Init
    }
    Result    := False;
    nReturned := 0;
    {
    *  Das Handle auf das Laufwerk holen.
    }
    hDevice := DriveHandleRead;
    {
    *  Bei einem gültigen Handle Wert für Lock setzen und den Befehl senden
    *  und das Handle wieder schließen.
    }
    if hDevice <> INVALID_HANDLE_VALUE
    then begin
      if aValue
      then PREVENT_MEDIA_REMOVAL := 1
      else PREVENT_MEDIA_REMOVAL := 2;
      Result := DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL,
                               @PREVENT_MEDIA_REMOVAL, SizeOf(PREVENT_MEDIA_REMOVAL),
                               nil, 0, nReturned, nil);
      CloseHandle(hDevice);
    end;
  end;
          

Die Struktur besteht nur noch aus einer logischen Variablen. Hier werden jedoch numerischen Werte verwendet, obwohl diese nicht in der aktuellen Dokumentation erwähnt werden. Eigentlich ist die Deklaration

 
    PREVENT_MEDIA_REMOVAL : Byte;
        

falsch und es müsste

 
    PREVENT_MEDIA_REMOVAL : Boolean;
          

heißen. Dann würde jedoch ein Zähler verwendet, welcher bei jedem Sperren erhöht und bei jedem Entsperren wieder verringert wird. Das bedeutet, sperrt man dreimal muss man auch dreimal entsperren.

Demo:

Tray Lock (podTrayLock.7z - 239 kb) MD5 (1 kb). Stand: 28. April 2013

Änderungen an der Demo

Datum Beschreibung
28.04.2013Kleine Überarbeitung und neuer Name.
08.04.2013Überarbeitung.