Projekte > Optische Laufwerke > Medieninformationen

Standard Disc Information

READ DISC INFORMATION Command - Operation Code $51

Mit dem READ DISC INFORMATION Command erhält man Informationen zum eingelegten Medium. Hier soll die Standard Disc Information ausgelesen werden. Das READ DISC INFORMATION Command wird in der MMC-6 im Kapitel 6.21 beschrieben. Der READ DISC INFORMATION Command Descriptor Block ist in Kapitel 6.21.2 dargestellt:

  7 6 5 4 3 2 1 0
0 Operation Code = $51
1 Reserviert Data Type = 000b
2 Reserviert
3
4
5
6
7 Allocation Length
8
9 Control

 

Zu setzende Werte:

Operation Code: $51 - READ DISC INFORMATION Command.

Data Type: 000b

Data Type Antwortdaten
000b Standard Disc Information
001b Track Resource Information
010b POW Resources Information
011b..111b Reserviert

 
Allocation Length: $081A - Die Länge ergibt sich aus der unten dargestellten Antwortstruktur.

Control - ?

 

Antwortstruktur

Die Beschreibung ist in MMC-6 in Kapitel 2.21.3.1 enthalten. Der Disc Information Block ist 34 plus ein vielfaches von acht lang. Er hat keine feste Länge. Unter Beachtung der Datentypen für die Längenangeben und der Annahme, das es nur eine Beschreibung gibt, ergibt sich 255 ($FF) * 8 + 34 = 2074 ($081A).

  7 6 5 4 3 2 1 0
0 Disc Information Length
1
2 Disc Information Type 000b Erasable State of last Session Disc Status
3 Number of First Track on Disc
4 Number of Sessions (Unteres Byte)
5 First Track Number in Last Session (Unteres Byte)
6 Last Track Number in Last Session (Unteres Byte)
7 DID_V DBC_V URU DAC_V Reserviert Dbit BG Format Status
8 Disc Type
9 Number of Sessions (Oberes Byte)
10 First Track Number in Last Session (Oberes Byte)
11 Last Track Number in Last Session (Oberes Byte)
12 Disc Identification Number
13
14
15
16 Last Session Lead-In Start Address
17
18
19
20 Last Possible Lead-Out Start Address
21
22
23
24 Disc Bar Code
25
26
27
28
29
30
31
32 Disc Application Code
33 Number of OPC Tables
34..n OPC Table Entries

 
Disc Information Length Gibt die Länge der folgenden Datenstruktur in Bytes an. Sie beträgt 32 plus ein vielfaches von acht.

Disc Information Data Type: Dieser Wert muss entsprechend der Anfrage 000b Standard Disc Information sein.

Erasable Bit: Gibt an, ob das Medium wiederbeschreibbar (CD-RW, DVD-RAM, DVD-RW, DVD+RW, BD-RE) ist.

State of Last Session: Gibt den Status der letzten Session unabhängig der Anzahl der Sessions an.

Session State Definition
00b Leere Session
01b Unvollständige Session. Bei DVD-RW im eingeschränkten Überschreibmodus wenn die letzte Sitzung im Zwischenzustand ist.
10b Bei DVD-R und DVD-RW Medien ist die Session beschädigt oder die Finalisation wurde nicht abgeschlossen. Für andere Medien ist der Wert reserviert.
11b Vollständige Session. Ist nur gültig wenn der Wert für Disc Status 10b oder 11b beträgt. Beschriebene DVD+RW geben diesen Wert zurück.

 
Disc Status: Gibt den Status der Disc an:

Status Definition Beschreibung
00b Leere Disc Die Disc ist beschreibbar und ist physisch oder logisch leer.
01b Unvollständige Disc Die eingelegte Disc ist seriell in Sessions beschreibbar. Die letzte Session ist leer oder teilweise beschrieben. Wenn die Disc im eingeschränkten Überschreibmodus und im Zwischenzustand ist, wird dieser Code unabhängig vom Schreibschutz-Status zurückgegeben. Für die anderen Medien wird dieser Code reserviert.
10b Abgeschlossene Disc Die Disc ist finalisiert, es können keine Daten mehr hinzugefügt werden. Wenn die Disc im eingeschränkten Überschreibmodus und komplett ist, wird dieser Code unabhängig vom Schreibschutz-Status zurückgegeben. Bei nicht beschreibbaren Medien wird dieser Code wird zurückgegeben.
11b Andere Dieser Code ist für andere sequentiell beschreibbare und eingeschränkt überschreibbare Medien reserviert. In allen anderen Fällen ist das Medium weder ein sequentiell beschreibbares noch ein eingeschränkt überschreibbares Medium und die Disc ist nicht schreibgeschützt

 
Number of First Track on Disc: Das ist die Tracknumber des logischen Tracks welcher LBA 0 enthält. Der Wert berichtet auf dem Sektorformat und den Aufnahmestatus basierend:
a) Für CD-ROM ist der Wert die niedrigste Tracknummer, welche im ersten TOC eingetragen ist.
b) Für als ROM beschriebene CD-R/RW (d. h. der PMA ist leer, aber die erste TOC geschrieben), ist der Wert die niedrigste Tracknummer, welche im ersten TOC eingetragen ist.
c) Für CD-R/RW, deren PMA nicht leer ist, ist der Wert die niedrigste Tracknummer, welche in der PMA eingetragen ist.
d) Für CD-R/RW, deren PMA und erste TOC leer sind, ist der Wert 1.
e) Für alle anderen Medien ist der Wert unabhängig vom Aufnahmestatus 1.

Number of Sessions: Die Anzahl der Sessions ist die Anzahl der vollständigen Sessions zuzüglich der unvollständigen/leeren Session. Wenn der Disc Status leer ist, ist die Anzahl der Sessions 1. Bei Disctypen, welche das Track/Session Aufnahemmodell nicht unterstützen, ist die Anzahl der Sessions auf 1 gesetzt.

First Track Number in Last Session: Ist die Tracknummer des ersten logischen Tracks in der letzten Session. Dies schließt die unvollständigen logischen Tracks ein. Der Wert ist in der Antwort auf zwei Felder aufgeteilt.

Last Track Number in Last Session: Ist die Tracknummer des letzten logsichen Tracks in der letzten Session. Dies schließt die unvollständigen logischen Tracks ein. Der Wert ist in der Antwort auf zwei Felder aufgeteilt.

DID_V Bit: Gibt an, ob das Disc Identification Feld gültig ist.

DBC_V Bit: Gibt an, ob das Disc Bar Code Feld gültig ist.

URU - Unrestricted Use Disc: Gibt an, ob die Disc für den uneingeschränkten Gebrauch bestimmt ist. Bei eingeschränktem Gebrauch wird die passende Host-Anwendungscodeliste der Write Parameter Page benötigt. Bei speziell genutzten CD-R, CD-RW oder DVD-R Medien ist der Wert 0, bei allen anderen 1.

DAC_V Bit: Gibt an, ob der Disc Application Code gültig ist.

Dbit: Bis MMC-5 war es die Kopie des "Dirty bit" aus der Defekttabelle.

BG (Background) Format Status: Ist der Hintergrundformatstatus der Disc. Für Laufwerke, die sowohl das Formattable Feature als auch das DVD+RW Feature melden, ist es erforderlich das sie eine Hintergrundformattierung durchführen können. Für alle anderen Laufwerke soll der Wert 00b sein.

Background
Format Status
Bedeutung
00b Wenn eine der Bedingungen zutrifft:
  • Die Disc ist weder CD-RW noch DVD+RW.
  • Die Disc ist eine CD-RW, welche nicht als CD-MRW (Mount Rainier reWritable) formatiert ist.
  • Die Disc ist eine DVD+RW, welche leer ist.
01b Die Hintergrundformatierung wurde gestartet, läuft gegenwärtig nicht und noch nicht abgeschlossen.
10b Eine Hintergrundformatierung ist im Fortschritt. Eine Formatierung wurde gestartet oder fortgesetzt und ist noch nicht vollständig.
11b Hintergrundformattierung ist vollständig.

 
Disc Type: Der Wert gilt nur für CD Medien. Für alle anderen Medien ist dieses Feld $00. Der Disc Type gibt den Typ der auf der CD enthaltenen Daten an und wird aus demr PMA oder der TOC der ersten Session ermittelt.

Code Bedeutung
$00 CD-DA oder CD-ROM
$10 CD-I
$20 CD-ROM XA
$FF Undefiniert (Z. B. bei Initialiserung)
Alle anderen Reserviert

 
Disc Identification Number: Für CD-R/RW wird die im PMA registrierte Disc Identification Number zurückgegeben. Die Disc Identification Number ist im PMA als sechsstellige BCD-Anzahl eingetragen. Sie wird im Disc Information Block als 32-Bit-Dualzahl zurückgegeben. Für alle anderen Medien sollte der Wert 0 betragen.

Last Session Lead-In Start Address: Diese ist abhängig vom Medium und Aufnahmestatus. Für CD-R/RW ist es die MSF Adresse, an welcher das nächste Lead-In geschrieben wird. Ist die Disc vollständig wird die Adresse $FF, $FF, $FF, $FF zurückgegeben. Für DVD+RW ist es die LBA, an welcher die nächste Aufnahme beginnt. Ist die Disc vollständig wird der Wert $FFFFFFFF zurückgegeben. Für alle anderen Medien ist der Wert 0.

Last possible Lead-Out Start Address: Diese ist abhängig vom Medium und Aufnahmestatus. Für CD-R/RW ist die letztmögliche Lead-Out Startadresse im ATIP des Lead-In im MSF Format angegeben. Bei vollständigen Discs ist dies $FF:$FF:$FF:$FF. Bei hochkapazitiven CDs ist dies die Startzeit für die zusätzliche Kapazität und die zusätzliche Erweiterung. Bei einer Session ist die Lead-Out Größe 90 bei mehreren Sessions 30 Sekunden groß. Für DVD+R Medien ist es die LBA aus dem ADIP des Lead-In. Bei vollständigen Discs ist die Startadresse $FFFFFFFF. Für alle anderen Medientypen ist das Feld mit Nullen gefüllt.

Disc Bar Code: Für CDs enthält dieses Feld einen hexadezimalen Wert, wenn das Laufwert den Disc Bar Code lesen kann und der Code vorhanden ist.

Disc Application Code: Wenn es keinen Code gibt, ist der Wert 0.

Number of OPC (Optimum Power Calibration) Tables: Die Anzahl der folgenden OPC Tabellen. Wenn OPC nicht für das Medium vorgesehen sind ist die Anzahl Null. Die Anzahl der OPC Tabellen repräsentiert die Geschwindigkeiten der Disc für welche OPC Werte bekannt sind.

OPC (Optimum Power Calibration) Table: Wird nur beigefügt, wenn die Werte für die Disc bekannt sind. Für jede Aufnahme/Schreib-Geschwindigkeit gibt es eine Tabelle.

  7 6 5 4 3 2 1 0
0 Speed
1
2 OPC
Werte
3
4
5
6
7

 
Die Geschwindigkeit wird in Kilobyte je Sekunde angegeben. Die OPC Werte sind herstellerabhängig.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
  type
    TOPCTableEntry = Record
      Speed     : Word;
      OPCValues : Array[0..5] of Byte;
    end;
 
    TDiscInformationBlock = Record
      DiscInformationLength           : Word;
      DiscInformationDataType         : Byte;
      Erasable                        : Boolean;
      StateOfLastSession              : Byte;
      DiscStatus                      : Byte;
      NumberOfFirstTrackOnDisc        : Byte;
      NumberOfSessions                : Word;
      FirstTrackNumberInLastSession   : Word;
      LastTrackNumberInLastSession    : Word;
      DID_V                           : Boolean;
      DBC_V                           : Boolean;
      URU                             : Boolean;
      DAC_V                           : Boolean;
      BGFormatStatus                  : Byte;
      DiscType                        : Byte;
      DiscIdentification              : Cardinal;
      LastSessionLeadInStartAddress   : TAddress;
      LastPossibleLeadOutStartAddress : TAddress;
      DiscBarCode                     : AnsiString;
      DiscApplicationCode             : Byte;
      NumberOfOPCTables               : Byte;
      OPCTableEntries                 : Array of TOPCTableEntry;
    end;
 
  {
  *  Für den Befehl.
  }
 
  const
    SCSIOP_READ_DISC_INFORMATION = $51;
 
    RDI_STANDARD_DISC_INFORMATION = $00;
    RDI_TrackResourceInformation  = $01;
    RDI_POWResourcesInformation   = $02;
 
  type
    TREAD_DISC_INFORMATION_CDB = Record
      OperationCode      : Byte;
      DataType           : Byte;
      AllocationLength   : Word;
      Control            : Byte;
    end;
 
    TREAD_DISC_INFORMATION_DATA = Array[$0000..$0819] of Byte;
    PREAD_DISC_INFORMATION_DATA = ^TREAD_DISC_INFORMATION_DATA;
        

 

Ausführung und Auswertung

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

 
  function TOptDrives.ReadStandardDiscInformation(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  READ DISC INFORMATION Command - Standard Disc Information.
  }
  var
    READ_DISC_INFORMATION_CDB  : TREAD_DISC_INFORMATION_CDB;
    pReadDiscInformationData   : PREAD_DISC_INFORMATION_DATA;
    aCDB                       : Array[0..9] of Byte;
    i                          : Integer;
  begin
    Result := False;
    {
    *  Standard Disk Information initialisieren.
    }
    FillChar(FDrive[FActive].DiscInformation,
             SizeOf(FDrive[FActive].DiscInformation), $00);
    {
    *  Den Command Descriptor Block füllen.
    }
    ZeroMemory(@READ_DISC_INFORMATION_CDB, SizeOf(TREAD_DISC_INFORMATION_CDB));
    with READ_DISC_INFORMATION_CDB
    do begin
      OperationCode    := SCSIOP_READ_DISC_INFORMATION;
      DataType         := RDI_STANDARD_DISC_INFORMATION;
      AllocationLength := SizeOf(TREAD_DISC_INFORMATION_DATA);
    end;
    {
    *  Den Command Descriptor Block übertragen.
    }
    ZeroMemory(@aCDB, SizeOf(aCDB));
    aCDB[0] := READ_DISC_INFORMATION_CDB.OperationCode;
    aCDB[1] := READ_DISC_INFORMATION_CDB.DataType and $07;
    aCDB[7] := HiByte(READ_DISC_INFORMATION_CDB.AllocationLength);
    aCDB[8] := LoByte(READ_DISC_INFORMATION_CDB.AllocationLength);
    {
    *  Befehl ausführen.
    }
    GetMem(pReadDiscInformationData, SizeOf(TREAD_DISC_INFORMATION_DATA));
    if GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadDiscInformationData,
                                    SizeOf(TREAD_DISC_INFORMATION_DATA)) then
    with FDrive[FActive].DiscInformation
    do begin
      DiscInformationLength := pReadDiscInformationData[0] shl 8 or
                               pReadDiscInformationData[1];
      {
      *  Prüfen, ob Daten folgen.
      }
      if (DiscInformationLength >= 32)
      and (pReadDiscInformationData[2] and $E0 = RDI_STANDARD_DISC_INFORMATION)
      then begin
        DiscInformationDataType       := pReadDiscInformationData[2] and $E0 shr 5;
        Erasable                      := pReadDiscInformationData[2] and $10 > 0;
        StateOfLastSession            := pReadDiscInformationData[2] and $0C shr 2;
        DiscStatus                    := pReadDiscInformationData[2] and $03;
        NumberOfFirstTrackOnDisc      := pReadDiscInformationData[3];
        NumberOfSessions              := pReadDiscInformationData[9]  shl 8 or
                                         pReadDiscInformationData[4];
        FirstTrackNumberInLastSession := pReadDiscInformationData[10] shl 8 or
                                         pReadDiscInformationData[5];
        LastTrackNumberInLastSession  := pReadDiscInformationData[11] shl 8 or
                                         pReadDiscInformationData[6];
        DID_V                         := pReadDiscInformationData[7] and $80 > 0;
        DBC_V                         := pReadDiscInformationData[7] and $40 > 0;
        URU                           := pReadDiscInformationData[7] and $20 > 0;
        DAC_V                         := pReadDiscInformationData[7] and $10 > 0;
        BGFormatStatus                := pReadDiscInformationData[7] and $03;
        DiscType                      := pReadDiscInformationData[8];
        if DID_V
        then DiscIdentification := pReadDiscInformationData[12] shl 24 or
                                   pReadDiscInformationData[13] shl 16 or
                                   pReadDiscInformationData[14] shl 8 or
                                   pReadDiscInformationData[15];
        LastSessionLeadInStartAddress[0]   := pReadDiscInformationData[16];
        LastSessionLeadInStartAddress[1]   := pReadDiscInformationData[17];
        LastSessionLeadInStartAddress[2]   := pReadDiscInformationData[18];
        LastSessionLeadInStartAddress[3]   := pReadDiscInformationData[19];
        LastPossibleLeadOutStartAddress[0] := pReadDiscInformationData[20];
        LastPossibleLeadOutStartAddress[1] := pReadDiscInformationData[21];
        LastPossibleLeadOutStartAddress[2] := pReadDiscInformationData[22];
        LastPossibleLeadOutStartAddress[3] := pReadDiscInformationData[23];
        if DiscInformation.DBC_V
        then begin
          DiscBarCode := HexStr(pReadDiscInformationData[24]);
          for i := 25 to 31
          do DiscBarCode := DiscBarCode + HexStr(pReadDiscInformationData[i]);
        end;
        DiscApplicationCode := pReadDiscInformationData[32];
        NumberOfOPCTables   := pReadDiscInformationData[33];
      end;
      Result := True;
    end;
  end;
          

 

Demo, welche diese Funktion nutzt:

Standard Disc Information (podSatandardDiscInformation.7z - 284 kb) MD5 (1 kb). Stand: 17. Juli 2013

Änderungen an der Demo

Datum Beschreibung
17.07.2013>Kleine Überarbeitung und neuer Name.
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".
18.02.2012Fehler: Profilbezeichnung für $001A DVD+R und $001B DVD+RW korrigiert.