判斷裝置是否插入
請注意,自動執行叫用 裝置安裝應用程式 的行為必須取決於使用者先插入硬體,還是先插入散發媒體。 由於獨立硬體廠商 (IHD) 通常會提供一個散發磁碟,而且磁碟只能有一個自動執行叫用的應用程式,所以自動執行叫用的裝置安裝應用程式必須判斷您的裝置是否已插入。
若要判斷裝置是否已插入,應用程式可以呼叫 UpdateDriverForPlugAndPlayDevices 函式,並傳遞裝置的硬體識別碼。 如果下列其中一項為 true,裝置會插入:
函式會傳回 TRUE。 (這也會安裝 device.) 的驅動程式
函式會傳回 FALSE ,而 Win32 GetLastError函式會傳回ERROR_NO_MORE_ITEMS。 (未安裝。)
如果函式傳回 FALSE 且 GetLastError 傳回NO_SUCH_DEVINST,則裝置不會插入。 (未安裝。)
重新安裝未叢集的裝置
當先前已連結的裝置現在已解除叢集時,裝置的開發 節點 仍會保留在系統中,雖然裝置是非作用中且隱藏的。 在重新安裝這類裝置之前,您必須先找到此「虛設」devnode,並將它標示為需要重新安裝。 然後,當裝置插回時,隨插即用 會繼續裝置、尋找裝置的新驅動程式,以及安裝裝置的驅動程式。
若要重新安裝未叢集的裝置:
呼叫 SetupCopyOEMInf 函 式。
SetupCopyOEMInf 函式可確保 %SystemRoot%\inf 目錄中存在正確的 INF 檔案。
尋找未叢集的裝置。
呼叫 SetupDiGetClassDevs 函式。 在呼叫此函式時,清除 Flags 參數中的DIGCF_PRESENT旗標。 您必須尋找 所有 裝置,而不只是那些裝置存在。 您可以在 ClassGuid 參數中指定特定裝置類別,以縮小搜尋的結果範圍。
尋找未叢集裝置的硬體標識碼和相容的標識碼。
SetupDiGetClassDevs 會傳回裝置 資訊集 的句柄,其中包含所有已安裝裝置的句柄,不論是否插入裝置,在裝置類別中 (假設您在第一個步驟中指定了裝置類別) 。 透過對 SetupDiEnumDeviceInfo 函式進行後續呼叫,您可以使用這個句柄來列舉裝置資訊集中的所有裝置。 每個呼叫都會提供您裝置 的SP_DEVINFO_DATA 結構。 若要取得硬體標識符清單,請呼叫 SetupDiGetDeviceRegistryProperty 函式,並將 Property 參數設定為 SPDRP_HARDWAREID。 若要取得相容的標識符清單,請呼叫相同的函式,但 Property 參數會設定為 SPDRP_COMPATIBLEIDS。 這兩個清單都是 MULTI-SZ 字串。
尋找裝置識別碼與上一個步驟) 硬體標識碼 (或相容標識符之間的相符專案。
請確定您執行硬體識別碼/相容標識碼與裝置識別碼之間的完整字串比較。 部分比較可能會導致不正確的相符專案。
當您找到相符專案時,請呼叫 CM_Get_DevNode_Status 函式,並傳遞SP_DRVINFO_DATA。dnDevInst 參數中的DevInst。 如果此函式傳回CR_NO_SUCH_DEVINST,則確認裝置未連結 (,具有虛設的 devnode) 。
標示裝置。
呼叫 SetupDiGetDeviceRegistryProperty 函式,並將 Property 參數設定為 SPDRP_CONFIGFLAGS。 當此函式傳回時, PropertyBuffer 參數會指向來自登錄的裝置 ConfigFlags 值。 在 Regstr.h) 中定義CONFIGFLAG_REINSTALL (执行此值的位 OR。 執行此動作之後,呼叫 SetupDiSetDeviceRegistryProperty 函式,並將 Property 參數設定為 SPDRP_CONFIGFLAGS, 而 PropertyBuffer 參數會設定為裝置修改 的 ConfigFlags 值的位址。此動作會修改登錄的 ConfigFlags 值以納入CONFIGFLAG_REINSTALL旗標。 這會導致下次重新啟動裝置時重新安裝裝置。
插入裝置。
隨插即用 會繼續裝置、尋找該裝置的新驅動程式,並安裝該驅動程式。