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

13.08.2013Kleine Überarbeitung und neuer Name