共用方式為


共同安裝程式作業

注意

本節所述的功能不受支援,且包含這些功能的驅動程式套件將不再收到 Microsoft 簽章。 請參閱 使用通用 INF 檔案

安裝程式是由 SetupAPI 呼叫,如下圖所示。

說明共同安裝程式如何參與裝置安裝的圖表。

未遮蔽的方塊代表作業系統針對 系統提供的裝置安裝類別所提供的元件。 陰影方塊代表您可以提供的元件。 如果您建立自訂裝置安裝類別,您也可以提供類別安裝程式。 不過,您很少需要建立新的裝置安裝類別,因為幾乎所有裝置都可以與其中一個系統提供的裝置安裝類別相關聯。 如需 Windows 元件的詳細資訊,請參閱 裝置安裝概觀

您可以針對特定裝置提供共同 安裝程式 (裝置特定共同安裝程式) 或裝置安裝類別 (類別 共同安裝程式) 。 只有在安裝註冊共同安裝程式的裝置時,SetupAPI 才會呼叫裝置特定的共同安裝程式。 作業系統和廠商可以註冊裝置的零或多個裝置特定共同安裝程式。 SetupAPI 會在安裝註冊共同安裝程式之裝置安裝類別的任何裝置時呼叫類別共同安裝程式。 作業系統和廠商可以註冊裝置安裝類別的一或多個類別共同安裝程式。 此外,類別共同安裝程式也可以註冊一或多個安裝類別。

Windows 和 自訂裝置安裝應用程式 會藉由呼叫 SetupDiCallClassInstaller 搭配 裝置安裝函式代碼 (DIF 程式碼) 來安裝裝置。

在 GUI 模式設定期間,作業系統會使用 DIF 程式碼呼叫 SetupDiCallClassInstaller ,以偵測系統中存在的非 PnP 裝置。 IHV 通常會提供共同安裝程式,以針對 IHV 發行的非 PnP 裝置執行此動作。

針對每個 DIF 要求, SetupDiCallClassInstaller 會呼叫針對裝置的安裝類別註冊的任何類別共同安裝程式、針對特定裝置註冊的任何裝置共同安裝程式,然後在有一個裝置的安裝類別時,由系統提供的類別安裝程式。

自訂裝置安裝應用程式必須呼叫 SetupDiCallClassInstaller ,而不是直接呼叫共同安裝程式或類別安裝程式。 此函式可確保適當地呼叫所有已註冊的共同安裝程式。

類別共同安裝程式通常會在裝置安裝之前註冊,而裝置特定的共同安裝程式會註冊為裝置安裝的一部分。 因此,類別共同安裝程式通常會在第一次建置時新增至共同安裝程式清單,並在裝置安裝期間針對所有 DIF 要求呼叫。

作業系統會在裝置 (或SetupDiRegisterCoDeviceInstallers完成DIF_REGISTER_COINSTALLERS要求之後,將裝置特定的共同安裝程式新增至共同安裝程式清單) 。 裝置特定的共同安裝程式不會參與下列 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. SetupDiCallClassInstaller 會呼叫第一個類別共同安裝程式,並指定 DIF 程式碼,指出正在處理 (DIF_INSTALLDEVICE安裝要求,在此範例中) 。 共同安裝程式可以選擇參與安裝要求。 在此範例中,第一個已註冊的類別共同安裝程式會傳回NO_ERROR。

  2. SetupDiCallClassInstaller接著會呼叫任何其他已註冊的類別共同安裝程式。 在此範例中,第二個類別的共同安裝程式會傳回ERROR_DI_POSTPROCESSING_REQUIRED,要求稍後呼叫共同安裝程式以進行後置處理。

  3. SetupDiCallClassInstaller 會呼叫任何已註冊的裝置特定共同安裝程式。

  4. 呼叫所有已註冊的共同安裝程式之後,如果裝置的安裝程式類別有一個, SetupDiCallClassInstaller 會呼叫系統提供的類別安裝程式。 在此範例中,類別安裝程式會傳回ERROR_DI_DO_DEFAULT,這是類別安裝程式的典型傳回值。

  5. 如果有安裝要求,SetupDiCallClassInstaller會呼叫安裝要求的預設處理常式。 DIF_INSTALLDEVICE有預設處理常式 SetupDiInstallDevice,這是 SetupAPI 的一部分。

  6. SetupDiCallClassInstaller 會呼叫任何要求後置處理的共同安裝程式。 在此範例中,第二個類別共同安裝程式要求後置處理。

共同安裝程式後置處理類似于驅動程式 IoCompletion 常式,不同之處在于共同安裝程式會在單一進入點第二次呼叫。 當 SetupDiCallClassInstaller呼叫後置處理的共同安裝程式時,會將PostProcessing設定為TRUE並將 InstallResult設定為CoNtext參數中的適當值。 在此範例中為 CoNtextInstallResult 是NO_ERROR,因為預設處理常式已成功執行。

針對後置處理, SetupDiCallClassInstaller 會以反向順序呼叫共同安裝程式。 如果上圖中的所有共同安裝程式都傳回ERROR_DI_POSTPROCESSING_REQUIRED, 則 SetupDiCallClassInstaller 會先呼叫 Device_Coinstaller_1 以進行後置處理,後面接著Class_Coinstaller_2,然後Class_Coinstaller_1。 類別安裝程式不會要求後置處理;只有共同安裝程式才會這麼做。

即使先前的共同安裝程式失敗安裝要求,也會呼叫要求後置處理的共同安裝程式。