WBDI 드라이버에서 WinUSB 사용

WBDI 드라이버는 UMDF(사용자 모드 드라이버 프레임워크)에 기본 제공되는 USB I/O 대상을 사용하는 것이 좋습니다.

UmdfDispatcher 설정

UMDF 드라이버를 설치하는 INF 파일에는 WDF 관련 DDInstall 섹션이 포함되어야 합니다. UMDF에서 USB I/O 대상을 사용하는 경우 이 DDInstall 섹션 내에서 UmdfDispatcher 레지스트리 지시문을 설정해야 합니다.

WudfBioUsbSample 샘플의 WudfBioUsbSample.inx에서 다음 섹션은 이 지시문을 설정하는 방법을 보여 줍니다.

[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample

UmdfDispatcher에 대한 자세한 내용은 UmdfDispatcher INF 지시문 지정을 참조 하세요. WDF 레지스트리 지시문에 대한 일반적인 내용은 WDF 지시문 지정을 참조 하세요.

보류 중인 비동기 읽기 요청

WinUsb는 여러 미해결 읽기 요청을 처리할 수 있습니다. 검색하는 동안 읽기 작업 간에 최소 대기 시간이 필요한 디바이스는 몇 가지 미해결 비동기 읽기 요청을 보류 상태로 유지해야 합니다. 드라이버가 비동기 요청을 수행하는 경우 WinUsb는 이전 읽기 요청의 완료 루틴에 대한 사용자 모드로 다시 전송하기 전에 이러한 요청을 발급합니다.

WudfBioUsbSampleCBiometricDevice::InitiatePendingRead Device.cpp 메서드를 참조하여 읽기 요청을 보류하는 방법에 대한 코드 예제를 볼 수 있습니다.

읽기 요청을 보류하는 코드는 다음 단계의 루프여야 합니다.

  1. IWDFDriver::CreatePreallocatedWdfMemory를 호출 하여 미리 할당된 프레임워크 메모리 개체를 만듭니다.

  2. OnCompletion 루틴에서 콜백 코드를 제공합니다. 샘플에서 참조 CBiometricDevice::OnCompletion 하세요.

  3. 소유 개체의 IRequestCallbackRequestCompletion 인터페이스에 대한 포인터를 가져옵니다.

  4. IWDFIoRequest::SetCompletionCallback을 호출하고 이전 단계에서 가져온 IRequestCallbackRequestCompletion에 대한 포인터를 전달하여 콜백 함수를 등록합니다. 이제 I/O 요청이 완료되면 프레임워크에서 콜백을 호출합니다.

  5. IWDFIoRequest::Send를 호출하여 디바이스에 읽기 요청을 보냅니다.

  6. 콜백 완료가 발생할 때 읽기 요청을 처리합니다. OnCompletion 루틴이 보류 중인 새 읽기 요청을 시작하기 전에 I/O 대상의 상태를 확인해야 합니다. 이렇게 하려면 IWDFIoTargetStateManagement 인터페이스에 대한 포인터에 대해 IWDFUsbTargetPipe를 쿼리합니다. 그런 다음 IWDFIoTargetStateManagement::GetState를 호출합니다.

    IWDFIoTarget * pTarget
    IWDFIoTargetStateManagement * pStateMgmt = NULL;
    WDF_IO_TARGET_STATE state;
    
    HRESULT hrQI = pTarget->QueryInterface(IID_PPV_ARGS(&pStateMgmt));
    WUDF_TEST_DRIVER_ASSERT((SUCCEEDED(hrQI) && pStateMgmt));
    
    state = pStateMgmt->GetState();
    

검색이 완료되면 보류 중인 읽기 요청을 취소합니다.

UMDF-USB 대상을 사용하는 경우 전원이 켜지고 전원이 켜진 동안 읽기 요청이 보류 상태로 유지되도록 허용할 수 있습니다.

UMDF-USB 대상을 사용하지 않는 경우 드라이버는 D0Exit에서 보류 중인 읽기 요청 전송을 중지하고 D0Entry에서 다시 시작해야 합니다.

선택적 일시 중단

WBDI 드라이버는 USB 선택적 일시 중단을 지원해야 합니다.

시스템 절전 모드 해제 및 디바이스 유휴를 지원하는 디바이스는 WudfBioUsbSample.inx의 이 코드 예제와 같이 WinUsb에서 선택적 일시 중단에 대한 레지스트리 설정을 사용하도록 설정해야 합니다.

HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1

운영 체제 USB 스택은 시스템 절전 모드 해제와 드라이버가 디바이스에서 읽기를 시작할 수 있는 시점 사이의 타이밍을 보장할 수 없습니다.

이상적으로 디바이스는 시스템이 일시 중단될 때 스캔을 캡처할 준비가 된 상태로 남아 있어야 합니다. 시스템이 일시 중단되는 동안 검색이 발생하는 경우 디바이스는 전체 지문 검사에 대한 입력 데이터를 캐시해야 합니다. 시스템이 절전 모드 해제되면 드라이버는 디바이스에서 데이터를 읽습니다. 이 시나리오를 지원하면 시스템 절전 모드 해제 및 잠금 해제/로그인 시나리오를 사용하도록 설정할 수 있습니다.