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

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