IOCTL_WRITE_REGISTERS IOCTL (usbscan.h)

使用控制管道写入 USB 设备寄存器。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

指向 IO_BLOCK 结构的指针。

输入缓冲区长度

输入缓冲区的大小。

输出缓冲区

Null

输出缓冲区长度

零个

状态块

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

要求

要求
Header usbscan.h (包括 Usbscan.h)