Отправка команды ATA «Чтение собственного максимального адреса (0x27, 0xF8) не отвечает через контроллер SAS с использованием SAT (преобразование SCSI ATA)

я хочу узнать собственный максимальный адрес жесткого диска через интерфейс SAS. я использую SAT (перевод scsi ata) с SCSI_PASS_THROUGH.

но не удалось найти какой-либо буфер или действительную смысловую информацию SCSI_PASS_THROUGH с IOCTL_SCSI_PASS_THROUGH с диска. cdb значение 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

Но не возвращать буфер. Укажите точные параметры cdb для чтения собственного максимального адреса на машине SAS.


person Prx    schedule 22.03.2016    source источник


Ответы (2)


У меня нет под рукой всех необходимых спецификаций SCSI. Таким образом, я предполагаю, что вы правильно создаете SATL (уровень трансляции SCSI ATA) CDB. Первое, что нужно проверить, — завершился ли ioctl. То есть проверьте код возврата DeviceIoControl() для True или False, а затем проверьте GetLastError(), чтобы определить, что пошло не так (если применимо). Если с ioctl все в порядке, проверьте Структура SCSI_PASS_THROUGH_DIRECT элемент .ScsiStatus. Если это 0, то команда выполнена нормально. Если статус был равен 0, это вполне может быть причиной отсутствия достоверной смысловой информации.

На самом деле я изучал эту самую команду, когда наткнулся на эту тему. Самая последняя спецификация команд ATA, ACS-3 (от 28 октября 2013 г.), показывает, что команды Read Native Max Address и Read Native Max Address Ext устарели. Я нашел их определение в ACS-2. последний черновик от 3 августа, 2009 показывает, что вывод этой команды не будет буфером. Вместо этого выходные данные будут находиться в поле LBA возвращаемой FiS-системы-устройства-хост.


Дополнение. Формулировка исходного сообщения заставила меня поверить, что это делается в Windows. Я должен был указать, что процесс будет таким же для Linux, если это то, что вы используете. Однако не используйте GetLastError(), чтобы определить, что пошло не так. В Linux код возврата из ioctl() будет кодом, который вам нужен.

В Linux вы, скорее всего, используете драйвер sg и структура sg_io_hdr_t. Эта структура также имеет элемент .status, который содержит код состояния SCSI. Будь то в Linux или Windows, вы всегда должны проверять этот код, потому что предположение, что команда выполнена успешно, потому что это сделал ioctl, является ошибкой. В Linux доступны и другие сквозные драйверы, например. Интерфейс LSI MPT. Процесс остается тем же, если это то, что вы используете.

person Andrew Falanga    schedule 06.04.2016

Команда, которую вы пытаетесь реализовать, 0xF8 (Read Native Max Address) — это не команда SCSI, это команда ATA.

Код CDB 0xA1 действительно работает с IOCTL_SCSI_PASS_THROUGH API для передачи команд SCSI/ATAPI на устройство. Но это не то, что вы хотите.

Вместо этого попробуйте IOCTL_ATA_PASSTHROUGH. .

Пример и обсуждение здесь: Отправка команд ATA непосредственно на устройство в Windows?

person mattypiper    schedule 27.05.2016