windows裝置停用啟動雜記

2021-08-01 09:46:54 字數 1165 閱讀 1479

公司(oem廠商)的電腦公升級到win10 rs2 rtm後,發現有部分ms inbox驅動在電源事件後會出現黃標的現象(errorcode=43--queryremove失敗)甚至driver lost。ms雖然承認是他們的issue,但是至少要到6月底才修復。於是,部門決定讓我做個work around:出現黃標時reset裝置(其實就是停用-啟用裝置),並額外要求由於這個wa需要給產線使用,所以reset裝置時,最好不能重啟電腦。其實**實現可以參考ms ddk中devcon提供的原始碼,只是在測試過程中我想到這麼個事:

1.並非所有的裝置在停用啟用過程中需要重啟電腦生效,windows如何判斷裝置需要重啟?

2.也並非所有裝置都支援停用啟用的操作,右鍵這部分裝置,會發現並沒有停用/啟用的功能,比如一些關在root下的虛擬驅動:即插即用裝置列舉器(驅動檔案:swenum.sys,裝置hwid:root\swenum);卷管理器(驅動檔案:volmgr.sys,裝置hwid:root\volmgr),再比如一些acpi裝置:acpi lid(驅動檔案:無,裝置hwid:acpi\pnp0c0d)。windows又是通過什麼決定裝置是否支援停用啟動功能?

a.裝置對應的service在登錄檔中的starttype項如果等於0,停用啟動過程中可能會被要求重啟電腦。比如給hdd裝置通過setupdi api簇安裝過濾驅動,會被要求重啟電腦生效。這時就需要把setup api做的步驟分解,用非標準的手段(不呼叫setupdi api來修改登錄檔/拷貝檔案等)規避重啟的過程。

b.停用裝置時,裝置上可能有控制代碼開啟。(對於這個我想到用windbg擴充套件命令!devhandles檢查開啟裝置的控制代碼,然而這個命令除了卡,根本達不到預期效果。看來有空我要試試用windbg指令碼實現這個功能)

對於問題2。我觀察裝置管理器中各個裝置的devnode的屬性,發現這麼個現象:

a.usb root hub可支援停用啟用操作。它的裝置屬性中有個標誌位:

b.對於一些不支援停用啟用的裝置,其裝置屬性的狀態中並沒有這樣的標誌位,如pci standard isa bridge裝置:

大概這就是區別吧,望高手指正,謝謝

啟用與停用裝置

想要實現類似裝置管理器的功能,其實也不是很難,無非就是呼叫一些api函式,就像本文描述的,採用的api函式就是setupdi系列的函式。不過這類函式有很多,具體的請參見msdn,而實現裝置啟用 停用僅需要用到的就只有5個函式 setupdigetclassdevs 獲取裝置資訊集 setupdien...

裝置接入專案雜記

乙個幾年前的裝置接入平台專案,本人參與不多,因為要準備乙個類似專案,抽了兩個小時重新走讀了下核心 記錄一些知識點備忘 1 通訊基礎採用mina框架 mina服務端主要流程 a.ioaccept 監聽來自網路的請求 b.當新的連線建立時,建立session,該session對應某個ip加埠 c.資料報...

Windows 命令雜記錄

區域網共享,檢視已登入過的帳號 net use清除已登入過的所有帳號 net use del登入,表示要求輸入密碼,net use 10.10.20.193 user 登入帳號 persistent yes 表示要輸入密碼 net use 10.10.20.193 密碼 user 登入帳號 pers...