Projekte > Optische Laufwerke > 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.

Control - ?

 

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;
 
  type
    TREAD_CAPACITY_CDB = Record
      OperationCode    : Byte;
      AllocationLength : Word;
      Control          : Byte;
    end;
 
  type
    TREAD_CAPACITY_DATA = Array[$00..$07] of Byte;
    PREAD_CAPACITY_DATA = ^TREAD_CAPACITY_DATA;
        

 

Ausführung und Auswertung

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

 
  function TOptDrives.ReadCapacity(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  READ CAPACITY Command.
  }
  var
    READ_CAPACITY_CDB : TREAD_CAPACITY_CDB;
    pReadCapacity     : PREAD_CAPACITY_DATA;
    aCDB              : Array[0..9] of Byte;
  begin
    Result := False;
    {
    *  Standard Disk Information initialisieren.
    }
    FillChar(FDrive[FActive].Capacity, SizeOf(FDrive[FActive].Capacity), $00 );
    {
    *  Bei Multi Media Laufwerken wird beim READ CAPACITY Command nur der
    *  Operation Code benötigt. Die anderen beiden Felder werden nicht genutzt.
    }
    ZeroMemory(@READ_CAPACITY_CDB, SizeOf(TREAD_CAPACITY_CDB));
    READ_CAPACITY_CDB.OperationCode    := SCSIOP_READ_FORMAT_CAPACITIES;
    READ_CAPACITY_CDB.AllocationLength := SizeOf(TREAD_FORMAT_CAPACITIES_DATA);
    {
    *  Den Command Descriptor Block übertragen.
    }
    ZeroMemory(@aCDB, SizeOf(aCDB));
    aCDB[0] := READ_CAPACITY_CDB.OperationCode;
    aCDB[7] := HiByte(READ_CAPACITY_CDB.AllocationLength);
    aCDB[8] := LoByte(READ_CAPACITY_CDB.AllocationLength);
    {
    *  Befehl ausführen.
    }
    GetMem(pReadCapacity, SizeOf(TREAD_CAPACITY_DATA));
    Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadCapacity,
                                           SizeOf(TREAD_CAPACITY_DATA));
    if Result then
    with FDrive[FActive].Capacity
    do begin
      LogicalBlockAddress := pReadCapacity[0] shl 24 or pReadCapacity[1] shl 16 or
                             pReadCapacity[2] shl 8 or pReadCapacity[3];
      BlockLengthInBytes  := pReadCapacity[4] shl 24 or pReadCapacity[5] shl 16 or
                             pReadCapacity[6] shl 8 or pReadCapacity[7];
      Valid               := BlockLengthInBytes > 0;
    end;
    FreeMem(pReadCapacity);
  end;
          

 

Demo, welche diese Funktion nutzt:

Read Capacity (podReadCapacity.7z - 276 kb) MD5 (1 kb). Stand: 13. Juli 2013

Änderungen an der Demo

Datum Beschreibung
13.07.2013Kleine Überarbeitung und neuer Name.
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".
18.02.2012Fehler: Profilbezeichnung für $001A DVD+R und $001B DVD+RW korrigiert.