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


структура ATA_PASS_THROUGH_EX (ntddscsi.h)

Структура ATA_PASS_THROUGH_EX используется вместе с запросом IOCTL_ATA_PASS_THROUGH , чтобы указать драйверу порта отправить встроенную команду ATA на целевое устройство.

Синтаксис

typedef struct _ATA_PASS_THROUGH_EX {
  USHORT    Length;
  USHORT    AtaFlags;
  UCHAR     PathId;
  UCHAR     TargetId;
  UCHAR     Lun;
  UCHAR     ReservedAsUchar;
  ULONG     DataTransferLength;
  ULONG     TimeOutValue;
  ULONG     ReservedAsUlong;
  ULONG_PTR DataBufferOffset;
  UCHAR     PreviousTaskFile[8];
  UCHAR     CurrentTaskFile[8];
} ATA_PASS_THROUGH_EX, *PATA_PASS_THROUGH_EX;

Члены

Length

Задает длину структуры ATA_PASS_THROUGH_EX в байтах.

AtaFlags

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

Флаги ATA Значение
ATA_FLAGS_DRDY_REQUIRED Дождитесь состояния DRDY с устройства, прежде чем отправлять команду на устройство.
ATA_FLAGS_DATA_IN Чтение данных с устройства.
ATA_FLAGS_DATA_OUT Запись данных на устройство.
ATA_FLAGS_48BIT_COMMAND Отправляемая команда ATA использует набор функций 48-разрядного адреса логического блока (LBA). Если этот флаг установлен, содержимое элемента PreviousTaskFile в структуре ATA_PASS_THROUGH_EX должно быть допустимым.
ATA_FLAGS_USE_DMA Установите режим передачи DMA.
ATA_FLAGS_NO_MULTIPLE Чтение только для одного сектора.

PathId

Содержит целое число, указывающее порт или шину интегрированной среды разработки для запроса. Это значение задается драйвером порта.

TargetId

Содержит целое число, указывающее целевое устройство в шине. Это значение задается драйвером порта.

Lun

Указывает логический номер устройства. Это значение задается драйвером порта.

ReservedAsUchar

Зарезервировано для последующего использования.

DataTransferLength

Указывает размер буфера данных (в байтах). Если происходит недостаточное выполнение, драйвер мини-порта должен обновить этот элемент до количества байтов, которые были фактически переданы.

TimeOutValue

Указывает время выполнения запроса в секундах до того, как драйвер порта операционной системы определит, что истекло время ожидания запроса.

ReservedAsUlong

Зарезервировано для последующего использования.

DataBufferOffset

Задает смещение (в байтах) от начала этой структуры до буфера данных.

PreviousTaskFile[8]

Указывает содержимое входных регистров файла задачи перед текущей командой сквозной передачи. Этот элемент не используется, если не задан флаг ATA_FLAGS_48BIT_COMMAND.

CurrentTaskFile[8]

Указывает содержимое регистра файла задачи как для входных, так и для выходных данных. Во входных данных значения массива в CurrentTaskFile сопоставляют с входными регистрами файла задач следующим образом.

Byte Входной регистр
0 Регистрация компонентов
1 Регистр количества секторов
2 Регистр номеров секторов
3 Низкий регистр цилиндров
4 Цилиндр высокий регистр
5 Регистр устройства или головного устройства
6 Регистр команд
7 Зарезервировано
 

По завершении IOCTL_ATA_PASS_THROUGH драйвер порта обновляет CurrentTaskFile значениями, которые присутствуют в выходных регистрах устройства по завершении внедренной команды. Значения массива в CurrentTaskFile соответствуют следующим регистрам выходных файлов задач.

Byte Выходной регистр
0 Регистр ошибок
1 Регистр количества секторов
2 Регистр номеров секторов
3 Низкий регистр цилиндров
4 Цилиндр высокий регистр
5 Регистр устройства или головного устройства
6 Регистр состояния
7 Зарезервировано

Комментарии

IOCTL_ATA_PASS_THROUGH — это запрос на управление буферизацией устройства. Чтобы обойти буферизацию в системной памяти, вызывающие должны использовать IOCTL_ATA_PASS_THROUGH_DIRECT и ATA_PASS_THROUGH_DIRECT. При обработке запроса IOCTL_ATA_PASS_THROUGH_DIRECT система блокирует буфер в памяти пользователя, и устройство обращается к этой памяти напрямую.

Требования

Требование Значение
Заголовок ntddscsi.h (включая Ntddscsi.h)

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

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH

IOCTL_ATA_PASS_THROUGH_DIRECT