디바이스가 연결되어 있는지 확인
자동 실행 호출 디바이스 설치 애플리케이션 의 동작은 사용자가 하드웨어를 먼저 플러그 인할지 아니면 배포 매체를 먼저 삽입하는지에 따라 달라야 합니다. 독립 하드웨어 공급업체(IHV)는 일반적으로 하나의 배포 디스크를 제공하고 디스크에는 AutoRun 호출 애플리케이션이 하나만 있을 수 있으므로 AutoRun 호출 디바이스 설치 애플리케이션은 디바이스가 연결되어 있는지 여부를 결정해야 합니다.
디바이스가 연결되어 있는지 여부를 확인하기 위해 애플리케이션은 UpdateDriverForPlugAndPlayDevices 함수를 호출하여 디바이스의 하드웨어 ID를 전달할 수 있습니다. 다음 중 하나가 true인 경우 디바이스가 연결됩니다.
함수는 TRUE를 반환 합니다. (디바이스용 드라이버도 설치합니다.)
함수는 FALSE 를 반환하고 Win32 GetLastError함수는 ERROR_NO_MORE_ITEMS 반환합니다. (설치가 수행되지 않습니다.)
함수가 FALSE 를 반환하고 GetLastError 가 NO_SUCH_DEVINST 반환하는 경우 디바이스가 연결되지 않습니다. (설치가 수행되지 않습니다.)
분리된 디바이스 다시 설치
이전에 연결되었던 디바이스가 이제 분리되면 디바이스의 devnode 는 비활성 상태이고 숨겨져 있지만 시스템에 남아 있습니다. 이러한 디바이스를 다시 설치하려면 먼저 이 "팬텀" devnode를 찾아 다시 설치가 필요한 것으로 표시해야 합니다. 그런 다음 디바이스가 다시 연결되면 플러그 앤 플레이 디바이스를 다시 열거하고 새 드라이버를 찾은 다음 디바이스용 드라이버를 설치합니다.
분리된 디바이스를 다시 설치하려면 다음을 수행합니다.
SetupCopyOEMInf 함수를 호출합니다.
SetupCopyOEMInf 함수는 올바른 INF 파일이 %SystemRoot%\inf 디렉터리에 있는지 확인합니다.
분리된 디바이스를 찾습니다.
SetupDiGetClassDevs 함수를 호출합니다. 이 함수에 대한 호출에서 Flags 매개 변수에서 DIGCF_PRESENT 플래그를 지웁합니다. 존재하는 디바이스뿐만 아니라 모든 디바이스를 찾아야 합니다. ClassGuid 매개 변수에서 특정 디바이스 클래스를 지정하여 검색 결과를 좁힐 수 있습니다.
분리된 디바이스의 하드웨어 ID 및 호환되는 ID를 찾습니다.
SetupDiGetClassDevs 는 디바이스 클래스에서 설치된 모든 디바이스가 포함된 디바이스 정보 집합 에 대한 핸들을 디바이스 클래스에 반환합니다(첫 번째 단계에서 디바이스 클래스를 지정했다고 가정). SetupDiEnumDeviceInfo 함수를 연속으로 호출하면 이 핸들을 사용하여 디바이스 정보 집합의 모든 디바이스를 열거할 수 있습니다. 각 호출은 디바이스에 대한 SP_DEVINFO_DATA 구조를 제공합니다. 하드웨어 ID 목록을 가져오려면 Property 매개 변수가 SPDRP_HARDWAREID 설정된 SetupDiGetDeviceRegistryProperty 함수를 호출합니다. 호환되는 ID 목록을 가져오려면 동일한 함수를 호출하지만 속성 매개 변수를 SPDRP_COMPATIBLEIDS. 두 목록 모두 MULTI-SZ 문자열입니다.
디바이스의 ID와 이전 단계의 하드웨어 ID(또는 호환 ID) 간의 일치 항목을 찾습니다.
하드웨어 ID/호환 ID와 디바이스의 ID 간에 전체 문자열 비교를 수행해야 합니다. 부분 비교는 잘못된 일치로 이어질 수 있습니다.
일치 항목을 찾으면 CM_Get_DevNode_Status 함수를 호출하고 SP_DRVINFO_DATA 전달합니다. dnDevInst 매개 변수의 DevInst입니다. 이 함수가 CR_NO_SUCH_DEVINST 반환하면 디바이스가 연결되지 않은 것을 확인합니다(즉, 가상 devnode가 포함됨).
디바이스를 표시합니다.
Property 매개 변수를 SPDRP_CONFIGFLAGS 설정하여 SetupDiGetDeviceRegistryProperty 함수를 호출합니다. 이 함수가 반환되면 PropertyBuffer 매개 변수는 레지스트리에서 디바이스의 ConfigFlags 값을 가리킵니다. CONFIGFLAG_REINSTALL(Regstr.h에 정의됨)을 사용하여 이 값의 비트 OR을 수행합니다. 이렇게 하면 Property 매개 변수가 SPDRP_CONFIGFLAGS 설정되고 PropertyBuffer 매개 변수가 디바이스의 수정된 ConfigFlags 값의 주소로 설정된 SetupDiSetDeviceRegistryProperty 함수를 호출합니다. 이 작업은 레지스트리의 ConfigFlags 값을 수정하여 CONFIGFLAG_REINSTALL 플래그를 통합합니다. 이렇게 하면 다음에 디바이스를 다시 열거할 때 디바이스가 다시 설치됩니다.
디바이스를 연결합니다.
플러그 앤 플레이 디바이스를 다시 활성화하고 새 드라이버를 찾은 다음 해당 드라이버를 설치합니다.