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


IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

Создает настраиваемый блок дескриптора элемента управления SCSI (CDB) и отправляет его в драйвер образа в режиме ядра для шин SCSI.

Основной код

IRP_MJ_DEVICE_CONTROL

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

Указатель на структуру 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

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously