|
我們如何在Windows 系統中安裝一個設備以及對應的驅動程序呢?請看MSDN /WDK 中對此部分的描述。
要清楚這個過程,需要先了解一下Windows設備安裝過程中所需的各個組件。
http://msdn.microsoft.com/en-us/library/ms791106.aspx
在這幅圖中,白底框由Windows操作系統提供,而灰色框則必須由設備供應商提供。而其中的SetupAPI,DeviceManager等則是SetupApi.dll 以及Cfgmgr32.dll的功能。其余的驅動管理器等則是分別不同的sys驅動文件。
Windows的安裝類型
Windows 定義了2種類型的安裝過程:服務器端以及客戶端。因服務器端安裝不需要用戶干預,應盡可能選擇此安裝方式。
在以下情況下,可采用服務器端安裝- 總線驅動能夠檢測到此設備,并且能通知到PnP管理器。
- PnP 管理器能夠找到包含與該設備硬件ID匹配的INF文件。
- 設備的INF文件和所有驅動都經過WHQL簽核。
- SetupAPI 能夠在不提示用戶的情況下找到所有的設備驅動程序。意思是所有驅動都是系統預安裝的,或者此前安轉過。
- 設備類安裝程序在安裝完成后不顯示任何屬性提示。
- 設備的 INF 文件中沒有指定要求交互式操作。
- 所有的一次性注冊條款都符合設備安裝中的規則。
服務器端安裝不顯示任何用戶接口,也不需要以管理員身份登陸。
客戶端安裝:
- PnP 管理器無法找到包含設備硬件ID的 INF 文件。
- PnP 管理器無法找到所需的驅動文件。
- 設備的 INF 或驅動沒有經過簽核。
- 此時 SetupAPI 必須提示用戶輸入安裝介質的位置。
- 類安裝程序或協同安裝程序在安裝完成后顯示一些屬性頁面。
- 設備,總線或總線驅動等不支持即插即用(PnP)。
客戶端安裝需要使用客戶端軟件,如添加硬件向導(NewDev.dll),或設備供應商提供的安裝程序。這些客戶端軟件通過調用SetupAPI完成安裝操作。從Windows Vista開始,設備安裝的核心都是非交互式的服務器端安裝方式,不再支持客戶端方式。但是設備類安裝程序及協同安裝程序依然可以顯示安裝完成后屬性或動作。
系統的安裝過程
用戶現在看到的很多安裝都是在系統正常運行后的安裝。其實主要的設備安裝在Windows初次安裝時已經完成,客戶之后在系統運行后,再次補充特殊的,系統為提供標準驅動的設備的安裝過程。如新的顯卡,聲卡、網卡或其他USB設備等等。這個過程就是上圖中的灰色部分。實際的安裝過程有3類:文本模式的安裝(主要的安裝過程),需要再次啟動系統的安裝以及用戶模式下不需要啟動的安裝。下面對系統已經運行后的安裝作一介紹。
- 將設備插入系統
- 如果設備和總線支持熱拔插,則自動啟動安裝過程。
- 如果需要關機并打開機箱安裝設備,則設備安裝好以后,下次啟動系統即可識別。
- 如果設備不支持即插即用(PnP),則需要人工啟動添加新設備向導來配置該設備。
安裝過程示例
在下面的示例中,該設備支持熱拔插,并且提供了安裝文件的CD。

上圖中的主要操作要點:
- 用戶將設備插入計算機。如果此設備支持熱拔插,則可以在系統正常運行是插入。如U盤。
- 設備的枚舉過程 總線驅動接受到設備的熱拔插通知后,通過調用IoInvalidateDeviceRelations通知核心態的PnP管理器,告知該總線上的設備列表已經發生變化。在本例中,這個變化是總線上出現了新的設備。
核心態PnP管理器通過發送值為IRP_MN_QUERY_DEVICE_RELATIONS的IRP_MJ_PNP給總線驅動,以取得該總線上目前的設備列表。總線驅動則提供這個列表。核心態PnP管理器將此列表與此前的列表對照,從而確定總線上出現的新設備。
核心態PnP管理器再次發送各種IRP給總線驅動,進一步取得該設備的其他信息,如設備硬件ID,兼容ID和設備能力描述等。這些請求包括 IRP_MN_QUERY_ID 和 IRP_MN_QUERY_CAPABILITIES。 - 核心態PnP管理器通知用戶態PnP管理器要安裝新的設備。用戶態PnP管理器試圖完成信任模式安裝(服務器端安裝)。但此例中無法完成,必須顯示一個提示,要求用戶提供安裝盤。
- 用戶態PnP管理器創建一個新的RunDll32進程,啟動新設備管理程序newdev.dll,開始安裝設備。
- 新設備管理程序調用設備安裝函數 (SetupAPI)和即插即用管理函數 (CfgMgr API)來完成此安裝任務。 新設備安裝程序首先調用 SetupDiBuildDriverInfoList 創建該設備可能的驅動列表。此例中,在系統的INF列表中,沒有與之對應的驅動,則返回一個空的列表。新設備安裝程序顯示發現新硬件向導,用戶提供驅動文件的位置,如軟盤,CD或微軟在線升級等。此例中,驅動文件在CD上,則用戶必須裝入CD,然后點擊"下一步"繼續后續安裝。新設備安裝程序繼續調用 SetupDiBuildDriverInfoList,此時已經有用戶提供的CD上的文件列表。
(注意:如果此前已經安裝過此設備,但是未能成功,則此設備會被當作未知設備,而不會顯示以上安裝向導。) - 類安裝程序以及協同安裝程序開始參與安裝過程,處理DIF請求。例如,新設備安裝程序調用 SetupDiCallClassInstaller,發送 DIF_SELECTBESTCOMPATDRV 安裝需求。SetupDiCallClassInstaller 發送 DIF 需求給所有的類安裝程序及協同安裝程序。
新設備安裝程序發送一系列DIF代碼,包括DIF_SELECTBESTCOMPATDRV, DIF_ALLOW_INSTALL, DIF_INSTALLDEVICEFILES, DIF_REGISTER_COINSTALLERS, DIF_INSTALLINTERFACES, 和 DIF_INSTALLDEVICE. 由類安裝程序予以處理。
安裝過程使用INF文件中的class以及ClassGUID 項目確定設備的安裝類。安裝類確定了該設備的類的安裝程序及協同安裝程序。如果需要協同安裝程序,則在INF文件的 INF DDInstall.Coinstallers 部分列出。 - 安裝程序將控制轉移到核心模式,開始裝載驅動并且啟動設備。安裝程序選定該設備的最佳驅動后,復制所需要的支持文件,注冊該設備特定的協同安裝程序以及設備接口,然后由核心模式裝載驅動并且啟動設備。此時發送相關的配置管理CfgMgr函數給用戶態PnP管理器,并經過用戶態PnP管理器轉發給核心臺PnP管理器。
- PnP加載相關的驅動以及該設備可選的過濾驅動。PnP管理器首先調用尚未安裝的驅動的DriverEntry,然后為每一個設備調用AddDevice,啟動底端過濾器,此后是功能驅動,最后是高端過濾器驅動。如果有需要,PnP管理器給該設備分配資源,并且給設備驅動程序發送 IRP_MN_START_DEVICE信息。
- 安裝程序可以提供安裝后向導頁面,改變設備設置或安裝應用軟件。在顯示標準的安裝完成頁面前,安裝程序發出 DIF_NEWDEVICEWIZARD_FINISHINSTALL 。這樣就允許安裝客戶定制的頁面,以便更改設備的設置或作其他。
- 從Windows Vista開始,安裝程序可以提供安裝完成后操作來安裝應用軟件,即在所有安裝操作都完成之后,發送 DIF_FINISHINSTALL_ACTION 給安裝程序。
以上過程是設備安裝的大致過程。
|
|