Projekte > Optische Laufwerke > Medieninformationen

DVD Copyright Informationen

READ DISC STRUCTURE Command - Operation Code $AD
DVD Copyright Information - Format Code $01

Wenn der Format Code für die DVD Copyright Informationen in der Liste der unterstützten Formate aufgeführt und das RDS-Flag gesetzt ist, kann es gelesen 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: $01 - DVD Copyright Informationen für das eingelegte Medium.

Address, Layer Number und AGID: Die Werte sind vom gewählten Format Code abhängig. Für den Format Code $00 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
  DVD Copyright Information
0 Copyright Protection System Type
1 Region Management Information
2 Reserviert
3

 
Disc Structure Data Length: Länge der folgenden Datenstruktur. Diese hat eine feste Länge von acht Byte. Der Wert muss sechs betragen, wenn das Format gültig ist.

Copyright Protection System Type: Gibt den Typ der gefundenen DVD Kopierschutzdatenstruktur an:

Wert Beschreibung
$00 Es wurde keine Datenstruktur gefunden.
$01 Es wurde eine Datenstruktur für CSS/CPPM gefunden.
$02 Es wurde eine Datenstruktur für CPRM gefunden.
$10 Es wurde eine Datenstruktur für AACS mit BD Inhalt gefunden.
Andere Reserviert

 
Region Management Information: Gibt die Regionalcodes an, bei welchen die DVD nicht abgespielt werden darf. Jedes Bit stellt eine von acht Regionen dar.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
  type
    TDVDCopyrightInformation = record
      DiscStructureDataLength       : Word;
      CopyrightProtectionSystemType : Byte;
      RegionManagementInformation   : Byte;
    end;
 
  {
  *  Für den Befehl.
  }
  const
    SCSIOP_READ_DISC_STRUCTURE    = $AD;
    FMT_DVD_COPYRIGHT_INFORMATION = $01;
 
  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;
 
          

 

Ausführung und Auswertung

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

 
  function TOptDrives.DVDCopyrightInformation(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  READ DISC STRUCTURE Command - DVD Copyright Information
  }
  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. Nur DVD.
    }
    if GetConfiguration_DVDInDrive or GetConfiguration_HDDVDInDrive
    then nMediaType := 0;
    {
    *  Media Type prüfen
    }
    if nMediaType <> $FF
    then begin
      {
      *  DVD Copyright Information initialisieren.
      }
      FillChar(FDrive[FActive].DVDCopyrightInfo,
               SizeOf(FDrive[FActive].DVDCopyrightInfo), $00);
      {
      *  Den Command Descriptor Block füllen.
      }
      ZeroMemory(@READ_DISC_STRUCTURE_CDB, SizeOf(TREAD_DISC_STRUCTURE_CDB));
      with READ_DISC_STRUCTURE_CDB
      do begin
        OperationCode    := SCSIOP_READ_DISC_STRUCTURE;
        Format           := FMT_DVD_COPYRIGHT_INFORMATION;
        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].DVDCopyrightInfo
      do begin
        DataLength := pReadDiscStructure.Header[0] shl 8 or
                      pReadDiscStructure.Header[1];
        {
        *  Prüfen, ob Daten folgen.
        }
        if DataLength > 2
        then begin
          CopyrightProtectionSystemType := pReadDiscStructure.Data[0];
          RegionManagementInformation   := pReadDiscStructure.Data[1];
        end;
      end;
    end;
  end;
          

Demo, in welcher diese Funktion in ähnlicher Form genutzt wird:

DVD Copyright Information (podDVDCopyright.7z - 301 kb) MD5 (1 kb). Stand: 13. August 2013

Änderungen an der Demo

Datum Beschreibung
13.08.2013Kleine Überarbeitung und neuer Name