У меня нет под рукой всех необходимых спецификаций 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