UMDF 드라이버가 로드되지 않거나 UMDF 디바이스가 시작되지 않는 이유 확인
이 항목에서는 UMDF 드라이버가 로드되지 않거나 연결된 디바이스가 시작되지 않을 때 사용할 수 있는 문제 해결 단계에 대해 설명합니다.
UMDF 버전 1 및 2 드라이버에서 다음 기술을 사용할 수 있습니다.
다음 파일이 올바른지 확인하여 설정을 확인합니다.
드라이버의 INF 파일입니다.
InfVerif 도구를 사용하여 드라이버의 INF 파일의 유효성을 검사합니다.
%windir%\inf\setupapi.dev.log(Windows XP의 setupapi.log), %windir%\setupact.log 및 %windir%\temp\wudf_update.log 파일.
설치 문제를 찾지 못한 경우 WDF 검증 도구 제어 애플리케이션(WdfVerifier.exe)을 사용하여 HostProcessDbgBreakOnStart 레지스트리 항목을 사용하도록 설정합니다. HostProcessDbgBreakOnStart를 사용하도록 설정하면 WUDFHost.exe 시작된 직후에 드라이버 DLL이 로드되기 직전에 디바이스(WUDFHost.exe)에 대한 드라이버 호스트 프로세스가 디버거로 중단됩니다.
커널 모드 디버거가 아닌 사용자 모드 디버거를 사용하여 HostProcessDbgBreakOnStart 를 사용하도록 설정해야 합니다. 커널 모드 디버거는 기본적으로 사용자 모드 모듈 로드 및 언로드 알림을 받지 않습니다. 따라서 지연된 중단점을 설정할 수 없습니다.
호스트 시작이 표시되지 않으면 다음 단계를 수행하여 디바이스를 올바르게 구성합니다.
- INF를 통해 설치하는 모든 드라이버가 존재하고 운영 체제에 복사되었는지 확인합니다.
- 리플렉터(WUDFRd.sys라고도 함)가 디바이스의 서비스가 아닌 경우 드라이버에 서비스 항목(예: 'sc qc foo')이 있고 자동으로 시작되도록 설정되어 있는지 확인합니다.
드라이버의 기호가 기호 경로(즉, .sympath)에 있는지 확인합니다.
다음 항목을 한 번에 하나씩 확인합니다. 다음 단계에서는 드라이버가 foo.dll 가정합니다.
드라이버의 DllMain 루틴이 호출되었는지 확인합니다(예: bu Foo! DllMain).
드라이버 DLL이 로드되는 경우 후속 단계에 대해 HostProcessDbgBreakOnDriverLoad 레지스트리 항목을 사용할 수도 있습니다. HostProcessDbgBreakOnDriverLoad를 설정하면 드라이버 DLL이 로드된 후 WUDFHost.exe 디버거에 침입합니다. 드라이버 로드 및 디바이스 시작 프로세스의 이 시점에서 드라이버 코드에서 중단점을 설정할 수 있으므로 HostProcessDbgBreakOnDriverLoad를 커널 모드 디버거와 함께 사용할 수도 있습니다.
이 단계는 UMDF 버전 1 드라이버에만 적용됩니다. 드라이버의 DllGetClassObject 루틴이 호출되었는지 확인합니다. 드라이버의 클래스 식별자(ID)가 올바른지 확인합니다. DllGetClassObject가 성공적으로 실행되고 드라이버 개체(예: bu Foo! DllGetClassObject).
UMDF 버전 1의 경우 드라이버의 IDriverEntry::OnDeviceAdd 메서드가 호출되었는지 확인합니다. 메서드가 디바이스를 만들고 성공적으로 반환되는지 확인합니다(예: bu Foo! CMyDriver::OnDeviceAdd).
UMDF 버전 2의 경우 드라이버의 EvtDriverDeviceAdd 함수가 호출되었는지 확인합니다. 함수가 디바이스를 만들고 성공적으로 반환되는지 확인합니다(예: bu Foo! MyDriverDeviceAdd).
UMDF 버전 1의 경우 드라이버의 IPnpCallbackHardware::OnPrepareHardware 또는 IPnpCallback::OnD0Entry 메서드가 호출되었는지 확인합니다. 메서드가 성공적으로 반환되는지 확인합니다(예: bu Foo! CMyDevice::OnPrepareHardware 또는 Foo! CMyDevice::OnD0Entry).
UMDF 버전 2의 경우 드라이버의 EvtDevicePrepareHardware 또는 EvtDeviceD0Entry 함수가 호출되었는지 확인합니다. 함수가 성공적으로 반환되는지 확인합니다(예: bu Foo! MyDevicePrepareHardware 또는 Foo! MyDeviceD0Entry).
각 이전 작업이 성공적으로 실행되었지만 다음 작업이 실행되지 않는 경우 다음 항목을 검사 합니다.
- 사용자 모드 스택의 드라이버 위와 아래에 있는 모든 드라이버도 이러한 작업을 성공적으로 수행하는지 확인합니다.
- 드라이버 아래의 커널 스택이 IRP_MJ_PNP 성공적으로 완료되고 IRP_MN_START_DEVICE IRP가 완료되었는지 확인합니다.