Home | Kontakt | Sitemap

Start

Über mich

Kontakt

Sitemap

Lizenz

Anleitungen

DVD, miniDVD

SVCD

Audio, Audio-CD (CD-DA)

AVI

Software

Von Freunden und Bekannten

Eigene Programme

Programmierung

Delphi

Lazarus

Delphi/Lazarus

Projekte

MPEG-1/2 Video

Optische Laufwerke

Audio-CD (CDDA)

Raspberry Pi Dashcam

Verschiedenes

MPEG 2 Schnitt

Project X

VCD Easy

Hardlinks

Windows

Links

Software

Projekte | Optische Laufwerke - Hardware - DVD Region

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:

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

Die Werte:

Byte 0: Operation Code - $A4

Byte 1-6: Reserviert

Byte 7: Key Class - $00

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

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 FormatRückgabedatenBeschreibungAGID Nutzung
000000bAGID für CSS/CPPMGibt eine AUTHENTICATION GRANT ID für die Authentication für CSS/CPPM Reserviert & N/A
000001bChallenge KeyGibt einen Challenge KEY zurückGültiger AGID erforderlich
000010bKEY1Gibt einen KEY1 zurück
000100bTITLE KEYGibt einen TITLE KEY zurück (obfuscated by a Bus Key)
000101bASFGibt den gegenwärtigen Status des Authentication Success Flag für CSS/CPPM zurück Reserviert & Ignoriert
001000bRPC StateGibt die DVD Region Einstellungen zurück
010001bAGID for CPRMGibt eine AUTHENTICATION GRANT ID zur Authentication für CPRM zurück Reserviert & N/A
111111bNoneAngegebenen 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 werdenGültige AGID bevorzugt, aber nicht erforderlich
Alle anderen WerteReserved

Byte 11: Control - ?

Die Antwortstruktur:

Report RPC State:

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

TypeCode - Bedeutet:

Type CodeNameBedeutung
00bNONEKeine Region gesetzt.
01bSETRegion ist gesetzt.
10bLAST CHANCERegion ist gesetzt. Unter Auflagen sind Änderungen möglich.
11bPERMRegion 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 SchemeRPC NameBedeutung
00hUnknownLaufwerk hält sich nicht an die Region Playback Controls / DVD-Ländercodes.
01hRPC Phase IILaufwerk hält sich an diesen Standard und alle Voraussetzungen des CSS Lizenzvertrags bezüglich der Region Playback Controls / DVD-Ländercodes.
02h - FFhReserviert

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

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

Capabilities > DVD Region > Mechanism Status