標題:
設備及驅動在系統(tǒng)中的安裝過程
[打印本頁]
作者:
jialinx
時間:
2015-9-13 16:49
標題:
設備及驅動在系統(tǒng)中的安裝過程
我們?nèi)绾卧赪indows 系統(tǒng)中安裝一個設備以及對應的驅動程序呢?請看MSDN /WDK 中對此部分的描述。
要清楚這個過程,需要先了解一下Windows設備安裝過程中所需的各個組件。
http://msdn.microsoft.com/en-us/library/ms791106.aspx
在這幅圖中,白底框由Windows操作系統(tǒng)提供,而灰色框則必須由設備供應商提供。而其中的SetupAPI,DeviceManager等則是SetupApi.dll 以及Cfgmgr32.dll的功能。其余的驅動管理器等則是分別不同的sys驅動文件。
Windows的安裝類型
Windows 定義了2種類型的安裝過程:服務器端以及客戶端。因服務器端安裝不需要用戶干預,應盡可能選擇此安裝方式。
在以下情況下,可采用服務器端安裝
總線驅動能夠檢測到此設備,并且能通知到PnP管理器。
PnP 管理器能夠找到包含與該設備硬件ID匹配的INF文件。
設備的INF文件和所有驅動都經(jīng)過WHQL簽核。
SetupAPI
能夠在不提示用戶的情況下找到所有的設備驅動程序。意思是所有驅動都是系統(tǒng)預安裝的,或者此前安轉過。
設備類安裝程序在安裝完成后不顯示任何屬性提示。
設備的 INF 文件中沒有指定要求交互式操作。
所有的一次性注冊條款都符合設備安裝中的規(guī)則。
服務器端安裝不顯示任何用戶接口,也不需要以管理員身份登陸。
客戶端安裝:
PnP 管理器無法找到包含設備硬件ID的 INF 文件。
PnP 管理器無法找到所需的驅動文件。
設備的 INF 或驅動沒有經(jīng)過簽核。
此時 SetupAPI 必須提示用戶輸入安裝介質的位置。
類安裝程序或協(xié)同安裝程序在安裝完成后顯示一些屬性頁面。
設備,總線或總線驅動等不支持即插即用(PnP)。
客戶端安裝需要使用客戶端軟件,如添加硬件向導(NewDev.dll),或設備供應商提供的安裝程序。這些客戶端軟件通過調(diào)用SetupAPI完成安裝操作。從Windows Vista開始,設備安裝的核心都是非交互式的服務器端安裝方式,不再支持客戶端方式。但是設備類安裝程序及協(xié)同安裝程序依然可以顯示安裝完成后屬性或動作。
系統(tǒng)的安裝過程
用戶現(xiàn)在看到的很多安裝都是在系統(tǒng)正常運行后的安裝。其實主要的設備安裝在Windows初次安裝時已經(jīng)完成,客戶之后在系統(tǒng)運行后,再次補充特殊的,系統(tǒng)為提供標準驅動的設備的安裝過程。如新的顯卡,聲卡、網(wǎng)卡或其他USB設備等等。這個過程就是上圖中的灰色部分。實際的安裝過程有3類:文本模式的安裝(主要的安裝過程),需要再次啟動系統(tǒng)的安裝以及用戶模式下不需要啟動的安裝。下面對系統(tǒng)已經(jīng)運行后的安裝作一介紹。
將設備插入系統(tǒng)
如果設備和總線支持熱拔插,則自動啟動安裝過程。
如果需要關機并打開機箱安裝設備,則設備安裝好以后,下次啟動系統(tǒng)即可識別。
如果設備不支持即插即用(PnP),則需要人工啟動添加新設備向導來配置該設備。
安裝過程示例
在下面的示例中,該設備支持熱拔插,并且提供了安裝文件的CD。
上圖中的主要操作要點:
用戶將設備插入計算機。如果此設備支持熱拔插,則可以在系統(tǒng)正常運行是插入。如U盤。
設備的枚舉過程 總線驅動接受到設備的熱拔插通知后,通過調(diào)用IoInvalidateDeviceRelations通知核心態(tài)的PnP管理器,告知該總線上的設備列表已經(jīng)發(fā)生變化。在本例中,這個變化是總線上出現(xiàn)了新的設備。
核心態(tài)PnP管理器通過發(fā)送值為IRP_MN_QUERY_DEVICE_RELATIONS的IRP_MJ_PNP給總線驅動,以取得該總線上目前的設備列表�?偩€驅動則提供這個列表。核心態(tài)PnP管理器將此列表與此前的列表對照,從而確定總線上出現(xiàn)的新設備。
核心態(tài)PnP管理器再次發(fā)送各種IRP給總線驅動,進一步取得該設備的其他信息,如設備硬件ID,兼容ID和設備能力描述等。這些請求包括
IRP_MN_QUERY_ID
和
IRP_MN_QUERY_CAPABILITIES
。
核心態(tài)PnP管理器通知用戶態(tài)PnP管理器要安裝新的設備。用戶態(tài)PnP管理器試圖完成信任模式安裝(服務器端安裝)。但此例中無法完成,必須顯示一個提示,要求用戶提供安裝盤。
用戶態(tài)PnP管理器創(chuàng)建一個新的RunDll32進程,啟動新設備管理程序newdev.dll,開始安裝設備。
新設備管理程序調(diào)用設備安裝函數(shù) (SetupAPI)和即插即用管理函數(shù) (CfgMgr API)來完成此安裝任務。 新設備安裝程序首先調(diào)用
SetupDiBuildDriverInfoList
創(chuàng)建該設備可能的驅動列表。此例中,在系統(tǒng)的INF列表中,沒有與之對應的驅動,則返回一個空的列表。新設備安裝程序顯示發(fā)現(xiàn)新硬件向導,用戶提供驅動文件的位置,如軟盤,CD或微軟在線升級等。此例中,驅動文件在CD上,則用戶必須裝入CD,然后點擊"下一步"繼續(xù)后續(xù)安裝。新設備安裝程序繼續(xù)調(diào)用
SetupDiBuildDriverInfoList
,此時已經(jīng)有用戶提供的CD上的文件列表。
(注意:如果此前已經(jīng)安裝過此設備,但是未能成功,則此設備會被當作未知設備,而不會顯示以上安裝向導。)
類安裝程序以及協(xié)同安裝程序開始參與安裝過程,處理DIF請求。例如,新設備安裝程序調(diào)用
SetupDiCallClassInstaller
,發(fā)送
DIF_SELECTBESTCOMPATDRV
安裝需求。
SetupDiCallClassInstaller
發(fā)送 DIF 需求給所有的類安裝程序及協(xié)同安裝程序。
新設備安裝程序發(fā)送一系列DIF代碼,包括
DIF_SELECTBESTCOMPATDRV
,
DIF_ALLOW_INSTALL
,
DIF_INSTALLDEVICEFILES
,
DIF_REGISTER_COINSTALLERS
,
DIF_INSTALLINTERFACES
, 和
DIF_INSTALLDEVICE
. 由類安裝程序予以處理。
安裝過程使用INF文件中的class以及Class
GUID
項目確定設備的安裝類。安裝類確定了該設備的類的安裝程序及協(xié)同安裝程序。如果需要協(xié)同安裝程序,則在INF文件的
INF DDInstall.Coinstallers
部分列出。
安裝程序將控制轉移到核心模式,開始裝載驅動并且啟動設備。安裝程序選定該設備的最佳驅動后,復制所需要的支持文件,注冊該設備特定的協(xié)同安裝程序以及設備接口,然后由核心模式裝載驅動并且啟動設備。此時發(fā)送相關的配置管理CfgMgr函數(shù)給用戶態(tài)PnP管理器,并經(jīng)過用戶態(tài)PnP管理器轉發(fā)給核心臺PnP管理器。
PnP加載相關的驅動以及該設備可選的過濾驅動。PnP管理器首先調(diào)用尚未安裝的驅動的DriverEntry,然后為每一個設備調(diào)用AddDevice,啟動底端過濾器,此后是功能驅動,最后是高端過濾器驅動。如果有需要,PnP管理器給該設備分配資源,并且給設備驅動程序發(fā)送
IRP_MN_START_DEVICE
信息。
安裝程序可以提供安裝后向導頁面,改變設備設置或安裝應用軟件。在顯示標準的安裝完成頁面前,安裝程序發(fā)出
DIF_NEWDEVICEWIZARD_FINISHINSTALL
。這樣就允許安裝客戶定制的頁面,以便更改設備的設置或作其他。
從Windows Vista開始,安裝程序可以提供安裝完成后操作來安裝應用軟件,即在所有安裝操作都完成之后,發(fā)送
DIF_FINISHINSTALL_ACTION
給安裝程序。
以上過程是設備安裝的大致過程。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1