Projekte > Optische Laufwerke > Merkmale

Removable Medium

GET CONFIGURATION Command - Operation Code $46
REMOVABLE MEDIUM FEATURE - Feature Number $0003

Im Kapitel Feature wurde die Feature List ermittelt. Das Removeable Medium Feature ist in den Multimedia Commands 6 in Kapitel 5.3.4 beschreiben. Es ist vorhanden, wenn das Laufwerk austauschbare Medien enthält. Der Command Descriptor Block:

  7 6 5 4 3 2 1 0
0 Operation Code = $46
1 Reserviert RT = 10b
2 Starting Feature Number = $0003
3
4 Reserviert
5
6
7 Allocation Length = $10
8
9 Control

 

Die Werte

Byte 0 Operation Code - $46 GET CONFIGURATION Command

Byte 1 Request Type (RT) - 10b Feature Header, auch wenn das Feature nicht unterstützt wird.

Wert Beschreibung
00b Das Laufwerk soll den Feature Header und alle durch das Laufwerk unterstützten Feature Beschreibungen zurückgeben ohne Rücksicht auf Geltung.
01b Das Laufwerk soll den Feature Header und nur die gewählte Feature Beschreibung zurückgeben.
10b Das Laufwerk soll den Feature Header und nur die gewählte Feature Beschreibung zurückgeben. Wird das Feature nicht unterstützt, soll nur der Feature Header zurückgegeben werden.
11b Reserviert

 
Byte 2 und 3: Starting Feature Number - $0003 Die Nummer des Removeable Medium Feature, welches ausgegeben werden soll.

Byte 7 und 8: Länge der Antwortstruktur - $10. Die Länge muss so gewählt werden, dass die erwartete Antwort hineinpasst. Der Header ist acht Byte und die Feature Beschreibung ebenfalls acht Byte lang, so dass die Länge 16 beträgt.

Byte 9: Control - ?
 

Antwortstruktur

Diese Struktur sollte 16 Byte lang sein. Wenn das Feature nicht unterstützt würde, wäre der Wert nur acht. Zuerst der Feature Header:

  7 6 5 4 3 2 1 0
0 Data Length
1
2
3
4 Reserviert
5
6 Current Profile
7

 
Data Length - Die Datenlänge im Header gibt die Länge des noch folgenden Headerrestes und der Feature Bechreibungen an. Hier müsste der Wert 12 betragen weil noch vier Byte Header und acht Byte Feature Removable Medium Beschreibung folgen.

Current Profile - Gibt das aktive Profil an. Das Profil ist vom Laufwerk und dem eingelegten Datenträger abhängig. Sind mehrere Profile aktiv wird das Profil mit der höchsten Nummer angegeben. (Liste der Profile in einem Fenster öffnen.)

Anschließend die Removable Medium Feature Beschreibung, falls dieses Feature unterstützt wird:

  7 6 5 4 3 2 1 0
0 Feature Code = $0003
1
2 Reserviert Version = 0010b Persistent Current
3 Additional Length = 4
4 Loading Mechanism Type Load Eject Pvnt Jmpr DBML Lock
5 Reserviert
6
7

 
Feature Code - Muss der selbe wie im CDB sein. Hier war das Removable Medium Feature $0003 ausgewählt.

Version - Die Versionsnummer ist in den Multimedia Commands 6 0010b.

Persistent - Muss auf 1b gesetzt sein.

Current - Muss auf 1b gesetzt sein.

Additional Length - Der Wert muss vier betragen, weil noch vier Byte der Feature Beschreibung folgen.

Loading Mechanism Type - Die Werte entsprechen denen bei Capabilities:

Loading Mechanism Type Beschreibung
000b Caddy/Slot type loading mechanism
001b Tray type loading mechanism
010b Pop-up type loading mechanism
011b Reserved
100b Embedded changer with individually changeable discs
101b Embedded changer using a magazine mechanism
110b 111b Reserved

 
Load - Gibt an, ob das Medium über das START STOP UNIT command mit dem LoEj Bit geladen werden kann.

Eject - Gibt an, ob das Medium über das START STOP UNIT command mit dem LoEj Bit ausgeworfen werden kann.

Pvnt Jmpr - Prevent Jumper. Wenn gesetzt, dann ist kein Prevent Jumper vorhanden.

DBML - Gibt an, ob beim Laden/Entladen des Laufwerkes Device Busy Events gemeldet werden.

Lock - Gibt an, ob das Laufwerk gesperrt werden kann.

 

Deklarationen

Zusätzlich zu den Deklarationen im Kapitel Feature werden diese vorgenommen:

 
  const
    FEATURE_REMOVABLE_MEDIUM = $0003;
 
  type
    TGET_CONFIGURATION_REMOVEABLE>_MEDIUM = record
      Header : array[0..7] of Byte;
      Data   : array[0..7] of Byte;
    end;
    PGET_CONFIGURATION_REMOVABLE_MEDIUM = ^TGET_CONFIGURATION_REMOVABLE_MEDIUM;
 
  type
    TFeatureRemovableMedium = record
      FeatureCode  : Word;
      Version      : Byte;
      Persistent   : Boolean;
      Current      : Boolean;
      AddLength    : Byte;
      LoadMechType : Byte;
      Load         : Boolean;
      Eject        : Boolean;
      PvntJmpr     : Boolean;
      DBML         : Boolean;
      Lock         : Boolean;
    end;
        

 

Ausführung

Nach der Ausführung wird die Antwortstruktur ausgewertet. Beispielfunktion

 
  function TOptDrives.ReadConfigRemovableMedium(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  GET CONFIGURATION Removable Medium Feature.
  }
  var
    GET_CONFIGURATION_CDB : TGET_CONFIGURATION_CDB;
    pConfigRemovable      : PGET_CONFIGURATION_REMOVABLE_MEDIUM;
    aCDB                  : Array of Byte;
    n                     : Integer;
    DataLength            : Cardinal;
  begin
    Result := False;
    {
    *  Removable Feature Header initialisieren.
    }
    FillChar(FDrive[FActive].Removable, SizeOf(TFeatureRemovableMedium), $00);
    {
    *  Den Command Descriptor Block füllen.
    }
    ZeroMemory(@GET_CONFIGURATION_CDB, SizeOf(TGET_CONFIGURATION_CDB));
    GET_CONFIGURATION_CDB.OperationCode         := SCSIOP_GET_CONFIGURATION;
    GET_CONFIGURATION_CDB.RequestType           := RT_Identified;
    GET_CONFIGURATION_CDB.StartingFeatureNumber := FEATURE_REMOVABLE_MEDIUM;
    GET_CONFIGURATION_CDB.AllocationLength      :=
                                    SizeOf(TGET_CONFIGURATION_REMOVABLE_MEDIUM);
    {
    *  Den Command Descriptor Block übertragen.
    }
    SetLength(aCDB, 10);
    aCDB[0] := GET_CONFIGURATION_CDB.OperationCode;
    aCDB[1] := GET_CONFIGURATION_CDB.RequestType;
    aCDB[2] := HiByte(GET_CONFIGURATION_CDB.StartingFeatureNumber);
    aCDB[3] := LoByte(GET_CONFIGURATION_CDB.StartingFeatureNumber);
    aCDB[7] := HiByte(GET_CONFIGURATION_CDB.AllocationLength);
    aCDB[8] := LoByte(GET_CONFIGURATION_CDB.AllocationLength);
    {
    *  Befehl ausführen
    }
    GetMem(pConfigRemovable, SizeOf(TGET_CONFIGURATION_REMOVABLE_MEDIUM));
    Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pConfigRemovable,
                                      SizeOf(TGET_CONFIGURATION_REMOVABLE_MEDIUM));
    if Result
    then begin
      {
      *  Wenn die Ausführung erfolgreich war ...
      }
      DataLength := pConfigRemovable.Header[0] shl 24 or
                    pConfigRemovable.Header[1] shl 16 or
                    pConfigRemovable.Header[2] shl  8 or
                    pConfigRemovable.Header[3];
      {
      *  Header acht und Removable Medium Feature acht Byte abzüglich DataLength-
      *  Feldgröße ergibt 12 Byte.
      }
      if DataLength = 12 then
      with FDrive[FActive].Removable
      do begin
        FeatureCode  := pConfigRemovable.Data[0] shl 8 or pConfigRemovable.Data[1];
        Version      := pConfigRemovable.Data[2] and $3C shr 2;
        Persistent   := pConfigRemovable.Data[2] and $02 > 0;
        Current      := pConfigRemovable.Data[2] and $01 > 0;
        AddLength    := pConfigRemovable.Data[3];
        LoadMechType := pConfigRemovable.Data[4] shr 5;
        Load         := pConfigRemovable.Data[4] and $10 > 0;
        Eject        := pConfigRemovable.Data[4] and $08 > 0;
        PvntJmpr     := pConfigRemovable.Data[4] and $04 > 0;
        DBML         := pConfigRemovable.Data[4] and $02 > 0;
        Lock         := pConfigRemovable.Data[4] and $01 > 0;
        {
        *  Ergebnis
        }
        Result := FDrive[FActive].Removable.FeatureCode = FEATURE_REMOVABLE_MEDIUM;
      end;
    end;
  end;
          

Anmerkung: In der Funktion wird with ... do nicht verwendet.

Demo, welche diese Funktion nutzt:

Removable Medium (podRemovableMedium.7z - 251 kb) MD5 (1 kb). Stand: 2. Juni 2013

Änderungen an der Demo

Datum Beschreibung
02.06.2013Kleine Überarbeitung und neuer Name.