다음을 통해 공유


디바이스가 연결되어 있는지 확인

자동 실행에 의해 호출되는 디바이스 설치 애플리케이션의 동작은 사용자가 하드웨어를 먼저 연결하는지 아니면 배포 매체를 먼저 삽입하는지에 따라 달라야 합니다. 독립 하드웨어 공급업체(IHV)는 일반적으로 하나의 배포 디스크를 제공하고 디스크에는 자동 실행 호출 애플리케이션이 하나만 있을 수 있으므로 AutoRun 호출 디바이스 설치 애플리케이션은 디바이스가 연결되어 있는지 여부를 결정해야 합니다.

디바이스가 연결되어 있는지 여부를 확인하기 위해 애플리케이션은 UpdateDriverForPlugAndPlayDevices 함수를 호출하여 디바이스의 하드웨어 ID를 전달할 수 있습니다. 다음 중 하나가 true인 경우 디바이스가 연결됩니다.

  • 함수는 TRUE반환합니다. (디바이스용 드라이버도 설치됩니다.)

  • 함수는 FALSE 을 반환하고, Win32 GetLastError함수는 ERROR_NO_MORE_ITEMS을 반환합니다. (설치가 발생하지 않습니다.)

함수가 FALSE를 반환하고, GetLastError가 NO_SUCH_DEVINST를 반환하는 경우, 디바이스가 연결되지 않은 것입니다. (설치가 발생하지 않습니다.)

분리된 디바이스 다시 설치

이전에 연결되었던 디바이스가 이제 분리되었을 때, 그 디바이스의 devnode는 비활성 상태이고 숨겨져 있지만 시스템에 남아 있습니다. 이러한 디바이스를 다시 설치하려면 먼저 이 "팬텀" 개발 노드를 찾아 다시 설치해야 하는 것으로 표시해야 합니다. 그런 다음 디바이스가 다시 연결되면 플러그 앤 플레이에서 디바이스를 다시 활성화하고, 디바이스에 대한 새 드라이버를 찾고, 디바이스용 드라이버를 설치합니다.

분리된 디바이스를 다시 설치하려면

  1. SetupCopyOEMInf 함수를 호출합니다.

    SetupCopyOEMInf 함수는 올바른 INF 파일이 %SystemRoot%\inf 디렉터리에 있는지 확인합니다.

  2. 분리된 디바이스를 찾습니다.

    SetupDiGetClassDevs 함수를 호출합니다. 이 함수에 대한 호출에서 Flags 매개 변수에서 DIGCF_PRESENT 플래그를 지웁다. 존재하는 디바이스뿐만 아니라 모든 디바이스에 찾아야 합니다. ClassGuid 매개 변수에서 특정 디바이스 클래스를 지정하여 검색 결과를 좁힐 수 있습니다.

  3. 분리된 디바이스의 하드웨어 ID 및 호환 ID를 찾습니다.

    SetupDiGetClassDevs 함수는 디바이스 클래스에서 (첫 번째 단계에서 디바이스 클래스를 지정한 것으로 가정) 모든 설치된 디바이스(연결 여부에 관계없이)를 포함하는 디바이스 정보 집합의 핸들을 반환합니다. SetupDiEnumDeviceInfo 함수를 연속으로 호출하면 이 핸들을 사용하여 디바이스 정보 집합의 모든 디바이스를 열거할 수 있습니다. 각 호출은 디바이스에 대한 SP_DEVINFO_DATA 구조를 제공합니다. 하드웨어 ID 목록을 가져오려면 Property 매개 변수가 SPDRP_HARDWAREID 설정된 SetupDiGetDeviceRegistryProperty 함수를 호출합니다. 호환되는 ID 목록을 가져오려면 동일한 함수를 호출하지만 Property 매개 변수가 SPDRP_COMPATIBLEIDS 설정됩니다. 두 목록 모두 MULTI-SZ 문자열입니다.

  4. 이전 단계의 디바이스 ID와 하드웨어 ID(또는 호환 ID) 간의 일치 항목을 찾습니다.

    하드웨어 ID/호환 ID와 디바이스의 ID 간에 전체 문자열 비교를 수행해야 합니다. 부분 비교로 인해 잘못된 일치 항목이 발생할 수 있습니다.

    일치하는 항목을 찾으면 SP_DRVINFO_DATA를 전달하여 CM_Get_DevNode_Status 함수를 호출합니다. 그리고 dnDevInst 매개 변수 내의 DevInst를 사용합니다. 이 함수가 CR_NO_SUCH_DEVINST 반환하면 디바이스가 연결되지 않은 것을 확인합니다(즉, 가상 devnode가 포함됨).

  5. 디바이스에 표시합니다.

    Property 매개 변수를 SPDRP_CONFIGFLAGS으로 설정하고 SetupDiGetDeviceRegistryProperty 함수를 호출합니다. 이 함수가 반환되면 PropertyBuffer 매개 변수는 레지스트리에서 디바이스의 ConfigFlags 값을 가리킵니다. CONFIGFLAG_REINSTALL 사용하여 이 값의 비트 OR을 수행합니다(Regstr.h정의됨). 이 작업을 수행한 후 SetupDiSetDeviceRegistryProperty 함수를 호출합니다. Property 매개 변수가 SPDRP_CONFIGFLAGS 설정되고 PropertyBuffer 매개 변수가 디바이스의 수정된 ConfigFlags 값으로 설정된 상태에서 이 작업은 레지스트리의 ConfigFlags 값을 수정하여 CONFIGFLAG_REINSTALL 플래그를 통합합니다. 이렇게 하면 다음에 디바이스가 다시 열거될 때 디바이스가 다시 설치됩니다.

  6. 디바이스를 연결합니다.

    플러그 앤 플레이는 디바이스를 다시 활성화하고, 새 드라이버를 찾고, 해당 드라이버를 설치합니다.