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

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