Partilhar via


IOCTL_WRITE_REGISTERS IOCTL (usbscan.h)

Grava em registros de dispositivo USB usando o pipe de controle.

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

Ponteiro para uma estrutura IO_BLOCK.

Comprimento do buffer de entrada

Tamanho do buffer de entrada.

Buffer de saída

ZERO

Comprimento do buffer de saída

Zero

Bloco de status

Irp->IoStatus.Status será definido como STATUS_SUCCESS se a solicitação for bem-sucedida. Caso contrário, status à condição de erro apropriada como um código de NTSTATUS.

Observações

Parâmetros DeviceIoControl

Quando a função DeviceloControl é chamada com o código de controle de E/S IOCTL_WRITE_REGISTERS, o chamador deve especificar o endereço de uma estrutura IO_BLOCK como o parâmetro lpInBuffer da função.

Usando o conteúdo IO_BLOCK, o driver do modo kernel cria um URB que contém uma estrutura de _URB_CONTROL_VENDOR_OR_CLASS_REQUEST.

A tabela a seguir indica os valores atribuídos a _URB_CONTROL_VENDOR_OR_CLASS_REQUEST membros da estrutura.

Membro da estrutura Valor atribuído
TransferFlags 0
TransferBufferLength pIoBlock–> uLength
TransferBuffer pIoBlock–> pbyData
TransferBufferMDL NULL
requestTypeReservedBits 0x40
de solicitação de (pIoBlock->uLength> 1) ? 0x04: 0x0C
Value (SHORT)pIoBlock –> uOffset
de índice pIoBlock–> uIndex

Para obter mais informações, consulte Acessando drivers de Kernel-Mode para dispositivos de imagem morta.

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

Requisitos

Requisito Valor
cabeçalho usbscan.h (inclua Usbscan.h)