當我嘗試使用 洗掉我的 NDIS LWFnetcfg -u
時,我注意到它不會從驅動程式存盤中洗掉它(可以通過 看到pnputil /enum-drivers
)。
這引起了問題,因為在某些 Windows 10 機器上,如果我們卸載以前版本的 NDIS LWF 并使用 安裝新版本netcfg
,由于某種未知原因,舊的 inf 仍然用于安裝它!我假設它是因為 inf 仍然具有相同的 componentID?我們正在更新 INF 檔案,以便附加到我們以前無法附加的一些虛擬配接器。請注意,這在 Windows 7 中不會發生,我們可以毫無問題地安裝新的。
所以我的問題是:
當我們嘗試安裝具有不同 INF 的新更新驅動程式時,為什么 Windows 仍使用驅動程式商店中的先前 INF?
完全洗掉以前的 NDIS LWF(包括從驅動程式存盤中)的正確方法是什么?如果我們需要使用
pnputil
它從驅動程式商店中完全洗掉它,那么考慮到pnputil -d
需要 OEM 編號,找到 OEM 編號的正確方法是什么?
uj5u.com熱心網友回復:
對,正如您所注意到的,netcfg.exe -i
它與netcfg.exe -u
.
安裝執行以下步驟:
將您提供的 INF 安裝
-l
到驅動程式存盤 (SetupCopyOEMInf
)致電
INetCfgClassSetup::Install
:- 查詢 PNP 以獲得您提供的 componentId 的“最佳匹配”
-i
(SetupDiBuildDriverInfoList
,SetupDiSelectBestCompatDrv
) - 運行 INF 中的所有部分(
AddReg
、、AddService
等) Ndi
使用注冊表項中的資訊向系統注冊 LWF/協議/TDI 驅動程式
- 查詢 PNP 以獲得您提供的 componentId 的“最佳匹配”
卸載執行以下步驟:
- 致電
INetCfgComponent::DeInstall
:- 在系統中注銷您的 LWF/協議/TDI 驅動程式
- 運行 INF 的特殊
.Remove
部分(希望其中包含一個DelReg
,DelService
以撤消在安裝步驟 #2.2 期間完成的所有操作)
(上面的描述忽略了驅動程式參考計數系統(aka OBO_TOKEN
),因為它不經常使用——大多數驅動程式只使用一個參考計數。如果您專門用于netcfg.exe
管理驅動程式,那么您也可以忽略參考計數。)
您可能想知道:為什么這不那么令人敬畏?這里的背景故事是,netcfg.exe
它從未真正成為第三方軟體管理其驅動程式的通用工具。它僅用于內部使用,用于內置在作業系統(ms_tcpip
等)中的驅動程式。假設是第 3 方驅動程式安裝程式希望呼叫適當的 API,例如INetCfg
,而不是CreateProcess
一些可執行檔案和螢屏抓取輸出。所以netcfg.exe
只是建立為我們內部需求的最低要求。特別是很少有人注意卸載,因為很少卸載內置驅動程式。(同樣,引數決議不靈活,幫助文本沒有幫助,錯誤處理也不可靠。)
從 Windows 10 開始,不再使用 安裝內置驅動程式netcfg.exe
,因此作業系統本身不再需要netcfg.exe
。但是到那時,第 3 方產品已經發現了它并依賴于它,所以我們不能再洗掉netcfg.exe
了。呃,好吧。
當我們嘗試安裝具有不同 INF 的新更新驅動程式時,為什么 Windows 仍使用驅動程式商店中的先前 INF?
這是一個常見的問題。請注意,在安裝期間,步驟 #1 和 #2 之間沒有關聯。您可以同時安裝列印機 INF 和 LWF —netcfg.exe -l foo.inf -i bar
不努力確保在步驟 #2.2 中選擇的“最佳”組件實際上來自在步驟 #1 中安裝的 INF。
為了確保您想要的驅動程式是“最佳”驅動程式,您必須確保您喜歡的驅動程式贏得 PNP 驅動程式選擇演算法。我個人對此感到困擾,因為我DriverVer
在開發迭代期間沒有撞線。DriverVer
確保每次更改驅動程式時遞增。
完全洗掉以前的 NDIS LWF(包括從驅動程式存盤中)的正確方法是什么?如果我們需要使用 pnputil 將其從驅動程式存盤中完全洗掉,那么考慮到 pnputil -d 需要 OEM 編號,找到 OEM 編號的正確方法是什么?
老實說,如果您想真正正確地做所有事情,我建議您netcfg.exe
完全避免。請改用底層INetCfg
API。然后您的安裝程式將不得不管理驅動程式 ( SetupCopyOEMInf
/ SetupUninstallOEMInf
)。
netcfg.exe
你不會因為放棄和打電話給INetCfg
自己而損失太多。netcfg.exe
沒有做任何特別花哨的事情INetCfg
:它自己的實作幾乎完全取自這個示例代碼。如果您從那開始并SetupCopyOEMInf
在上面打一個電話,那么您幾乎已經可以與之相提并論netcfg.exe
了。從那里,您可以通過更強大的 INF 卸載來改進它。您甚至可以撰寫一些代碼來使用您的 componentId 清點所有 INF,以確保沒有隱藏的 INF 的陳舊副本。
您仍然必須從安裝 INF 到希望INetCfgClassSetup::Install
認為您最近安裝的 INF 是“最佳”INF 的信任飛躍。但是,如果您已經洗掉了具有該 componentId 的所有其他INF,那么您可以確定唯一剩余的 INF 必須是最佳匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470859.html
上一篇:如何訪問縮略圖工具列按鈕?