Mit dem INQUIRY Command - Operation Code $12 werden die Informationen zur Identififizierung des Laufwerks ermittelt. Das Command ist mit dem Core Feature verbunden. Das Command ist in Multi-Media Commands - 6 Kapitel 6.8 erwähnt und wird in den SCSI Primary Commands- 3 (SPC-3) beschrieben. Nach T10 ist Revision 23 vom 4. Mai 2005 aktuell. Dort ist es in Kapitel 6.4 (Seite 142) beschrieben. Im Kapitel Ermittlung der Laufwerke - SCSI Pass Through Interface wird der Operation Code bereits verwendet.
Der INQUIRY Command Descriptor Block:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Operation Code ($12) | |||||||
| 1 | Reserviert | Obsolete | EVPD | |||||
| 2 | PAGE CODE | |||||||
| 3 | ALLOCATION LENGTH | |||||||
| 4 | ||||||||
| 5 | Control | |||||||
Byte 0: Operation Code - $12
Byte 1: EVPD - 0b Standardinformationen. Mit 1b sollen sich Vital Product Data Informationen abrufen lassen. Dies hat bei meinen Laufwerken jedoch nicht funktioniert.
Byte 2: PAGE CODE - $00 Wird nur gesetzt, wenn EVPD 1b ist.
Byte 3 und 4: Länge der Antwortstruktur - Wenn EVPD 0b ist, muss sie mindestens fünf sein, weil im fünften Byte die Länge der Antwortstruktur angegeben ist. DeviceIoControl schlägt jedoch fehl, wenn die Antwortstruktur zu klein ist und/oder zu klein angegeben wird.
Byte 5: Control - ?
Die Werte werden ein- und übertragen. Das Beispiel ist vielleicht etwas umständlich, aber übersichtlicher und eben nur ein Beispiel:
const
SCSIOP_INQUIRY = $12;
type
TSCSI_INQUIRY_CDB = record
OperationCode : Byte;
EVPD : Byte;
PageCode : Byte;
AllocationLength : Word;
Control : Byte;
end;
...
begin
...
{
* Den Command Descriptor Block füllen.
}
ZeroMemory(@SCSI_INQUIRY_CDB, SizeOf(SCSI_INQUIRY_CDB));
SCSI_INQUIRY_CDB.OperationCode := SCSIOP_INQUIRY;
SCSI_INQUIRY_CDB.AllocationLength := 5;
{
* Den Command Descriptor Block übertragen.
}
SetLength(aCDB, 6);
aCDB[0] := SCSI_INQUIRY_CDB.OperationCode;
aCDB[1] := SCSI_INQUIRY_CDB.EVPD;
aCDB[2] := SCSI_INQUIRY_CDB.PageCode;
aCDB[3] := HiByte(SCSI_INQUIRY_CDB.AllocationLength);
aCDB[4] := LoByte(SCSI_INQUIRY_CDB.AllocationLength);
aCDB[5] := SCSI_INQUIRY_CDB.Control;
...
end;
Diese Struktur soll mindestens 36 Byte enthalten. Ein Maximum scheint nicht vorgesehen zu sein.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Peripheral Qualifier | Peripheral Device Type | ||||||
| 1 | RMB | Reserviert | ||||||
| 2 | Version | |||||||
| 3 | Obsolete | Obsolete | NormACA | HiSup | Response Data Format | |||
| 4 | Additional Length (n-4) | |||||||
| 5 | SCCS | ACC | TPGS | 3ps | Reserviert | Protect | ||
| 6 | BQue | EncServ | VS | MultiP | MChngr | Obsolete | Obsolete | Addr16a |
| 7 | Obsolete | Obsolete | Wbus16a | Synca | Linked | Obsolete | CmdQue | VS |
| 8 | T10 Vendor Identification | |||||||
| 15 | ||||||||
| 16 | Product Identification | |||||||
| 31 | ||||||||
| 32 | Product Revision Level | |||||||
| 35 | ||||||||
| 36 | Vendor specific | |||||||
| 55 | ||||||||
| 56 | Reserviert | Clockinga | Qasa | Iusa | ||||
| 57 | Reserviert | |||||||
| 58 | Version Descriptor 1 | |||||||
| 59 | ||||||||
| . . . |
||||||||
| 72 | Version Descriptor 8 | |||||||
| 73 | ||||||||
| 74 | Reserviert | |||||||
| 95 | ||||||||
| 96 | Vendor specific | |||||||
| n | ||||||||
| a Die Bedeutungen dieser Felder sind zu SPI-5 spezifisch. Für SCSI Übertragungsprotokolle mit Ausnahme des SCSI Parallel Interface sind diese Felder reserviert. | ||||||||
type
TINQUIRY_STANDARD_DATA = record
Peripheral_Qual_DevType : Byte;
RMB_Reserved0 : Byte;
Version : Byte;
NACA_HiSup_ResDataFrmt : Byte;
AdditionalLength : Byte;
Data0 : array[5..7] of Byte;
T10VendorIdentification : array[0..7] of Char;
ProductIdentification : array[0..15] of Char;
ProductRevisionLevel : array[0..3] of Char;
VendorSpecific0 : array[0..19] of Char;
Data1 : Byte;
Reserved1 : Byte;
VersionDescriptor : array[1..8] of Word;
Reserved2 : array[0..20] of Byte;
VendorSpecific1 : array[0..3] of Byte;
end;
Nach der Ausführung wird die Antwortstruktur ausgewertet.
type
TDeviceInfo = record
Peripheral_Qualifier : Byte;
Peripheral_DevType : Byte;
Removable_Medium : Boolean;
Version : Byte;
NormACA : Boolean;
HiSup : Boolean;
ResDataFrmt : Byte;
SCCS : Boolean;
ACC : Boolean;
TPGS : Byte;
Thirdps : Boolean;
Protect : Boolean;
BQue : Boolean;
EncServ : Boolean;
MultiP : Boolean;
MChngr : Boolean;
Addr16 : Boolean;
Wbus16 : Boolean;
Sync : Boolean;
Linked : Boolean;
CmdQue : Boolean;
T10VendorIdentification : AnsiString;
ProductIdentification : AnsiString;
ProductRevisionLevel : AnsiString;
VendorSpecific0 : AnsiString;
Clocking : Byte;
Qas : Boolean;
Ius : Boolean;
VersionDescriptor : Array[1..8] of Word;
end;
...
begin
...
{
* Befehl ausführen
}
if GET_SCSI_PASS_THROUGH_DIRECT(aDrive, aCDB, @InquiryData,
SizeOf(TINQUIRY_STANDARD_DATA)) then
with DeviceInfo
do begin
Peripheral_Qualifier := InquiryData.Peripheral_Qual_DevType shr 5;
Peripheral_DevType := InquiryData.Peripheral_Qual_DevType and $1F;
Removable_Medium := InquiryData.RMB_Reserved0 and $80 > 0;
Version := InquiryData.Version;
NormACA := InquiryData.NACA_HiSup_ResDataFrmt and $20 > 0;
HiSup := InquiryData.NACA_HiSup_ResDataFrmt and $10 > 0;
ResDataFrmt := InquiryData.NACA_HiSup_ResDataFrmt and $0F;
SCCS := InquiryData.Data0[5] and $80 > 0;
ACC := InquiryData.Data0[5] and $40 > 0;
TPGS := InquiryData.Data0[5] and $30 shr 4;
Thirdps := InquiryData.Data0[5] and $08 > 0;
Protect := InquiryData.Data0[5] and $01 > 0;
BQue := InquiryData.Data0[6] and $80 > 0;
EncServ := InquiryData.Data0[6] and $40 > 0;
MultiP := InquiryData.Data0[6] and $10 > 0;
MChngr := InquiryData.Data0[6] and $08 > 0;
Addr16 := InquiryData.Data0[6] and $01 > 0;
Wbus16 := InquiryData.Data0[7] and $20 > 0;
Sync := InquiryData.Data0[7] and $10 > 0;
Linked := InquiryData.Data0[7] and $08 > 0;
CmdQue := InquiryData.Data0[7] and $02 > 0;
T10VendorIdentification := InquiryData.T10VendorIdentification;
ProductIdentification := InquiryData.ProductIdentification;
ProductRevisionLevel := InquiryData.ProductRevisionLevel;
VendorSpecific0 := Trim(InquiryData.VendorSpecific0);
Clocking := InquiryData.Data1 and $0C shr 2;
Qas := InquiryData.Data1 and $02 > 0;
Ius := InquiryData.Data1 and $01 > 0;
for i := 1 to 8
do VersionDescriptor[i] := (InquiryData.VersionDescriptor[i] and $00FF shl 8)
or
(InquiryData.VersionDescriptor[i] and $FF00 shr 8);
end;
...
end;
Peripheral Qualifier - Peripheriebezeichner
| Bezeichner | Beschreibung |
| 000b | Ein Peripheriegerät, das den angegebenen Gerätetyp besitzt, wird mit der logischen Einheit verbunden. Wenn der Geräteserver nicht in der Lage ist festzustellen, ob ein Peripheriegerät angeschlossen ist, muss er diesen Peripheriebezeichner verwenden. Dieser Peripheriekennzeichner bedeutet nicht, dass das mit der logischen Einheit verbundene Peripheriegerät zum Zugang bereit ist. |
| 001b | Ein Peripheriegerät, welches den angegebenen Peripheriegerätetyp besitzt, wird nicht mit dieser logischen Einheit verbunden. Jedoch ist der Geräteserver fähig, den angegebenen Peripheriegerätetyp auf dieser logischen Einheit zu unterstützen. |
| 010b | Reserviert |
| 011b | Der Geräteserver ist nicht dazu fähig, ein Peripheriegerät auf dieser logischen Einheit zu unterstützen. Für diesen Peripheriebezeichner soll der Peripheriegerätetyp auf 1Fh gesetzt werden. Alle anderen Peripheriegerätetyp-Werte werden für diesen Peripheriebezeichner reserviert. |
| 100b - 111b | Herstellerspezifisch |
Peripheral Device Type
| Code | Dokumenta | Beschreibung |
| $00 | SBC-2 | Gerät für den direkten Zugriff (zB Festplatten) |
| $01 | SSC-2 | Gerät für den sequentiellen Zugriff (zB Magnetbandgerät) |
| $02 | SSC | Drucker |
| $03 | SPC-2 | Prozessor |
| $04 | SBC | Einmalbeschreibbare Geräte (zB einige optische Laufwerke) |
| $05 | MMC-4 | CD/DVD-Geräte |
| $06 | Scanner (veraltet) | |
| $07 | SBC | Optische Speichergeräte (zB einige optische Laufwerke) |
| $08 | SMC-2 | Medienwechselgeräte (zB Jukeboxen) |
| $09 | Kommunikationgerät (veraltet) | |
| $0A - $0B | Veraltet | |
| $0C | SCC-2 | Speicherverbundkontrollgerät (zB RAID) |
| $0D | SES | Enclosure services device |
| $0E | RBC | Vereinfachte Geräte für den direkten Zugriff (zB Disketten- laufwerke) |
| $0F | OCRW | Optisches Kartenlese-/-schreibegerät |
| $10 | BCC | Bridge Controller Commands |
| $11 | OSD | Objektbasiertes Speichergerät |
| $12 | ADC | Automation/Drive Interface |
| $13 - $1D | Reserviert | |
| $1E | Weithin bekannte logische Einheiten b | |
| $1F | Unbekannte oder kein Gerätetyp |
a Alle Standards sind der Revision unterworfen, und Parteien der auf diesem Standard basierenden Verträge
werden dazu aufgerufen, die Möglichkeit zu untersuchen, die neusten Ausgaben der verzeichneten Standards anzuwenden.
b Alle weithin bekannte logischen Einheiten nutzen den selben Peripheriegerätetypcode.
RMB - Removable Medium Bit
Ist das Bit auf Null gesetzt, ist das Medium nicht austauschbar.
Version - Zeigt an, welchem Standard das Gerät folgt.
| Code | Beschreibung |
| $00 | Das Gerät erhebt keinen Anspruch auf Konformität mit jedem Standard. |
| $01 | Veraltet (SCSI=001b) |
| $02 | Veraltet |
| $03 | Das Gerät entspricht den ANSI INCITS 301-1997 (SPC). |
| $04 | Das Gerät entspricht den ANSI INCITS 351-2001 (SPC-2). |
| $05 | Das Gerät entspricht den ANSI INCITS 408-2005 (SPC-3). |
| $06 - $07 | Reserviert |
| $08 - $0C | Veraltet (ECMA=001b) |
| $0D - $3F | Reserviert |
| $40 - $44 | Veraltet (ISO=01b) |
| $45 - $47 | Reserviert |
| $48 - $4C | Veraltet (ISO=01b & ECMA=001b) |
| $4D - $7F | Reserviert |
| $80 - $84 | Veraltet (ISO=10b) |
| $85 - $87 | Reserviert |
| $88 - $8C | Veraltet (ECMA=001b) |
| $8D - $FF | Reserviert |
NormACA
Gibt an, ob NormalACA (SAM-3) unterstützt wird.
HiSup
Gibt an, ob ein hierarchisches Adressierungmodell, um LUNs logischen Einheiten zuzuteilen, unterstützt wird.
Response Data Format
Das Format der aktuellen SPC-3 Revision hat den Wert 2. Kleinere Werte sind veraltet, höhere reserveriert.
Additional Length (n-4)
Gibt die Länge der Daten ab diesem Datenfeld an. Wurde im INQUIRY Command Descriptor Block für
ALLOCATION LENGTH ein kleinerer Wert als Additional Length - 4 ist das tatsächliche Länge geringer.
Allerdings muss die Antwortstruktur so groß sein, dass alle Daten hineinpassen.
SCCS embedded storage array controller component support
Gibt an, ob das SCSI Zielgerät eine Speicherverbundkontrollgerätkomponente unterstützt.
ACC - Access Controls Coordinator
Gibt an, ob das SCSI Zielgerät einen Zugriffssteuerungskoordinator unterstützt.
TPGS - target port group support
| Code | Beschreibung |
| 00b | Das SCSI-Zielgerät unterstützt keinen asymmetrischen logischen Unit Zugang oder unterstützt eine Form des asymmetrischen Zugangs des Herstellers. Weder die REPORT TARGET GROUPS noch die SET TARGET GROUPS Befehle werden unterstützt. |
| 01b | Nur impliziter asymmetrischer logischer Unit Zugang wird unterstützt. Das SCSI Zielgerät ist in der Lage den asymmetrischen Zugriffsstatus ohne SET TARGET PORT GROUPS Befehl zu ändern. Der REPORT TARGET PORT GROUPS Befehl wird unterstützt und der SET TARGET PORT GROUPS Befehl wird nicht unterstützt. |
| 10b | Nur explizit asymmetrischer logischer Unit Zugang wird unterstützt. Das SCSI-Zielgerät ändert den asymmetrische Zugriffsstatus nur auf Anforderung mit dem SET TARGET PORT GROUPS Befehl. Sowohl der REPORT TARGET PORT GROUPS Befehl als auch der SET TARGET PORT GROUPS Befehl werden unterstützt. |
| 11b | Sowohl expliziter als auch impliziter asymmetrischer logischer Unit Zugang wird unterstützt. Sowohl der REPORT TARGET PORT GROUPS Befehl als auch die SET TARGET PORT GROUPS Befehle werden unterstützt. |
3ps - Third-Party Copy
Gibt an, ob das SCSI Zielgerät third-party copy Befehle unterstützt.
Protect
Gibt an, ob das SCSI Zielgerät Protection Informationen unterstützt.
BQue und CmdQue
Geben an, ob die logische Einheit das volle Aufgabenverwaltungsmodell (SAM-3) oder das grundlegende
Aufgabenverwaltungsmodell unterstützen.
| BQUE | CMDQUE | Beschreibung |
| 0 | 0 | Veraltet |
| 0 | 1 | Volles Aufgabenverwaltungsmodell wird unterstützt. |
| 1 | 0 | Grundlegendes Aufgabenverwaltungsmodell wird unterstützt. |
| 1 | 1 | Verbotene Kombination von BQUE und CMDQUE. |
EncServ - Enclosure Services
Gibt an, ob das SCSI Zielgerät eine embedded enclosure services(?) Komponente enthält.
MultiP - Multi Port
Gibt an, ob es ein Multiport SCSI Zielgerät (zwei oder mehr Ports) ist und den SCSI Multiport-
geräteanforderungen in den einschlägigen Normen (zB SAM-3) entspricht.
MChngr - Medium Changer
Gibt an, ob das SCSI Zielgerät Befehl zur Steuerung eines angeschlossenen Medienwechslers unterstützt.
Das Bit ist nur gültig, wenn das Gerät austauschbare Medien unterstützt (RMB gesetzt).
Linked
Gibt an, ob der Geräteserver linked command unterstützt (Siehe SAM-3).
T10 Vendor Identification
Das T10 VENDOR IDENTIFICATION Feld enthält acht Byte mit linksbündigen ASCII Zeichen zur Idenitfikation des
Herstellers. Die Kennung soll der durch die INCITS zugeteilten entsprechen. Eine Liste ist in SPC-3 Anhang E und auf
der Seite T10 Vendor ID Strings verfügbar.
Product Identification
Das PRODUCT IDENTIFICATION Feld enthält sechzehn Byte mit linksbündigen ASCII Zeichen, welche durch den Hersteller
definiert sind. Die Zeichen sind druckbare Zeichen im Bereich von $20 bis $7E. Das Feld wird mit dem Wert $00
abgeschlossen. Ungenutzte Zeichen werden mit $20 aufgefüllt.
Product Revision Level
Das PRODUCT REVISION LEVEL Feld enthält fünf Byte mit linksbündigen ASCII Zeichen, welche durch den Hersteller
definiert sind.
Version Descriptor 1 - 8
Die VERSION DESCRIPTOR Felder erlauben die Identfizierung von bis zu acht Standards, zu welchen das SCSI Zielgerät
Übereinstimmung fordert. Eine alphabetisch sortierte Liste ist in SPC-3 Tabelle 87 und auf
der Seite SPC-3 Standards/Versions Descriptor Codes
verfügbar. Eine nummerisch sortierte Liste ist in SPC-6 Anhang D.8 (Tabelle D.14).
Demo, welche diese Funktion nutzt:

Hardware Inquiry (podHardInquiry.7z - 274 kb) MD5 (1 kb). Stand: 7. Januar 2012
Der Download enthält auch die vendorid.txt 30. Dezember 2011 und die stds.txt vom 11. Dezember 2011.
Hinweis: Bei mir wird ein nicht vorhandener Version Descriptor angezeigt, wenn die stds.txt geladen wird. Sieht nach einem Speicherproblem aus.
Fr_An - Letzte Änderung: 2. Januar 2012
seit 28. Juli 2010