Поделиться через


IOCTL_WRITE_REGISTERS IOCTL (usbscan.h)

Записывает в регистры USB-устройства с помощью канала управления.

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

Указатель на структуру IO_BLOCK.

Длина входного буфера

Размер входного буфера.

Выходной буфер

НЕДЕЙСТВИТЕЛЬНЫЙ

Длина выходного буфера

Нуль

Блок состояния

Irp->IoStatus.Status STATUS_SUCCESS, если запрос выполнен успешно. В противном случае состояние соответствующего условия ошибки в качестве кода NTSTATUS.

Замечания

Параметры DeviceIoControl

Когда функция DeviceloControl вызывается с кодом элемента управления IOCTL_WRITE_REGISTERS ввода-вывода, вызывающий объект должен указать адрес структуры IO_BLOCK в качестве параметра функции lpInBuffer.

С помощью содержимого IO_BLOCK драйвер в режиме ядра создает URB, содержащий структуру _URB_CONTROL_VENDOR_OR_CLASS_REQUEST.

В следующей таблице указаны значения, назначенные элементам структуры _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 (include Usbscan.h)