2016-03-22 3 views
-1

Ich möchte herausfinden, native maximale Adresse einer HDD über SAS - Schnittstelle. Ich benutze SAT (scsi ata Übersetzung) mit SCSI_PASS_THROUGH.Senden von ATA - Befehl "Lesen native Max Adresse (0x27, 0xF8) nicht über SAS - Controller mit SAT (SCSI ATA übersetzen)

aber nicht in der Lage jeden Puffer, um herauszufinden, oder gültigen senseinfo von SCSI_PASS_THROUGH mit IOCTL_SCSI_PASS_THROUGH vom Antrieb. cdb Wert von SCSI_PASS_THROUGH =

sptwb.Spt.CdbLength = 12; 
     sptwb.Spt.Cdb[0] = 0xA1;//ATA PASS THROUGH(12) OPERATION CODE(A1h) 
     sptwb.Spt.Cdb[1] = (4 << 1) | 0; 
     sptwb.Spt.Cdb[2] = (1 << 3) | (1 << 2) | 2; 
     sptwb.Spt.Cdb[3] = 0xe0; 
     sptwb.Spt.Cdb[4] = 0x00; 
     sptwb.Spt.Cdb[5] = 0x00; 
     sptwb.Spt.Cdb[6] = 0x00; 
     sptwb.Spt.Cdb[7] = 0x00; 
     sptwb.Spt.Cdb[8] = (UCHAR)0x40;//(UCHAR)head; 
     sptwb.Spt.Cdb[9] = 0x27;//COMMAND 

aber keine Puffern zurück. Bitte geben Genaues CDB Parameter zum Lesen der nativen maximalen Adresse auf dem SAS-Rechner.

Antwort

0

Ich habe nicht alle relevanten SCSI-Spezifikationen vor mir. Daher nehme ich an, Sie bauen die SATL (SCSI ATA-Übersetzungsschicht) CDB korrekt. Als erstes muss geprüft werden, ob das ioctl abgeschlossen ist. Das heißt, überprüfen Sie den Rückkehrcode von DeviceIoControl() für True oder False und überprüfen Sie dann GetLastError() um festzustellen, was schief gelaufen ist (falls zutreffend). Wenn das ioctl in Ordnung war, überprüfen Sie das SCSI_PASS_THROUGH_DIRECT structure Mitglied .ScsiStatus. Wenn dies 0 ist, ist der Befehl einwandfrei abgeschlossen. Wenn der Status 0 war, kann dies der Grund für keine gültige Sense-Information sein.

Ich recherchierte gerade diesen Befehl, als ich auf diesen Thread stolperte. Die neueste ATA Command Spec, ACS-3 (vom 28. Oktober 2013) zeigt, dass die Read Native Max Adresse und lesen Native Max Adresse Ext Befehle sind jetzt veraltet. Ich habe ihre Definition in ACS-2 gefunden. Die most recent draft vom 3. August 2009 zeigt, dass die Ausgabe dieses Befehls kein Puffer ist. Die Ausgabe wird stattdessen in dem LBA-Feld des zurückgegebenen Device-To-Host FIS sein.


Nachtrag Der Wortschwall des ursprünglichen Beitrags führen mich zu glauben wurde in Windows getan. Ich hätte hinzufügen sollen, dass der Prozess für Linux derselbe sein wird, wenn Sie das verwenden. Verwenden Sie jedoch nicht GetLastError(), um festzustellen, was falsch gelaufen ist. In Linux wird der Rückkehrcode von ioctl() der Code sein, den Sie benötigen.

Wenn Sie in Linux sind, verwenden Sie höchstwahrscheinlich den sg Treiber und the sg_io_hdr_t structure. Diese Struktur hat auch ein Mitglied .status, das den SCSI-Statuscode enthält. Ob in Linux oder Windows, sollten Sie diesen Code immer überprüfen, da die Annahme des Befehls erfolgreich war, weil die ioctl einen Fehler gemacht hat. Es sind andere Durchgriffstreiber in Linux verfügbar, z. die LSI MPT-Schnittstelle. Der Prozess ist immer noch der gleiche, wenn Sie das verwenden.

0

Der Befehl, den Sie implementieren möchten, 0xF8 (Native Max Address lesen) ist kein SCSI-Befehl, sondern ein ATA-Befehl.

CDB-Code 0xA1 funktioniert tatsächlich mit der IOCTL_SCSI_PASS_THROUGH-API, um SCSI/ATAPI-Befehle an ein Gerät zu senden. Aber das ist nicht was du willst.

Versuchen Sie stattdessen IOCTL_ATA_PASSTHROUGH.

Beispiel und Diskussion hier: Sending ATA commands directly to device in Windows?

Verwandte Themen