次の方法で共有


IOCTL_WRITE_REGISTERS IOCTL (usbscan.h)

コントロール パイプを使用して USB デバイス レジスタに書き込みます。

メジャー コード

IRP_MJ_DEVICE_CONTROL

入力バッファー

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 を含む)