Поделиться через


IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

IOCTL_ATA_PASS_THROUGH_DIRECT позволяет приложению отправлять практически любую команду ATA на целевое устройство со следующими ограничениями:

  • Если существует драйвер класса для целевого типа устройства, приложение должно отправить запрос драйверу класса. Таким образом, приложение может отправить этот запрос непосредственно в драйвер системного порта для целевой логической единицы, только если для устройства нет драйвера класса.

  • Приложение должно использовать этот запрос, а не IOCTL_ATA_PASS_THROUGH , если для встроенной команды ATA может потребоваться, чтобы базовый драйвер мини-порта напрямую обращается к памяти.

Если команда ATA запрашивает операцию передачи данных, вызывающий объект должен настроить буфер, выровненный по кэшу, из которого или в который драйвер может передавать данные напрямую. Вызывающий объект должен обеспечить следующее:

  • Длина передачи данных удовлетворяет требованиям устройства к выравниванию ввода-вывода; В противном случае этот IOCTL завершается сбоем с STATUS_INVALID_PARAMETER.
  • Длина передачи данных не должна превышать максимальную длину передачи ввода-вывода устройства; В противном случае ожидается, что устройство завершит запрос неудачно.

Запрос IOCTL_ATA_PASS_THROUGH_DIRECT обычно используется для передачи больших объемов данных (более 16 КБ).

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

Буфер в Irp-AssociatedIrp.SystemBuffer> содержит структуру ATA_PASS_THROUGH_DIRECT, которая включает набор входных регистров файлов задач, указывающих тип выполняемой команды. Вызывающий объект должен инициализировать все члены этой структуры, кроме PathId, TargetId и Lun, которые заполняет драйвер порта. Для команды вывода данных элемент DataBufferATA_PASS_THROUGH_DIRECT должен указывать на буфер, выровненный по кэшу, содержащий данные для записи.

Длина входного буфера

Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp-AssociatedIrp.SystemBuffer>. Значение InputBufferLength является фиксированным и не зависит от объема передаваемых данных. Он равен sizeof(ATA_PASS_THROUGH_DIRECT). Если размер буфера меньше sizeof(ATA_PASS_THROUGH_DIRECT), драйвер порта завершает запрос ввода-вывода и возвращает ошибку.

Выходной буфер

Драйвер порта форматирует возвращаемые данные, используя структуру ATA_PASS_THROUGH_DIRECT, которая хранится в буфере в Irp-AssociatedIrp.SystemBuffer>.

Драйвер порта сохраняет переданные данные в буфере, выровненном по кэшу, на который указывает элемент DataBufferATA_PASS_THROUGH_DIRECT.

Драйвер порта заполняет элемент CurrentTaskFileATA_PASS_THROUGH_DIRECT значениями, присутствующими в выходных регистрах устройства при завершении команды ATA. Приложение отвечает за интерпретацию содержимого выходных регистров, чтобы определить, какие ошибки, если таковые есть, были возвращены устройством.

Длина выходного буфера

Драйвер порта обновляет элемент DataTransferLengthструктуры ATA_PASS_THROUGH_DIRECT , чтобы указать объем данных, переданных с устройства.

Буфер входных и выходных данных

Нет.

Длина входного/выходного буфера

Не применяется

Блок состояния

Для элемента Information задается число байтов, возвращаемых в выходном буфере в Irp-AssociatedIrp.SystemBuffer>. Элемент Status имеет значение STATUS_SUCCESS или, возможно, STATUS_BUFFER_TOO_SMALL или STATUS_INVALID_PARAMETER, если входное значение Length в ATA_PASS_THROUGH_DIRECT задано неправильно.

Требования

Требование Значение
Минимальная версия клиента Windows Server 2003
Верхняя часть ntddscsi.h (включая Ntddscsi.h)

См. также раздел

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH