IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)
Позволяет приложению отправлять практически любую команду ATA на целевое устройство со следующими ограничениями:
- Если существует драйвер класса для целевого типа устройства, приложение должно отправить запрос драйверу класса. Таким образом, приложение может отправить этот запрос непосредственно в драйвер системного порта для целевой логической единицы (LU), только если отсутствует драйвер класса для типа устройства, подключенного к этому LU. Драйвер системного порта не проверка, чтобы определить, было ли устройство запрошено драйвером класса перед обработкой запроса сквозной передачи. Таким образом, если приложение обходит драйвер класса, затребовав устройство, и отправляет запрос на передачу этого устройства непосредственно драйверу порта, между драйвером класса и приложением может возникнуть конфликт управления устройством.
- Этот запрос нельзя использовать, если команда требует, чтобы базовый драйвер напрямую обращается к памяти. Если команде вызывающего абонента может потребоваться прямой доступ к памяти, используйте вместо нее IOCTL_ATA_PASS_THROUGH_DIRECT .
- Приложения не должны пытаться отправить запрос на сквозную передачу асинхронно. Все сквозные запросы должны быть синхронными.
- Приложениям не требуются права администратора для отправки сквозного запроса на устройство, но они должны иметь доступ на чтение и запись к устройству.
Основной код
Входной буфер
Буфер в Irp-AssociatedIrp.SystemBuffer> должен содержать ATA_PASS_THROUGH_EX структуру, которая включает набор входных регистров файлов задач, указывающих тип выполняемой команды и ее параметры. Вызывающий объект должен инициализировать все члены этой структуры, кроме PathId, TargetId и Lun, которые заполняет драйвер порта. Для команды вывода данных элемент DataBufferOffset структуры должен указывать на буфер, выровненный по кэшу, содержащий данные для записи.
Длина входного буфера
Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp->AssociatedIrp.SystemBuffer. Если внедренная команда ATA является операцией записи, размер входного буфера должен быть суммой sizeof(ATA_PASS_THROUGH_EX) и значением в элементе DataTransferLengthATA_PASS_THROUGH_EX. В следующем примере псевдокода показано, как вычислить размер буфера:ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength
Если внедренная команда ATA является операцией чтения или операцией управления устройством, которая не связана с передачей данных, inputBufferLength должен быть равен sizeof (ATA_PASS_THROUGH_EX).
В любом случае, если значение InputBufferLength меньше sizeof (ATA_PASS_THROUGH_EX), драйвер порта завершает запрос ввода-вывода и возвращает ошибку.
Выходной буфер
Драйвер порта форматирует возвращаемые данные с помощью структуры ATA_PASS_THROUGH_EX и сохраняет данные в буфере в Irp-AssociatedIrp.SystemBuffer>.
Драйвер порта заполняет элемент CurrentTaskFile значениями, которые присутствуют в выходных регистрах устройства при завершении встроенной команды ATA. Если команда была передачей данных, драйвер порта сохраняет переданные данные в буфере, выровненном по кэшу, который находится в смещении байтов DataBufferOffset от начала структуры. Приложение отвечает за интерпретацию содержимого выходных регистров, чтобы определить, какие ошибки, если таковые есть, были возвращены устройством.
Длина выходного буфера
Драйвер порта обновляет элемент DataTransferLengthATA_PASS_THROUGH_EX , чтобы указать объем данных, фактически переданных с устройства. Если внедренная команда ATA является операцией записи или операцией управления устройством, которая не передает данные, OutputBufferLength равно sizeof(ATA_PASS_THROUGH_EX). Если внедренная команда ATA является операцией чтения, OutputBufferLength равно sizeof(ATA_PASS_THROUGH_EX) + DataTransferLength.
Блок состояния
Для элемента Information задается число байтов, возвращаемых в выходном буфере в Irp-AssociatedIrp.SystemBuffer>. Элемент Status имеет значение STATUS_SUCCESS или, возможно, STATUS_BUFFER_TOO_SMALL или STATUS_INVALID_PARAMETER, если входное значение Состояния в ATA_PASS_THROUGH_EX задано неправильно.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно начиная с Windows Server 2003. |
Верхняя часть | ntddscsi.h (включая Ntddscsi.h) |