IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)
Создает настраиваемый блок дескриптора элемента управления SCSI (CDB) и отправляет его в драйвер образа в режиме ядра для шин SCSI.
Основной код
Входной буфер
Указатель на структуру SCSISCAN_CMD .
Длина входного буфера
Размер входного буфера.
Выходной буфер
Указатель на буфер данных. В зависимости от типа операции ввода-вывода этот буфер может предоставлять или получать данные.
Длина выходного буфера
Размер выходного буфера.
Блок состояния
Irp->IoStatus.Status имеет значение STATUS_SUCCESS, если запрос выполнен успешно. В противном случае — состояние соответствующего условия ошибки в виде кода NTSTATUS .
Комментарии
При вызове функции DeviceloControl с помощью кода элемента управления IOCTL_SCSISCAN_CMD ввода-вывода вызывающий объект должен указать адрес структуры SCSISCAN_CMD в качестве параметра функции lpInBuffer . Эта структура определяет тип запрашиваемой операции. Драйвер режима ядра создает блок запросов SCSI (SRB) на основе содержимого структуры SCSISCAN_CMD.
Для команд SCSI, которые включают передачу данных, lpOutBuffer функции DeviceIoControl должен указывать на буфер данных. Для операций чтения этот буфер будет получать данные, считанные с устройства. Для операций записи буфер должен содержать записываемые данные.
Дополнительные сведения см. в статье Доступ к драйверам Kernel-Mode для устройств с неподвижным изображением.
Пример кода
SCSISCAN_CMD Cmd;
UCHAR SrbStatus;
// Construct the SCSISCAN_CMD structure and
// clear out the sense buffer.
memset(&Cmd, 0, sizeof(Cmd));
memset(SenseBuffer,0, sizeof(SenseBuffer));
Cmd.Size = sizeof(SCSISCAN_CMD);
Cmd.SrbFlags = SRB_FLAGS_DATA_OUT;
Cmd.CdbLength = 6;
Cmd.SenseLength = 18;
Cmd.TransferLength = len;
Cmd.pSrbStatus = &SrbStatus;
Cmd.pSenseBuffer = SenseBuffer;
Cmd.Cdb[0] = 0x0A;
Cmd.Cdb[4] = ((PFOUR_BYTE)&len) -> Byte0;
Cmd.Cdb[3] = ((PFOUR_BYTE)&len) -> Byte1;
Cmd.Cdb[2] = ((PFOUR_BYTE)&len) -> Byte2;
Cmd.Cdb[5] = 0;
DeviceIoControl(
gb_Scan_Handle,
(DWORD) IOCTL_SCSISCAN_CMD,
&Cmd,
sizeof(Cmd),
buf,
len,
amount_written_ptr,
NULL
);
if (SRB_STATUS_SUCCESS != SRB_STATUS(SrbStatus))
{
fprintf(stderr, "WriteScanner error.\n");
if (SRB_STATUS_DATA_OVERRUN == SrbStatus)
{
fprintf(stderr, "Data over/under run. This is ok.\n");
}
else if ((SenseBuffer[2] & 0xf) == SCSI_SENSE_UNIT_ATTENTION)
{
fprintf(stderr, "Unit attention. Retrying request....\n");
memset(SenseBuffer,0, sizeof(SenseBuffer));
SrbStatus = 0;
DeviceIoControl(
gb_Scan_Handle,
(DWORD) IOCTL_SCSISCAN_CMD,
&Cmd,
sizeof(Cmd),
buf,
len,
amount_written_ptr,
NULL
);
}
}
}
Требования
Требование | Значение |
---|---|
Заголовок | scsiscan.h (включая Scsiscan.h) |
См. также раздел
Создание запросов IOCTL в драйверах
WdfIoTargetSendInternalIoctlOthersSynchronously