共用方式為


建立新的基本類型驅動程式

使用基本驅動程式來處理及管理使用 INF 型安裝,但不一定系結至特定硬體裝置的軟體。

基本驅動程式的背景和優點

在 Windows 10 版本 1903 之前,某些使用 INF 型安裝但不一定與特定硬體裝置相關聯的軟體類型,作業系統未能完全支援。 雖然這些軟體使用 INF 檔案做為安裝指令清單,但 OS 並未直接察覺此案例,而且不支援以原生方式處理它。

由於這些軟體未系結至硬體裝置,因此無論硬體為何,都會安裝在整個系統上。 因此,無法保證這些軟體已正確安裝、卸載或在操作系統升級時妥善處理。

從 Windows 10 版本 1903 開始,隨插即用平臺會以最上層實體的形式處理和管理這種類型的軟體套件,進而提升可靠性並保證這類軟體的適當行為,特別是在 OS 升級和重設案例期間。

利用這個新平臺支持的軟體類型稱為 基本驅動程式。 基本驅動程式會繼續使用 INF 型安裝,而基礎平臺會利用 驅動程式存放區 來追蹤所有相關檔案。

基礎的隨插即用平台然後會順利地安裝、卸載並在操作系統升級時維護驅動程式的狀態。

從概念上講,這些 INF 會以不同的方式管理。 先前,[DefaultInstall] (且通常為 [DefaultUninstall]] 是由 SetupAPI 以類似腳本的方式處理,其中 INF 會作為指令清單使用, 而 SetupAPI 代表呼叫者執行相關區段中的指示。

撤銷變更(以執行卸載)需要指定一個 INF 區段,該區段執行與安裝區段相反的指令集。 不過,利用 INF 的原始驅動程式不需要卸載區段。

基本驅動程式使用與設備驅動器相同的安裝和卸載 API,其中卸載 API 會執行反向作業集做為安裝作業,而安裝或卸載驅動程式套件的動作將會處理這些區段。

存取基本驅動程式功能的 INF 需求

  • [ 版本] 區段必須完成,就像 PnP 驅動程序一樣。

    • Provider 指令必須填寫。

    • 類別指令必須填入。

    • ClassGuid 指示詞必須填入。

  • 驅動程式必須是 DCH 相容

  • 可能不存在 [Manufacturer] 區段。

  • [DefaultInstall] 區段必須經過架構裝飾,而且不得有未裝飾的版本存在。

    • 正確: [DefaultInstall.NTamd64]

    • 不正確: [DefaultInstall]

  • [DefaultUninstall] 可能不存在於 INF 中(有例外情況請參閱 的舊版兼容性)。

以 Windows 10 版本 1903 和更新版本為目標的原始驅動程式

僅針對 Windows 10 版本 1903 及更新版本的基本驅動程式,應使用 DiInstallDriverDiUninstallDriver 來正確安裝及卸載驅動程式存放區中的軟體。

驅動程式也應該使用 Dirid 13 來正確指定驅動程式存放區作為要安裝的目的地。

舊版相容性

雖然基本驅動程式中禁止 [DefaultUninstall],但基於下層 OS 相容性而發生例外狀況。 Windows 引進了 INF 指示詞,導致支援 Primitive Drivers 的 OS 版本忽略 [DefaultUninstall] 區段。 如果您的驅動程式套件需要支援下層 OS 版本,請包含下列語法,以確保平臺會適當地處理這類情況:

[DefaultUninstall.NTamd64]
LegacyUninstall=1

[DefaultInstall] 和 [DefaultUninstall] 區段 仍必須依架構加以裝飾; 不過,透過包含 LegacyUninstall=1,Windows 會忽略 [DefaultUninstall] 區段(在 Windows 10 版本 1903 和更新版本中)。 如此一來,您可以在 INF 中包含該區段,使其與舊版安裝/卸載應用程式配合使用,以卸載基本驅動程式套件。

從 Windows 10 版本 1903 開始,如果您將架構裝飾的 [DefaultInstall] 或 [DefaultUninstall] 區段傳遞給 setupapi.dll中的 InstallHInfSection API,則會檢查驅動程式套件是否支援基本驅動程式功能。 如果它確實支援基本驅動程式功能,而不是以舊版方式處理指定的區段,INF 會適當地傳遞至 DiInstallDriverDiUninstallDriver。 如此一來,單一安裝程式就可以在相容的OS版本上使用基本驅動程式,並維護舊版OS的支援。

從設備驅動器 INF 轉換

將使用 [Manufacturer] 的 INF 轉換成使用 [DefaultInstall] 的 INF 需要對 INF 進行次要變更。 不同於 [Manufacturer] 區段,[DefaultInstall] 區段同時是進入點和安裝區段。 這在概念上將 [Manufacturer]、[Models] 和 [DDInstall] 區段合併成一個。

下列 INF 會在 InfVerif 中收到 1297 錯誤,因為它不會安裝在任何硬體上:

[Manufacturer]
%Company% = Driver, NTx86, NTamd64

[Driver.NTx86]
%DeviceDesc% = InstallSection_32,

[Driver.NTamd64]
%DeviceDesc% = InstallSection_64,

[InstallSection_64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[InstallSection_64.Services]
AddService = MyService,, MyService_Install

[InstallSection_32]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[InstallSection_32.Services]
AddService = MyService,, MyService_Install

上述 INF 可以轉換成以 [DefaultInstall] 為基礎的 INF,如下所示。

[DefaultInstall.NTamd64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[DefaultInstall.NTamd64.Services]
AddService = MyService,, MyService_Install

[DefaultInstall.NTx86]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[DefaultInstall.NTx86.Services]
AddService = MyService,, MyService_Install