Projekte > Optische Laufwerke > Hardware

DVD Region

REPORT KEY Command - Operation Code $A4

Multi-Media Commands - 6 Kapitel 6.28. Mit dem REPORT KEY Command sind die Feature DVD CSS (Content Scramble System), DVD CPRM (Content Protection for Recordable Media) und AACS (Advanced Access Content System) verbunden. Dazu gehört der RPC State, das heißt die DVD Region Einstellungen.

Der REPORT KEY Command Descriptor Block:

  7 6 5 4 3 2 1 0
0 Operation Code ($A4)
1 Reserviert
2 Reserviert / Logical Block Address / Starting Offset
3
4
5
6 Reserviert / Block Count Function
7 Key Class
8 Allocation Length
9
10 AGID Key Format
11 Control

 

Die Werte:

Byte 0: Operation Code - $A4

Byte 1-6: Reserviert

Byte 7: Key Class - $00

Key Class Authentication Type
$00 DVD CSS/CPP; oder CPRM
$01 Veraltet
$02 AACS
$03 - $1F Reserviert
$20 Altlast (früher VCPS, siehe Anhang E)
$21 SecurDisc
§22 - $FF Reserviert

 
Byte 8 und 9: Länge der Antwortstruktur - $0008 (siehe unten)

Byte 10 Bit 7 und 6: AGID - 00b

Byte 10 Bit 5 bis 0: Key Format - RPC State - 001000b

Key Format Rückgabedaten Beschreibung AGID Nutzung
000000b AGID für CSS/CPPM Gibt eine AUTHENTICATION GRANT ID für die Authentication für CSS/CPPM Reserviert & N/A
000001b Challenge Key Gibt einen Challenge KEY zurück Gültiger AGID erforderlich
000010b KEY1 Gibt einen KEY1 zurück
000100b TITLE KEY Gibt einen TITLE KEY zurück (obfuscated by a Bus Key)
000101b ASF Gibt den gegenwärtigen Status des Authentication Success Flag für CSS/CPPM zurück Reserviert & Ignoriert
001000b RPC State Gibt die DVD Region Einstellungen zurück
010001b AGID for CPRM Gibt eine AUTHENTICATION GRANT ID zur Authentication für CPRM zurück Reserviert & N/A
111111b None Angegebenen AGID ungültig machen. Dies soll nicht als ein Fehler betrachtet werden. Ein AGID, der nicht gewährt worden ist, soll als ungültig betrachtet werden Gültige AGID bevorzugt, aber nicht erforderlich
Alle anderen Werte Reserved

 

Byte 11: Control - ?

 

Die Antwortstruktur:

Report RPC State:

  7 6 5 4 3 2 1 0
0 REPORT KEY Data Length ($0006)
1
2 Reserviert
3
  RPC State
4 Type Code Vendor Resets Available User Controlled Changes Available
5 Region Mask
6 RPC Scheme
7 Reserved

 

TypeCode - Bedeutet:

Type Code Name Bedeutung
00b NONE Keine Region gesetzt.
01b SET Region ist gesetzt.
10b LAST CHANCE Region ist gesetzt. Unter Auflagen sind Änderungen möglich.
11b PERM Region kann nicht mehr geändert werden. Sie kann vom Hersteller zurückgesetzt werden.

 
Vendor Resets Available und User Controlled Changes Available - Sind Zähler, welche von 5 herunterzählen und geben an, wie oft die Änderungen vom Hersteller wiederhergestellt und wieviele Änderungen der Anwender bis zur nächsten Wiederherstellung durch den Hersteller noch vornehmen kann.

RPC Mask - Gibt die Region an, auf welche das Laufwerk gesetzt ist. Da die Angaben zu den Werten schwanken, fehlt hier eine Tabelle.

RPC Scheme - Bedeutet:

RPC Scheme RPC Name Bedeutung
00h Unknown Laufwerk hält sich nicht an die Region Playback Controls / DVD-Ländercodes.
01h RPC Phase II Laufwerk hält sich an diesen Standard und alle Voraussetzungen des CSS Lizenzvertrags bezüglich der Region Playback Controls / DVD-Ländercodes.
02h FFh Reserviert

 
RPC Phase II bedeutet, dass die RPC in der Hardware und der Firmware implementiert sein muss und betrifft Laufwerke, welche seit dem Jahr 2000 hergestellt wurden. RPC Phase I war nur in der Software implementiert.

 

Deklarationen

Für die Ausführung:

 
  const
    SCSIOP_REPORT_KEY    = $A4;
    KEY_FORMAT_RPC_STATE = 8;
 
  type
    TREPORT_KEY_CDB = Record
      OperationCode       : Byte;
      Reserved1           : Byte;
      LogicalBlockAddress : Array[0..3] of Byte;
      Reserved2           : Byte;
      KeyClass            : Byte;
      AllocationLength    : Word;
      AGID_KeyFormat      : Byte; // 0-5 = Keyformat, 6-7 AGID
      Control             : Byte;
    end;
 
  type
    TREPORT_KEY_DATA_RPC_STATE = Record
      REPORT_KEY_Data_Length : Word;
      Reserved1              : Array[2..3] of Byte;
      RPC_State              : Byte;
      Region_Mask            : Byte;
      RPC_Scheme             : Byte;
      Reserved2              : Byte;
    end;
    PREPORT_KEY_DATA_RPC_STATE = ^TREPORT_KEY_DATA_RPC_STATE;
          

Für die Auswertung:

 
  const
    {
    *  Type Code Field Definitions
    }
    TCFD_NONE        = $00;
    TCFD_SET         = $01;
    TCFD_LAST_CHANCE = $02;
    TCFD_PERM        = $03;
 
  const
    {
    *  RPC Scheme Field Definition
    }
    RSFD_Unknown      = $00;
    RSFD_RPC_Phase_II = $01;
 
  type
    TDVDRegion = record
      User_changes  : Byte;
      Vendor_resets : Byte;
      Type_code     : Byte;
      Region_mask   : Byte;
      RPC_scheme    : Byte;
    end;
        

 

Ausführung

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

 
  function TOptDrives.ReadReportKeyRPCState(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  DVD Region - RPC State.
  }
  var
    REPORT_KEY_CDB : TREPORT_KEY_CDB;
    aCDB           : Array of Byte;
    pReportKeyData : PREPORT_KEY_DATA_RPC_STATE;
  begin
    Result := False;
    {
    *  DVD Region initialisieren.
    }
    FillChar(FDrive[FActive].DVDRegion, SizeOf(FDrive[FActive].DVDRegion), $FF);
    {
    *  Den Command Descriptor Block füllen.
    }
    ZeroMemory(@REPORT_KEY_CDB, SizeOf(REPORT_KEY_CDB));
    REPORT_KEY_CDB.OperationCode    := SCSIOP_REPORT_KEY;
    REPORT_KEY_CDB.KeyClass         := $00;
    REPORT_KEY_CDB.AllocationLength := SizeOf(TREPORT_KEY_DATA_RPC_STATE);
    REPORT_KEY_CDB.AGID_KeyFormat   := KEY_FORMAT_RPC_STATE;
    {
    *  Den Command Descriptor Block übertragen.
    }
    SetLength(aCDB, 12);
    aCDB[0]  := REPORT_KEY_CDB.OperationCode;
    aCDB[1]  := REPORT_KEY_CDB.Reserved1;
    aCDB[2]  := REPORT_KEY_CDB.LogicalBlockAddress[0];
    aCDB[3]  := REPORT_KEY_CDB.LogicalBlockAddress[1];
    aCDB[4]  := REPORT_KEY_CDB.LogicalBlockAddress[2];
    aCDB[5]  := REPORT_KEY_CDB.LogicalBlockAddress[3];
    aCDB[6]  := REPORT_KEY_CDB.Reserved2;
    aCDB[7]  := REPORT_KEY_CDB.KeyClass;
    aCDB[8]  := REPORT_KEY_CDB.AllocationLength;
    aCDB[10] := REPORT_KEY_CDB.AGID_KeyFormat;
    aCDB[11] := REPORT_KEY_CDB.Control;
    {
    *  Befehl ausführen
    }
    GetMem(pReportKeyData, SizeOf(TREPORT_KEY_DATA_RPC_STATE));
    if GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReportKeyData,
                                    SizeOf(TREPORT_KEY_DATA_RPC_STATE))
    then begin
      with FDrive[FActive].DVDRegion
      do begin
        User_changes  := pReportKeyData.RPC_State and $07;
        Vendor_resets := pReportKeyData.RPC_State shr 3 and $07;
        Type_code     := pReportKeyData.RPC_State shr 6;
        Region_mask   := pReportKeyData.Region_Mask xor $FF;
        RPC_scheme    := pReportKeyData.RPC_Scheme + 1<;
      end;
      {
      *  Ergebnis
      }
      Result := True;
    end;
    FreeMem(pReportKeyData);
  end;
          

Demo, welche diese Funktion nutzt:

DVD Region (podDVDRegion.7z - 253 kb) MD5 (1 kb). Stand: 30. Juni 2013

Änderungen an der Demo

Datum Beschreibung
30.06.2013Kleine Überarbeitung und neuer Name.
02.01.2012In der function GET_SCSI_PASS_THROUGH_DIRECT wurde das Handle nicht geschlossen.