IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

(CDB) 创建自定义 SCSI 控制描述符块,并将其发送到 SCSI 总线的内核模式静态映像驱动程序。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

指向 SCSISCAN_CMD 结构的指针。

输入缓冲区长度

输入缓冲区的大小。

输出缓冲区

指向数据缓冲区的指针。 根据 I/O 操作的类型,此缓冲区可能会提供或接收数据。

输出缓冲区长度

输出缓冲区的大小。

状态块

Irp->如果请求成功,IoStatus.Status 设置为 STATUS_SUCCESS。 否则, 状态 为相应的错误条件作为 NTSTATUS 代码。

注解

使用IOCTL_SCSISCAN_CMD I/O 控制代码调用 DeviceloControl 函数时,调用方必须将 SCSISCAN_CMD 结构的地址指定为函数的 lpInBuffer 参数。 此结构指定要请求的操作的类型。 内核模式驱动程序从SCSISCAN_CMD结构的内容构造 SCSI 请求块 (SRB) 。

对于涉及数据传输的 SCSI 命令, DeviceIoControl 函数的 lpOutBuffer 必须指向数据缓冲区。 对于读取操作,此缓冲区将接收从设备读取的数据。 对于写入操作,缓冲区必须包含要写入的数据。

有关详细信息,请参阅 访问静态映像设备的 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
      );
    }
  }
}

要求

要求
Header scsiscan.h (包括 Scsiscan.h)

另请参阅

在驱动程序中创建 IOCTL 请求

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously