Avatar
www.fr-an.de

Medieninformationen

Type des eingelegten Mediums

GET CONFIGURATION Command - Operation Code $46

Mit dem GET CONFIGURATON Command (SCSI Multi Media Commands) bekommt man einen FEATURE Header, welcher das gegenwärtige Profile des Laufwerks enthält. Das dabei ausgewählte Feature ist unwichtig. Beispiele für verschiedene Feature gibt es hier bereits unter Hardwareinformationen. Anzumerken ist, dass der Strich in DVD-R kein Minus darstellt.

Der GET CONFIGURATION Command Descriptor Block:

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

 

Die zu setzenden Werte:

Byte 0 Operation Code - $46

Byte 1 RT - Request Type - 10b:

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 - $0000: Gibt die Nummer des Feature, welches zuerst ausgegeben werden soll, an. Da alle angezeigt werden sollen, wird die niedrigste mögliche Nummer angegeben.

Byte 7 und 8 Allocation Length - $08: Da nur der FEATURE HEADER mit acht Byte Länge benötigt wird:

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

 
Die Profile sind:

Profil Nummer Profil Name
$0000 Reserviert
$0001 Veraltet
$0002 Removable Disk
$0003 MO Erasable
$0004 Optical Write-Once
$0005 AS-MO
$0006..$0007 Reserviert
$0008 CD-ROM
$0009 CD-R
$000A CD-RW
$000B..$000F Reserviert
$0010 DVD-ROM
$0011 DVD-R Sequential Recording
$0012 DVD-RAM
$0013 DVD-RW Restricted Overwrite
$0014 DVD-RW Sequential Recording
$0015 DVD-R Dual Layer Sequential Recording
$0016 DVD-R Dual Layer Jump Recording
$0017 DVD-RW Dual Layer
$0018 DVD-Download Disc Recording
$0019 Reserviert
$001A DVD-RW
$001B DVD-R
$001C..$001F Reserviert
$0020..$0022 Hinterlassenschaft
$0023..$0029 Reserviert
$002A DVD+RW Dual Layer
$002B DVD+R Dual Layer
$002C..$003F Reserviert
$0040 BD-ROM
$0041 BD-R Sequential Recording Mode
$0042 BD-R Random Recording Mode
$0043 BD-RE
$0044..$004F Reserviert
$0050 HD DVD-ROM
$0051 HD DVD-R
$0052 HD DVD-RAM
$0053 HD DVD-RW
$0054..$0057 Reserviert
$0058 HD DVD-R Dual Layer
$0059 Reserviert
$005A HD DVD-RW Dual Layer
$005B..$FFFE Reserviert
$FFFF Laufwerk entspricht keinem Standard Profile

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
 
  type
    TGetConfigurationHeader = record
      DataLength     : DWord;
      CurrentProfile : Word;
    end;
 
    ...
 
  {
  *  Für den Befehl.
  }
 
  const
    SCSIOP_GET_CONFIGURATION = $46;
    FEATURE_PROFILE_LIST     = $0000;
    RT_All                   = 0;
    RT_Current               = 1;
    RT_Identified            = 2;
 
  type
    TGET_CONFIGURATION_CDB = record
      OperationCode         : Byte;
      RequestType           : Byte;
      StartingFeatureNumber : Word;
      AllocationLength      : Word;
    end;
 
  type
    TGET_CONFIGURATION_HEADER = array[0..$07] of Byte;
 
    ...
        

 

Ausführung und Auswertung

Nach der Ausführung wird die Antwortstruktur ausgewertet.

  ...
 
  begin
 
    ...
 
    {
    *  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_PROFILE_LIST;
    GET_CONFIGURATION_CDB.AllocationLength      := SizeOf(TGET_CONFIGURATION_HEADER);
    {
    *  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
    }
    if GET_SCSI_PASS_THROUGH_DIRECT(aDrive, aCDB, @GET_CONFIGURATION_HEADER,
                                    SizeOf(TGET_CONFIGURATION_HEADER))
    then begin
      ConfigHeader.DataLength     := GET_CONFIGURATION_HEADER[0] shl 24 or
                                     GET_CONFIGURATION_HEADER[1] shl 16 or
                                     GET_CONFIGURATION_HEADER[2] shl  8 or
                                     GET_CONFIGURATION_HEADER[3];
      ConfigHeader.CurrentProfile := GET_CONFIGURATION_HEADER[6] shl 8 or
                                     GET_CONFIGURATION_HEADER[7];
    end;
 
    ...
 
  end;
        

 
Data Length - Die Datenlänge im Header gibt die Länge des noch folgenden Headerrestes und der Feature Beschreibungen an. Der Wert ist ein Vielfaches von vier.

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

 

Demo, welche diese Funktion nutzt:

Disk Type (podDiscType.7z - 234 kb) MD5 (1 kb). Stand: 26. Februar 2012

Änderungen an der Demo

26.02.2012 -
Aktualisiert: Groupbox "Optische Laufwerke".
14.02.2012
DiscType $001A und $001B korrigiert (- -> +).

 

Fr_An - Erstellt: 27. Januar 2012 - Letzte Änderung: 26. Februar 2012

seit 28. Juli 2010