공동 설치 관리자 작업

참고

이 섹션에 설명된 기능은 지원되지 않으며 이를 포함하는 드라이버 패키지는 더 이상 Microsoft 서명을 받지 않습니다. 유니버설 INF 파일 사용을 참조하세요.

공동 설치 관리자는 다음 그림과 같이 SetupAPI에서 호출됩니다.

공동 설치 관리자가 디바이스 설치에 참여하는 방법을 보여 주는 다이어그램

섀딩되지 않은 상자는 운영 체제가 시스템에서 제공하는 디바이스 설정 클래스에 제공하는 구성 요소를 나타냅니다. 음영 처리된 상자는 제공할 수 있는 구성 요소를 나타냅니다. 사용자 지정 디바이스 설정 클래스를 만드는 경우 클래스 설치 관리자를 제공할 수도 있습니다. 그러나 거의 모든 디바이스가 시스템에서 제공하는 디바이스 설정 클래스 중 하나와 연결될 수 있으므로 새 디바이스 설정 클래스를 만들 필요가 거의 없습니다. Windows 구성 요소에 대한 자세한 내용은 디바이스 설치 개요를 참조하세요.

공동 설치 관리자는 특정 디바이스(디바이스별 공동 설치 관리자) 또는 디바이스 설정 클래스(클래스 공동 설치 관리자)에 대해 제공할 수 있습니다. SetupAPI는 공동 설치 관리자가 등록된 디바이스를 설치할 때만 디바이스별 공동 설치 관리자를 호출합니다. 운영 체제 및 공급업체는 디바이스에 대해 0개 이상의 디바이스별 공동 설치 관리자를 등록할 수 있습니다. SetupAPI는 공동 설치 관리자가 등록된 디바이스 설정 클래스의 디바이스를 설치할 때 클래스 공동 설치 관리자를 호출합니다. 운영 체제 및 공급업체는 디바이스 설정 클래스에 대해 하나 이상의 클래스 공동 설치 관리자를 등록할 수 있습니다. 또한 하나 이상의 설정 클래스에 대해 클래스 공동 설치 관리자를 등록할 수 있습니다.

Windows 및 사용자 지정 디바이스 설치 애플리케이션은 DIF 코드(디바이스 설치 함수 코드)를 사용하여 SetupDiCallClassInstaller 를 호출하여 디바이스를 설치 합니다.

GUI 모드를 설정하는 동안 운영 체제는 DIF 코드를 사용하여 SetupDiCallClassInstaller 를 호출하여 시스템에 있는 비 PnP 디바이스를 검색합니다. IHV는 일반적으로 IHV가 릴리스하는 비 PnP 디바이스에 대해 이 작업을 수행하는 공동 설치 관리자를 제공합니다.

각 DIF 요청에 대해 SetupDiCallClassInstaller 는 디바이스의 설치 클래스에 등록된 클래스 공동 설치 관리자, 특정 디바이스에 등록된 모든 디바이스 공동 설치 관리자, 디바이스의 설치 클래스에 대해 시스템에서 제공하는 클래스 설치 관리자(있는 경우)를 호출합니다.

사용자 지정 디바이스 설치 애플리케이션은 공동 설치 관리자 또는 클래스 설치 관리자를 직접 호출하는 대신 SetupDiCallClassInstaller 를 호출해야 합니다. 이 함수는 등록된 모든 공동 설치 관리자가 적절하게 호출되도록 합니다.

클래스 공동 설치 관리자는 일반적으로 디바이스 설치 전에 등록되며 디바이스별 공동 설치 관리자는 디바이스 설치의 일부로 등록됩니다. 따라서 클래스 공동 설치 관리자는 일반적으로 처음 빌드되고 디바이스 설치 중에 모든 DIF 요청에 대해 호출되는 경우 공동 설치 관리자 목록에 추가됩니다.

운영 체제는 디바이스에 대한 DIF_REGISTER_COINSTALLERS 요청이 완료된 후(또는 SetupDiRegisterCoDeviceInstallers 가 호출됨) 공동 설치 관리자 목록에 디바이스별 공동 설치 관리자를 추가합니다. 디바이스별 공동 설치 관리자는 다음 DIF 요청에 참여하지 않습니다.

DIF_ALLOW_INSTALL

DIF_INSTALLDEVICEFILES

DIF_SELECTBESTCOMPATDRV

클래스 공동 설치 관리자(디바이스별 공동 설치 관리자 아님)만 다음 DIF 요청에 응답할 수 있습니다.

DIF_DETECT

DIF_FIRSTTIMESETUP

DIF_NEWDEVICEWIZARD_PRESELECT

DIF_NEWDEVICEWIZARD_SELECT

DIF_NEWDEVICEWIZARD_PREANALYZE

DIF_NEWDEVICEWIZARD_POSTANALYZE

특정 디바이스가 아직 식별되지 않았거나 설치 초기 단계에 있거나 디바이스 공동 설치 관리자가 아직 등록되지 않았기 때문에 이러한 컨텍스트에서 디바이스 공동 설치 관리자가 적절하지 않습니다.

다음 그림에서는 디바이스별 공동 설치 관리자가 등록된 후 SetupDiCallClassInstaller 가 공동 설치 관리자 및 클래스 설치 관리자를 호출하는 순서를 보여줍니다.

dif 요청 처리 및 후처리를 위해 공동 설치 관리자를 호출하는 다이어그램

이전 그림에 설명된 예제에서 두 클래스 공동 설치 관리자가 이 디바이스의 설정 클래스에 등록되고 디바이스별 공동 설치 관리자 1개가 디바이스에 등록됩니다. 다음 단계는 이전 그림의 원을 그리는 숫자에 해당합니다.

  1. SetupDiCallClassInstaller 는 처리 중인 설치 요청을 나타내는 DIF 코드를 지정하는 첫 번째 클래스 공동 설치 관리자를 호출합니다(이 예제에서는 DIF_INSTALLDEVICE). 공동 설치 관리자에는 설치 요청에 참여하는 옵션이 있습니다. 이 예제에서는 등록된 첫 번째 클래스 공동 설치 관리자가 NO_ERROR 반환합니다.

  2. 또한 SetupDiCallClassInstaller는 등록된 추가 클래스 공동 설치 관리자를 호출합니다. 이 예제에서 두 번째 클래스 공동 설치 관리자는 나중에 사후 처리를 위해 공동 설치 관리자를 호출할 것을 요청하는 ERROR_DI_POSTPROCESSING_REQUIRED 반환합니다.

  3. SetupDiCallClassInstaller 는 등록된 디바이스별 공동 설치 관리자를 호출합니다.

  4. 등록된 모든 공동 설치 관리자가 호출된 후 SetupDiCallClassInstaller 는 디바이스의 설치 클래스에 대한 클래스가 있는 경우 시스템에서 제공하는 클래스 설치 관리자를 호출합니다. 이 예제에서 클래스 설치 관리자는 클래스 설치 관리자의 일반적인 반환 값인 ERROR_DI_DO_DEFAULT 반환합니다.

  5. SetupDiCallClassInstaller 는 설치 요청에 대한 기본 처리기를 호출합니다(있는 경우). DIF_INSTALLDEVICE SetupAPI의 일부인 기본 처리기 SetupDiInstallDevice가 있습니다.

  6. SetupDiCallClassInstaller 는 후처리를 요청한 모든 공동 설치 관리자를 호출합니다. 이 예제에서는 두 번째 클래스 공동 설치 관리자가 후처리를 요청했습니다.

공동 설치 관리자 후처리는 단일 진입점에서 공동 설치 관리자를 두 번째로 호출한다는 점을 제외하고 드라이버 IoCompletion 루틴과 유사합니다. SetupDiCallClassInstaller가 사후 처리에 대한 공동 설치 관리자를 호출하는 경우 PostProcessing을TRUE로 설정하고 InstallResultContext 매개 변수의 적절한 값으로 설정합니다. 이 예제에서는 컨텍스트입니다. 기본 처리기가 성공적으로 실행되었으므로 InstallResult 가 NO_ERROR.

사후 처리의 경우 SetupDiCallClassInstaller 는 공동 설치 관리자를 역순으로 호출합니다. 이전 그림의 모든 공동 설치 관리자가 ERROR_DI_POSTPROCESSING_REQUIRED 반환한 경우 SetupDiCallClassInstaller 는 후처리를 위해 Device_Coinstaller_1 먼저 호출한 다음 Class_Coinstaller_2 호출한 다음 Class_Coinstaller_1. 클래스 설치 관리자는 후처리를 요청하지 않습니다. 공동 설치 관리자만 수행합니다.

이전 공동 설치 관리자가 설치 요청에 실패한 경우에도 후처리를 요청하는 공동 설치 관리자가 호출됩니다.