Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Запрос кода IOCTL_SCSI_PASS_THROUGH_DIRECT_EX — это расширенная версия запроса IOCTL_SCSI_PASS_THROUGH_DIRECT. Этот запрос обеспечивает поддержку двунаправленной передачи данных и позволяет блоку данных команд (CDB) > 16 байт.
Позволяет приложению отправлять почти любую команду SCSI на целевое устройство со следующими ограничениями:
- Команды multitarget, такие как COPY, запрещены.
- Если существует драйвер класса для целевого типа устройства, запрос должен быть отправлен в этот драйвер класса. Таким образом, приложение может отправлять этот запрос непосредственно в драйвер системного порта для целевой логической единицы, только если для типа устройства, подключенного к этому LU, нет драйвера класса.
- Этот запрос должен быть выполнен, если входной CDB может потребовать, чтобы базовый драйвер минипорта мог получить доступ к памяти напрямую.
Приложения могут отправлять этот запрос с помощью запроса IRP_MJ_DEVICE_CONTROL .
Драйверы классов хранилища задают дополнительный номер IRP для IRP_MN_SCSI_CLASS, чтобы указать, что запрос был обработан драйвером класса хранилища.
Основной код
Входной буфер
Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp->AssociatedIrp.SystemBuffer, который должен быть по крайней мере (размер размера + данных(SCSI_PASS_THROUGH_DIRECT_EX)). Размер структуры SCSI_PASS_THROUGH_DIRECT_EX исправлен.Эта структура включает CDB SCSI, которая должна быть инициализирована вызывающим объектом, за исключением пути, целевого идентификатора и LUN, которые заполняются драйвером порта. Для команды вывода данных передаваемые данные должны находиться в буфере, выровненном на устройстве адаптера. Элемент DataInBufferSCSI_PASS_THROUGH_DIRECT_EX является указателем на этот буфер, выровненный на устройство адаптера. Вызывающий объект должен выделить дополнительное хранилище, следуя SCSI_PASS_THROUGH_DIRECT_EX структуре, если вызывающий запрашивает данные о запросе.
Длина входного буфера
Parameters.DeviceIoControl.InputBufferLength указывает размер буфера в байтах в Irp->AssociatedIrp.SystemBuffer, который должен быть по крайней мере (размер размера + данных(SCSI_PASS_THROUGH_DIRECT_EX)). Размер структуры SCSI_PASS_THROUGH_DIRECT_EX исправлен.Выходной буфер
Драйвер порта возвращает все данные о запросе и структуру SCSI_PASS_THROUGH_DIRECT_EX буферу в Irp-AssociatedIrp.SystemBuffer>.
Длина выходного буфера
SenseInfoLength и DataOutTransferLength обновляются, чтобы указать объем передаваемых данных. Драйвер порта возвращает все данные, передаваемые с устройства, в предоставленный буфер с выравниванием кэша в DataOutBuffer.
Блок состояния
Поле сведений имеет количество байтов, возвращаемых в выходном буфере в Irp-AssociatedIrp.SystemBuffer>. Поле "Состояние " имеет значение STATUS_SUCCESSили, возможно, STATUS_BUFFER_TOO_SMALL или STATUS_INVALID_PARAMETER , если значение входной длины в SCSI_PASS_THROUGH_DIRECT_EX неправильно задано или буфер, указанный в DataInBuffer , не соответствует правильному выравниванию устройства.
Замечания
Для операций передачи данных требуется буфер с выравниванием, соответствующим устройству адаптера. Приложения могут получить маску выравнивания устройства, выдав запрос кода IOCTL_STORAGE_QUERY_PROPERTY с типом запроса PropertyStandardQuery и идентификатором свойства StorageAdapterProperty. Маска выравнивания найдена в элементе AlignmentMask возвращаемой структуры STORAGE_ADAPTER_DESCRIPTOR . Драйверы также могут использовать значение в элементе AlignmentMaskустройства DeviceObject адаптера.
В следующем примере функции буфер подготавливается как буфер, выровняемый устройством буфер передачи данных.
PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
PVOID AlignedBuffer;
ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;
if (AlignmentMask == 0)
{
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
}
else
{
// expand the size for the alignment window
size += AlignmentMask;
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
// adjust buffer pointer for the desired alignment
AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
}
return AlignedBuffer;
}
Чтобы выпустить запрос IOCTL_SCSI_PASS_THROUGH_DIRECT_EX , базовое устройство хранилища должно поддерживать расширенные srOb-объекты. Это означает, что поддерживаемый тип SRB SRB_TYPE_STORAGE_REQUEST_BLOCK. Приложение может запрашивать поддержку SRB с помощью запроса IOCTL_STORAGE_QUERY_PROPERTY с типом запроса PropertyStandardQuery и типом свойства StorageDeviceProperty. Элемент SrbType , возвращенный в структуре STORAGE_ADAPTER_DESCRIPTOR , будет указывать либо SRB_TYPE_SCSI_REQUEST_BLOCK , либо SRB_TYPE_STORAGE_REQUEST_BLOCK.
Требования
| Требование | Ценность |
|---|---|
| Header | ntddscsi.h (include Ntddscsi.h) |