次の方法で共有


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
      );
    }
  }
}

要件

要件
Header scsiscan.h (Scsiscan.h を含む)

こちらもご覧ください

ドライバー内での IOCTL 要求の作成

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously