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


IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

Запрос кода IOCTL_SCSI_PASS_THROUGH_EX — это расширенная версия запроса IOCTL_SCSI_PASS_THROUGH. Этот запрос обеспечивает поддержку двунаправленной передачи данных и позволяет блоку данных команд (CDB) > 16 байт.

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

  • Команды multitarget, такие как COPY, запрещены.
  • Если существует драйвер класса для целевого типа устройства, запрос должен быть отправлен в этот драйвер класса. Таким образом, приложение может отправлять этот запрос непосредственно в драйвер системного порта для целевой логической единицы (LU) только в том случае, если для типа устройства, подключенного к этому LU, нет драйвера класса. Драйвер системного порта не проверяет, было ли устройство заявлено драйвером класса перед обработкой сквозного запроса. Таким образом, если приложение проходит драйвер класса, который утверждал устройство и отправляет сквозной запрос для этого устройства непосредственно в драйвер порта, конфликт управления устройством может возникать между драйвером класса и приложением. Если запрос сквозной передачи отправляется объекту устройства адаптера и если он поступает из пользовательского режима и предназначен для LU, который утверждается драйвером класса, Storport завершает запрос с STATUS_INVALID_DEVICE_REQUEST. Если запрос отправляется в объект устройства LU, происходит в режиме ядра или предназначен для неисключаемой LU, он передается мини-драйверу.
  • Этот запрос нельзя использовать, если CDB может потребовать, чтобы базовый драйвер минипорта мог напрямую получить доступ к памяти. Если для CDB вызывающего абонента может потребоваться прямой доступ к памяти, используйте вместо этого IOCTL_SCSI_PASS_THROUGH_DIRECT_EX.
  • Приложения не должны пытаться отправлять сквозной запрос асинхронно. Все сквозные запросы должны быть синхронными.
  • Приложениям не требуются права администратора для отправки сквозного запроса на устройство, но у них должен быть доступ на чтение и запись на устройство.
Вызывающее приложение создает блок дескриптора команды SCSI, который может включать запрос на получение данных с чувством запроса при возникновении условия CHECK.

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

Этот запрос обычно используется для передачи небольших объемов данных (<16K).

Приложения могут отправлять этот запрос с помощью запроса IRP_MJ_DEVICE_CONTROL.

Драйверы классов хранилища задают дополнительный номер IRP для IRP_MN_SCSI_CLASS, чтобы указать, что запрос был обработан драйвером класса хранилища.

примечание модели драйверов портов SCSI и мини-порта SCSI могут быть изменены или недоступны в будущем. Вместо этого мы рекомендуем использовать драйвера Storport и минипорта Storport модели драйверов.
 

Основной код

IRP_MJ_DEVICE_CONTROL

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

Эта структура включает в себя CDB SCSI, которая должна быть инициализирована вызывающим объектом, за исключением пути, целевого идентификатора и номера логического блока (LUN), которые заполняются драйвером порта. Для команды вывода данных передаваемые данные включаются в буфер в Irp->AssociatedIrp.SystemBuffer в DataInBufferOffset в структуре SCSI_PASS_THROUGH_EX. Однако вызывающий объект должен выделить дополнительное хранилище, сразу после SCSI_PASS_THROUGH_EX, если вызывающий запрашивает данные о запросе.

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

Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp->AssociatedIrp.SystemBuffer, который должен быть по крайней мере (размер данных + размера(SCSI_PASS_THROUGH_EX)). Размер структуры SCSI_PASS_THROUGH_EX зависит от значения, указанного в DataInTransferLength.

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

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

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

SenseInfoLength и DataOutTransferLeng th в структуре SCSI_PASS_THROUGH_EX обновляются, чтобы указать объем передаваемых данных.

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

В поле сведений задано количество байтов, возвращаемых в выходном буфере в Irp->AssociatedIrp.SystemBuffer. Поле состояния имеет значение STATUS_SUCCESS или, возможно, STATUS_BUFFER_TOO_SMALL или STATUS_INVALID_PARAMETER, если входное значение Length в SCSI_PASS_THROUGH_EX неправильно задано.

Замечания

Чтобы выпустить запрос IOCTL_SCSI_PASS_THROUGH_EX, базовое устройство хранилища должно поддерживать расширенные srOb-объекты. Это означает, что поддерживаемый тип SRB SRB_TYPE_STORAGE_REQUEST_BLOCK. Приложение может запрашивать поддержку SRB с запросом IOCTL_STORAGE_QUERY_PROPERTY с типом запроса PropertyStandardQuery и типом свойства StorageDeviceProperty. Элемент SrbType, возвращенный в структуре STORAGE_ADAPTER_DESCRIPTIOR, будет указывать либо SRB_TYPE_SCSI_REQUEST_BLOCK, либо SRB_TYPE_STORAGE_REQUEST_BLOCK.

Требования

Требование Ценность
заголовка ntddscsi.h (include Ntddscsi.h)

См. также

SCSI_PASS_THROUGH_EX