Avatar
www.fr-an.de

Medieninformationen

Kapazität

READ CAPACITY Command - Operation Code $25

Mit dem READ CAPACITY Command läßt sich die Kapazität des Mediums feststellen. Es wird in der MMC-6 im Kapitel 6.18 beschrieben.

  7 6 5 4 3 2 1 0
0 Operation Code = $25
1 Reserviert Veraltet
2 Logical Block Address = $00000000
3
4
5
6 Reserviert
7
8 Reserviert PMI = 0
9 Control

 

Zu setzende Werte:

Operation Code: $25 - READ CAPACITY Command.

Logical Block Address und PMI sind bei Multi Media Laufwerken ungenutzt und müssen nicht gesetzt werden.

 

Antwort

Die Antwort ist acht Byte lang:

  7 6 5 4 3 2 1 0
0 Logical Block Address
1
2
3
4 Block Length in Bytes = 2048
5
6
7

 
Logical Block Address
Der Wert ist vom Medium und vom Format abhängig. Er gibt den letzten adressierbaren Nutzdatenblock an. Ist keine vollständige Session auf der Disk beträgt der Wert Null. Für CD-R/RW-Medien wird der $AA-Point aus der letzen TOC verwendet und als LBA konvertiert um eins verringert angegeben. Wenn es ein run-out Block ist, wurde der Wert um zwei verringert. Für DVD-Medien ist es die maximale LBA auf der Disk, welche Daten enthält.
Da die erste Adresse den Wert Null besitzt, muss zur Adresse Eins addiert werden um die Anzahl zu erhalten.

Block Length
Der Wert wird in Byte angegeben und beträgt 2048.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
 
  type
    TReadCapacity = record
      Valid               : Boolean;
      LogicalBlockAddress : Cardinal;
      BlockLengthInBytes  : Cardinal;
    end;
 
  {
  *  Für den Befehl.
  }
 
  const
    SCSIOP_READ_CAPACITY = $25;
        

 

Ausführung und Auswertung

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

 
    ...
 
  begin
 
    ...
 
    {
    *  Den Command Descriptor Block füllen.
    }
    ZeroMemory(@aCDB, SizeOf(aCDB));
    aCDB[0] := SCSIOP_READ_CAPACITY;
    {
    *  Befehl ausführen
    }
    ZeroMemory(@READ_CAPACITY_DATA, SizeOf(READ_CAPACITY_DATA));
    Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, @READ_CAPACITY_DATA,
                                           SizeOf(READ_CAPACITY_DATA));
    if Result
    then begin
      Capacity.Valid := True;
      Capacity.LogicalBlockAddress := READ_CAPACITY_DATA[0] shl 24 or
                                      READ_CAPACITY_DATA[1] shl 16 or
                                      READ_CAPACITY_DATA[2] shl 8 or
                                      READ_CAPACITY_DATA[3];
      Capacity.BlockLengthInBytes  := READ_CAPACITY_DATA[4] shl 24 or
                                      READ_CAPACITY_DATA[5] shl 16 or
                                      READ_CAPACITY_DATA[6] shl 8 or
                                      READ_CAPACITY_DATA[7];
    end;
 
    ...
 
  end;
        

 

Demo, welche diese Funktion nutzt:

Medien Disc Read Capacity (podDiscReadCapa.7z - 263 kb) MD5 (1 kb). Stand: 26. Februar 2012

Änderungen an der Demo

26.02.2012 -
Aktualisiert: Groupbox "Optische Laufwerke".
18.02.2012 -
Fehler: Profilbezeichnung für $001A DVD+R und $001B DVD+RW korrigiert.

 

Fr_An - Erstellt: 12. Februar 2012 - Letzte Änderung: 26. Februar 2012

seit 28. Juli 2010