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 - MedienInformationen - Kapazität

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.

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

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:

 76543210
0Logical Block Address
1
2
3
4Block 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

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.

Formatkapazität > Kapazität > Standard Disc Information