структура 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) |