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


IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

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

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

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

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

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

Приложения могут отправлять этот запрос с помощью запроса 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 и DataOutTransferLength в структуре SCSI_PASS_THROUGH_EX обновляются для указания объема передаваемых данных.

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

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

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

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

Комментарии

Чтобы отправить запрос IOCTL_SCSI_PASS_THROUGH_EX , базовое запоминающее устройство должно поддерживать расширенные SSPB-файлы. Это означает, что поддерживаемый тип 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 (включая Ntddscsi.h)

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

SCSI_PASS_THROUGH_EX