다음을 통해 공유


IOCTL_WRITE_REGISTERS IOCTL(usbscan.h)

제어 파이프를 사용하여 USB 디바이스 레지스터에 씁니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

IO_BLOCK 구조체에 대한 포인터입니다.

입력 버퍼 길이

입력 버퍼의 크기입니다.

출력 버퍼

NULL

출력 버퍼 길이

0

상태 블록

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

요구 사항

요구 사항
헤더 usbscan.h(Usbscan.h 포함)