IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)
カスタマイズされた SCSI 制御記述子ブロック (CDB) を作成し、SCSI バス用のカーネル モードの静止イメージ ドライバーに送信します。
メジャー コード
[入力バッファー]
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 を含む) |
こちらもご覧ください
WdfIoTargetSendInternalIoctlOthersSynchronously