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 | |||||||
Operation Code: $25 - READ CAPACITY Command.
Logical Block Address und PMI sind bei Multi Media Laufwerken ungenutzt und müssen nicht gesetzt werden.
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.
{
* Für die Auswertung.
}
type
TReadCapacity = record
Valid : Boolean;
LogicalBlockAddress : Cardinal;
BlockLengthInBytes : Cardinal;
end;
{
* Für den Befehl.
}
const
SCSIOP_READ_CAPACITY = $25;
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
Fr_An - Erstellt: 12. Februar 2012 - Letzte Änderung: 26. Februar 2012
seit 28. Juli 2010