天天看點

windows裝置停用啟動雜記

    公司(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又是通過什麼決定裝置是否支援停用啟動功能?

對于問題1。我首先覺得可能停用啟用裝置時,需要重新加載裝置棧的裝置可能會要求重新開機。求教公司的大神,大神覺得有2種可能:

a.裝置對應的service在系統資料庫中的StartType項如果等于0,停用啟動過程中可能會被要求重新開機電腦。比如給HDD裝置通過SetupDi API簇安裝過濾驅動,會被要求重新開機電腦生效。這時就需要把Setup API做的步驟分解,用非标準的手段(不調用SetupDI API來修改系統資料庫/拷貝檔案等)規避重新開機的過程。

b.停用裝置時,裝置上可能有句柄打開。(對于這個我想到用windbg擴充指令!devhandles檢查打開裝置的句柄,然而這個指令除了卡,根本達不到預期效果。看來有空我要試試用windbg腳本實作這個功能)

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

a.USB Root Hub可支援停用啟用操作。它的裝置屬性中有個标志位:

windows裝置停用啟動雜記

繼續閱讀