Projekte > Optische Laufwerke > Medieninformationen

Alle unterstützten Formatcodes

READ DISC STRUCTURE Command - Operation Code $AD
DISC STRUCTURE LIST - Format Code $FF

Mit dem READ DISC STRUCTURE Command - MMC6 Kapitel 6.22 - können verschiedene Informationen zu den Medien DVD und BD ermittelt werden. Das Command wird unterstützt, wenn mindestens eines der folgenden Feature (siehe Feature List) unterstützt wird:

Ist keines der Feature vorhanden wird das Command nicht unterstützt. In Abhängigkeit vom eingelegten Medium können verschiedene Formate abgerufen werden.

 

Command Descriptor Block

  7 6 5 4 3 2 1 0
0 Operation Code = $AD
1 Reserviert Media Type
2 Address
3
4
5
6 Layer Number
7 Format Code
8 Allocation Length
9
10 AGID Reserviert
11 Control

 

Zu setzende Werte:

Operation Code: $AD - READ DISC STRUCTURE Command.

Media Type: Es gibt nur die beiden Werte 0000b für DVD und 0001b für BD. Den Type des eingelegten Mediums kann man mit dem GET CONFIGURATION Command feststellen.

Format Code: $FF - Liste aller Formate, welche für das eingelegte Medium unterstützt werden.

Address, Layer Number und AGID: Die Werte sind vom gewählten Format Code abhängig. Für den Format Code $FF sind die Felder reserviert.

Allocation Length: $FFFE - Die Länge der Antwortstruktur. Hier wird das Maximum eingetragen.

Control - ?

 

Antwortstruktur

  7 6 5 4 3 2 1 0
0 Disc Structure Data Length
1
2 Reserviert
3
  Disc Structure List
0 Structure List
...
N

 
Disc Structure Data Length: Gibt die Länge der folgenden Datenstruktur in Bytes an.

Structure List: Die Einträge in dieser Liste hat diese Struktur:

  7 6 5 4 3 2 1 0
0 Format Code
1 SDS RDS Reserviert
2 Structure Length (Veraltet)

 
Format Code: Gibt den Code für ein unterstütztes Format an, welches mittels der READ DISC STRUCTURE und SEND DISC STRUCTURE commands gelesen bzw. geschrieben werden kann. Dies sind für DVD:

  • $00 - Physische Formatinformationen
  • $01 - DVD Copyright Informationen
  • $02 - Disc Key
  • $03 - BCA Information
  • $04 - DVD Disc Manufacturing Information
  • $05 - Copyright Management Information
  • $06 - Media Identifier
  • $07 - Media Key Block
  • $08 - DVD-RAM Disc Definition Structure (DDS)
  • $09 - DVD-RAM Medium Status
  • $0A - DVD-RAM Spare Area Information
  • $0B - DVD-RAM Recording Type Information
  • $0C - RMD in the last Border-out
  • $0D - Recording Management Area Data
  • $0E - Pre-recorded Information in Lead-in
  • $0F - Unique Disc Identifier
  • $10 - Format Information of Control Data Zone in the Lead-in
  • $11 - ADIP Information
  • $15 - Copyright Data Section from DVD-ROM3 AACS adjusted
  • $20 - DVD+/-R DL and DVD-Download DL Layer Capacity
  • $21 - DVD-R DL Middle Zone start address
  • $22 - DVD-R DL Jump Interval Size
  • $23 - DVD-R DL Manual Layer Jump Address
  • $24 - DVD-R DL Remapping information of the specified Anchor Point
  • $30 - Disc Control Blocks (DCBs)
  • $31 - Read MTA ECC Block

Für DVD und BD:

  • $80 - AACS Volume Identifier
  • $81 - Pre-Recorded AACS Media Serial Number
  • $82 - AACS Media Identifier
  • $83 - AACS Media Key Block
  • $84 - Data Keys of AACS
  • $85 - LBA Extents for Bus Encryption flag of AACS
  • $86 - Media Key Block of CPRM
  • $90 - List of recognized format layers
  • $C0 - Write Protection Status
  • $FF - Disc Structure List

SDS: Gibt an, ob die Struktur mittels SEND DISC STRUCTURE Command geschrieben werden kann.

RDS: Gibt an, ob die Struktur mittels READ DISC STRUCTURE Command gelesen werden kann.

Structure Length: Die Länge der Antwortstruktur des Formates. Im Gegensatz zur Feature List folgt hier keine Antwortstruktur in der angegebenen Länge sondern sofort der nächste Structure List Eintrag.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
  type
    TStructureListEntry = record
      Formatcode      : Byte;
      SCS             : Boolean;
      RDS             : Boolean;
      StructureLength : Word;
    end;
 
  type
    TDiscStructureList = record
      DiscStructureDataLength : Word;
      DiscStructureList       : Array of TStructureListEntry;
    end;
 
  {
  *  Für den Befehl.
  }
  const
    SCSIOP_READ_DISC_STRUCTURE = $AD;
    FMT_DISC_STRUCTURE_LIST    = $FF;
 
  type
    TREAD_DISC_STRUCTURE_CDB = record
      OperationCode    : Byte;
      MediaType        : Byte;
      Address          : Cardinal;
      LayerNumber      : Byte;
      Format           : Byte;
      AllocationLength : Word;
      AGID             : Byte;
      Control          : Byte;
    end;
 
  type
    TREAD_DISC_STRUCTURE_Data_Format = record
      Header : Array[$0000..$0003] of Byte;
      Data   : Array[$0000..$FFF9] of Byte;
    end;
    PREAD_DISC_STRUCTURE_Data_Format = ^TREAD_DISC_STRUCTURE_Data_Format;
          

 

Ausführung und Auswertung

Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet.

 
  function TOptDrives.ReadDiscStructureList(aDevice: THandle): Boolean;
  {*******************************************************************************
  *   READ DISC STRUCTURE Command - Structure List
  }
  var
    READ_DISC_STRUCTURE_CDB : TREAD_DISC_STRUCTURE_CDB;
    pReadDiscStructure      : pREAD_DISC_STRUCTURE_Data_Format;
    aCDB                    : Array of Byte;
    nMediaType              : Byte;
    i                       : Integer;
  begin
    {
    *  Init
    }
    Result := False;
    nMediaType := $FF;
    {
    *  Media Type prüfen
    }
    if GetDVDInDrive or GetHDDVDInDrive
    then nMediaType := 0;
    if GetBDInDrive
    then nMediaType := 1;
    if nMediaType <> $FF
    then begin
      {
      *  Read Structure Info initialisieren.
      }
      FillChar(FDrive[FActive].DiscStructureList,
               SizeOf(FDrive[FActive].DiscStructureList), $00);
      {
      *  Den Command Descriptor Block füllen und übertragen.
      }
      ZeroMemory(@READ_DISC_STRUCTURE_CDB, SizeOf(TREAD_DISC_STRUCTURE_CDB));
      with READ_DISC_STRUCTURE_CDB
      do begin
        OperationCode    := SCSIOP_READ_DISC_STRUCTURE;
        MediaType        := nMediaType;
        Format           := FMT_DISC_STRUCTURE_LIST;
        AllocationLength := SizeOf(TREAD_DISC_STRUCTURE_Data_Format);
      end;
      {
      *  Den Command Descriptor Block übertragen.
      }
      SetLength(aCDB, 12);
      aCDB[0]  := READ_DISC_STRUCTURE_CDB.OperationCode;
      aCDB[1]  := READ_DISC_STRUCTURE_CDB.MediaType and $0F;
      aCDB[7]  := READ_DISC_STRUCTURE_CDB.Format;
      aCDB[8]  := HiByte(READ_DISC_STRUCTURE_CDB.AllocationLength);
      aCDB[9]  := LoByte(READ_DISC_STRUCTURE_CDB.AllocationLength);
      {
      *  Befehl ausführen.
      }
      GetMem(pReadDiscStructure, SizeOf(TREAD_DISC_STRUCTURE_Data_Format));
      Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadDiscStructure,
                                             SizeOf(TREAD_DISC_STRUCTURE_Data_Format));
      if Result then
      with FDrive[FActive].DiscStructureList
      do begin
        DiscStructureDataLength := pReadDiscStructure.Header[0] shl 8 or
                                   pReadDiscStructure.Header[1];
        {
        *  Prüfen, ob Daten folgen.
        }
        if DiscStructureDataLength > 2
        then begin
          {
          *  Liste einstellen und lesen
          }
          SetLength(DiscStructureList, DiscStructureDataLength - 2) div 4);
          for i := 0 to Length(DiscStructureList) - 1
          do begin
            DiscStructureList[i].Formatcode
                                := pReadDiscStructure.Data[i * 4];
            DiscStructureList[i].SDS
                                := pReadDiscStructure.Data[i * 4 + 1] and $80 > 0;
            DiscStructureList[i].RDS
                                := pReadDiscStructure.Data[i * 4 + 1] and $40 > 0;
            DiscStructureList[i].StructureLength
                                := pReadDiscStructure.Data[i * 4 + 2] shl 8 or
                                   pReadDiscStructure.Data[i * 4 + 3];
          end;
        end;
      end;
    end;
  end;
          

 

Demo, welche diese Funktion nutzt.

Disc Structure List (podDiscStructureList.7z - 332 kb) MD5 (1 kb). Stand: 12. August 2013

Änderungen an der Demo

Datum Beschreibung
12.08.2013Das gegenwärtige Profile wurde nicht eingetragen.
26.07.2013Leichte Überarbeitung und neuer Name