建立新的基本驅動程式
使用基本驅動程式來處理和管理使用 INF 型安裝但不一定系結至特定硬體裝置的軟體。
基本驅動程式的背景和優點
在 Windows 10 1903 版之前,某些使用 INF 型安裝但未一定系結至特定硬體裝置的軟體類型並未受到 OS 完全支援。 雖然這些軟體部分使用 INF 檔案作為安裝指令清單,但操作系統並未直接察覺此案例,而且不支援以原生方式處理。
由於這些軟體片段未系結至硬體裝置,因此不論硬體為何,它們都會安裝在整個系統上。 因此,不保證這些軟體片段已在操作系統升級上正確安裝、卸載或處理。
從 Windows 10 1903 版開始,隨插即用 平臺會以最上層實體的形式處理和管理這種類型的軟體套件,進而提升這類軟體的可靠性並保證適當的行為,特別是在 OS 升級和重設案例期間。
利用這個新平臺支持的軟體類型稱為 基本驅動程式。 基本驅動程式會繼續使用 INF 型安裝,而基礎平臺會利用 驅動程式存放區 來追蹤所有相關檔案。
基礎 隨插即用 平台接著會正常安裝、卸載和維護作業系統升級上的驅動程序狀態。
概念上,這些 INF 會以不同的方式管理。 先前,[DefaultInstall] (,而且通常 [DefaultUninstall]) 是由 SetupAPI 以類似腳本的方式處理,其中 INF 會當做指令清單使用, 而 SetupAPI 代表呼叫端執行相關區段中的指示。
復原變更 (執行卸載) 需要指定執行安裝區段相反指令集的 INF 區段。 不過,利用基本驅動程式的 INF 不需要卸載區段。
基本驅動程式使用與設備驅動器相同的安裝和卸載 API,其中卸載 API 將執行反向作業集作為安裝作業,而安裝或卸載驅動程式套件的動作將會處理這些區段。
存取基本驅動程式功能的 INF 需求
[版本] 區段必須完成,就像 PnP 驅動程序一樣。
提供者指示詞必須填入。
必須填入 Class 指示詞。
ClassGuid 指示詞必須填入。
驅動程式必須是 DCH 相容。
可能沒有 [製造商] 區段。
[DefaultInstall] 區段必須裝飾架構,而且可能沒有未修改的版本。
正確: [DefaultInstall.NTamd64]
不正確: [DefaultInstall]
[DefaultUninstall] 可能不存在於 INF (請參閱例外狀況的 舊版相容性) 。
僅以 Windows 10 1903 版和更新版本為目標的基本驅動程式
僅以 1903 版和更新版本 Windows 10 為目標的基本驅動程式應該使用 DiInstallDriver 和 DiUninstallDriver,在驅動程式存放區中正確安裝和卸載其軟體。
驅動程式也應該使用 Dirid 13 正確指定驅動程式存放區作為要安裝的目的地。
舊版相容性
雖然在 Primitive Drivers 中禁止 [DefaultUninstall],但為了降低操作系統相容性而發生例外狀況。 Windows 引進了 INF 指示詞,導致支援 Primitive Drivers 的 OS 版本忽略 [DefaultUninstall] 區段。 如果您的驅動程式套件需要支援下層 OS 版本,請包含下列語法,以確保平臺會適當地處理這類案例:
[DefaultUninstall.NTamd64]
LegacyUninstall=1
[DefaultInstall] 和 [DefaultUninstall] 區段仍必須裝飾架構;不過,藉由包含 LegacyUninstall=1
,Windows 會忽略 Windows 10 1903 版和更新版本中 (的 [DefaultUninstall] 區段) 。 如此一來,您就可以在 INF 中包含該區段,其中可以搭配舊版安裝/卸載應用程式使用,以卸載基本驅動程式套件。
從 Windows 10 1903 版開始,如果您將架構裝飾的 [DefaultInstall] 或 [DefaultUninstall] 區段傳遞至 setupapi.dll 中的 InstallHInfSection API,則會檢查驅動程式套件是否支援基本驅動程式功能。 如果它確實支援基本驅動程式功能,而不是以舊版方式處理指定的區段,則 INF 會視需要傳遞至 DiInstallDriver 或 DiUninstallDriver。 如此一來,單一安裝程式就可以在相容的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