コントロール パイプを使用して USB デバイス レジスタに書き込みます。
メジャー コード
入力バッファー
IO_BLOCK 構造体へのポインター。
入力バッファーの長さ
入力バッファーのサイズ。
出力バッファー
ヌル
出力バッファーの長さ
ゼロ
状態ブロック
Irp->IoStatus.Status は、要求が成功した場合にSTATUS_SUCCESSに設定されます。 それ以外の場合は、状態 NTSTATUS コードとして適切なエラー状態に します。
備考
DeviceIoControl パラメーター
IOCTL_WRITE_REGISTERS I/O 制御コードを使用して DeviceloControl 関数を呼び出す場合、呼び出し元は、IO_BLOCK 構造体のアドレスを関数の lpInBuffer パラメーターとして指定する必要があります。
カーネル モード ドライバーは、IO_BLOCKの内容を使用して、_URB_CONTROL_VENDOR_OR_CLASS_REQUEST 構造体を含む URB を作成します。
次の表は、_URB_CONTROL_VENDOR_OR_CLASS_REQUEST構造体メンバーに割り当てられた値を示しています。
| 構造体メンバー | sssigned 値 |
|---|---|
| TransferFlags | 0 |
| TransferBufferLength | pIoBlock->uLength |
| TransferBuffer | pIoBlock- pbyDataを> する |
| TransferBufferMDL | NULL |
| RequestTypeReservedBits | 0x40 |
| 要求 | (pIoBlock->uLength> 1) ? 0x04: 0x0C |
| 値の | (SHORT)pIoBlock->uOffset |
| インデックス の | pIoBlock- uIndexを> する |
詳細については、「静止画像デバイスの Kernel-Mode ドライバーへのアクセス」を参照してください。
DWORD cbRet;
BOOL bRet;
IO_BLOCK IoBlock;
OVERLAPPED overlapped;
IoBlock.uOffset = (BYTE)byOffset;
IoBlock.uLength = (BYTE)byNbOfReg;
IoBlock.pbyData = pbyData;
memset(&overlapped, 0, sizeof(OVERLAPPED));
overlapped.hEvent =
CreateEvent(NULL, // pointer to security attributes
// WIN95 ignores this parameter
FALSE, // automatic reset
FALSE, // initialize to not signaled
NULL); // pointer to the event-object name
bRet = DeviceIoControl( DeviceHandle,
(DWORD) IOCTL_WRITE_REGISTERS,
&IoBlock,
sizeof(IO_BLOCK),
NULL,
0,
&cbRet,
&overlapped);
if( bRet == TRUE )
{
WaitForSingleObject(overlapped.hEvent, INFINITE);
// we do not the test, the result is zero
}
CloseHandle(overlapped.hEvent);
必要条件
| 要件 | 価値 |
|---|---|
| ヘッダー | usbscan.h (Usbscan.h を含む) |