IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)
Позволяет приложению отправлять почти любую команду SCSI на целевое устройство со следующими ограничениями:
- Многоцелевое использование команд, таких как COPY, запрещено.
- Двунаправленные операции передачи данных не поддерживаются.
- Если существует драйвер класса для целевого типа устройства, запрос должен быть отправлен в этот драйвер класса. Таким образом, приложение может отправить этот запрос непосредственно в драйвер системного порта для целевой логической единицы (LU), только если отсутствует драйвер класса для типа устройства, подключенного к этому LU. Драйвер системного порта не проверка определить, было ли устройство запрошено драйвером класса перед обработкой запроса сквозной передачи. Таким образом, если приложение обходит драйвер класса, который утверждал устройство, и отправляет сквозной запрос для этого устройства непосредственно драйверу порта, между драйвером класса и приложением может возникнуть конфликт управления устройством. Если сквозной запрос отправляется объекту устройства адаптера и если он исходит из пользовательского режима и нацелен на LU, запрошенный драйвером класса, Storport завершает запрос с STATUS_INVALID_DEVICE_REQUEST. Если запрос отправляется в объект устройства LU, поступает в режиме ядра или нацелен на невостребованное LU, он передается драйверу мини-порта.
- Этот запрос нельзя использовать, если CDB может потребовать от базового драйвера мини-порта прямой доступ к памяти. Если CDB вызывающего абонента может потребоваться прямой доступ к памяти, используйте вместо этого IOCTL_SCSI_PASS_THROUGH_DIRECT .
- Приложения не должны пытаться асинхронно отправить сквозной запрос. Все сквозные запросы должны быть синхронными.
- Приложениям не требуются права администратора для отправки сквозного запроса на устройство, но они должны иметь доступ на чтение и запись к устройству.
IOCTL_SCSI_PASS_THROUGH — это запрос на управление буферизацией устройства. Чтобы обойти буферизацию в системной памяти, вызывающие должны использовать IOCTL_SCSI_PASS_THROUGH_DIRECT. При обработке запроса IOCTL_SCSI_PASS_THROUGH_DIRECT система блокирует буфер в памяти пользователя, и устройство обращается к этой памяти напрямую.
Этот запрос обычно используется для передачи небольших объемов данных (<16 КБ).
Приложения могут отправлять этот запрос с помощью запроса IRP_MJ_DEVICE_CONTROL .
Драйверы класса хранилища устанавливают дополнительный номер IRP IRP_MN_SCSI_CLASS, чтобы указать, что запрос был обработан драйвером класса хранения.
Основной код
Входной буфер
Эта структура включает CDB SCSI, который должен быть инициализирован вызывающим объектом, за исключением пути, целевого идентификатора и номера логической единицы (LUN), которые заполняются драйвером порта. Для команды вывода данных передаваемые данные включаются в буфер по адресу Irp-AssociatedIrp.SystemBuffer> на сайте DataBufferOffset в структуре SCSI_PASS_THROUGH. Однако вызывающий объект должен выделить дополнительное хранилище сразу после SCSI_PASS_THROUGH, если вызывающий объект запрашивает данные для контроля запроса.
Длина входного буфера
Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp->AssociatedIrp.SystemBuffer, который должен быть по крайней мере (sense data sizeof + (SCSI_PASS_THROUGH)). Размер структуры SCSI_PASS_THROUGH зависит от спецификации DataTransferLength .Выходной буфер
Драйвер порта возвращает все данные о смысле запроса и все данные, передаваемые с устройства в буфер по адресу Irp-AssociatedIrp.SystemBuffer>.
Длина выходного буфера
SenseInfoLength и DataTransferLength в структуре SCSI_PASS_THROUGH обновляются, чтобы указать объем передаваемых данных.
Блок состояния
Для поля Information задано количество байтов, возвращаемых в выходном буфере по адресу Irp-AssociatedIrp.SystemBuffer>. Для поля Состояние задано значение STATUS_SUCCESS или, возможно, STATUS_BUFFER_TOO_SMALL или STATUS_INVALID_PARAMETER, если входное значение Length в SCSI_PASS_THROUGH задано неправильно.
Требования
Требование | Значение |
---|---|
Заголовок | ntddscsi.h (включая Ntddscsi.h) |