структура 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 сопоставляют входные регистры файлов задач следующим образом.
Байт | Входной регистр |
---|---|
0 | Регистрация компонентов |
1 | Регистр счетчика секторов |
2 | Регистр номера сектора |
3 | Низкий регистр цилиндра |
4 | Высокий регистр цилиндра |
5 | Регистрация устройства и головы |
6 | Регистрация команд |
7 | Скрытный |
По завершении IOCTL_ATA_PASS_THROUGH драйвер портов обновляет CurrentTaskFile значениями, которые присутствуют в выходных регистрах устройства при завершении внедренной команды. Значения массива в CurrentTaskFile соответствуют следующим регистрам выходных данных файла задач.
Байт | Регистрация выходных данных |
---|---|
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 (include Ntddscsi.h) |