IOCTL_WRITE_REGISTERS IOCTL

Writes to USB device registers, using the control pipe.

Major Code

IRP_MJ_DEVICE_CONTROL

Input Buffer

Pointer to an IO_BLOCK structure.

Input Buffer Length

Size of the input buffer.

Output Buffer

NULL

Output Buffer Length

Zero

Status Block

Irp->IoStatus.Status is set to STATUS_SUCCESS if the request is successful. Otherwise, Status to the appropriate error condition as a NTSTATUS code.

Remarks

DeviceIoControl Parameters

When the DeviceloControl function is called with the IOCTL_WRITE_REGISTERS I/O control code, the caller must specify the address of an IO_BLOCK structure as the function's lpInBuffer parameter.

Using the IO_BLOCK contents, the kernel-mode driver creates a URB that contains a _URB_CONTROL_VENDOR_OR_CLASS_REQUEST structure.

The following table indicates the values assigned to _URB_CONTROL_VENDOR_OR_CLASS_REQUEST structure members.

Structure member Value sssigned
TransferFlags 0
TransferBufferLength pIoBlock->uLength
TransferBuffer pIoBlock->pbyData
TransferBufferMDL NULL
RequestTypeReservedBits 0x40
Request (pIoBlock->uLength > 1) ? 0x04 : 0x0C
Value (SHORT)pIoBlock->uOffset
Index pIoBlock->uIndex

For more information, see Accessing Kernel-Mode Drivers for Still Image Devices.

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

Requirements

   
Header usbscan.h (include Usbscan.h)