共用方式為


IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

建立自定義的 SCSI 控制件描述元區塊 (CDB) ,並將其傳送至 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
      );
    }
  }
}

規格需求

需求
標頭 scsiscan.h (包含 Scsiscan.h)

另請參閱

在驅動程式中建立IOCTL要求

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously