安裝驅動程式(1)----驅動預先安裝

來源:互聯網
上載者:User

標籤:

    前面toaster驅動程式的安裝都是通過手動安裝的方式,把sys/inf等檔案安裝到系統中。說實話,這麼複雜的過程除了開發人員,其他人能流暢的安裝上驅動還真是天方夜譚了。如果讀者曾在電腦城買過電腦配件,如無線網卡,藍芽適配器,應該有印象:到手的除了這麼裝置本身,還會附帶一張提供安裝程式的小光碟片和一份安裝說明。安裝說明一般都會要求先運行安裝程式,然後重啟插入裝置,之後裝置就可以正常使用了。這張光碟片就是所謂的預先安裝光碟片,裡面的程式就是驅動預先安裝程式,這正是本篇的主題--驅動預先安裝程式。

    winddk樣本目錄src/setup/devcon提供了預先安裝驅動的方法。編譯後,可以通過devcon install path_to_inffile hwid的方式安裝驅動程式或通過devcon update path_to_inffile hwid的方式更新驅動,前者是後者的擴充。devcon update調用newdev.dll!UpdateDriverForPlugAndPlayDevices函數實現驅動程式的更新。調用時傳入inf檔案的路徑和inf檔案中的DeviceId即可。但是按ms文檔的說明,UpdateDriverForPlugAndPlayDevices只能為已存在的裝置更新驅動,也就所謂的Hardware-first安裝方式。

HardwareId [in]    A pointer to a NULL-terminated string that supplies the hardware identifier to match <span style="color:#FF0000;">existing devices</span> on the computer. 

RemarksUpdateDriverForPlugAndPlayDevices <span style="color:#FF0000;">scans the devices on the system</span> and attempts to install the drivers specified by FullInfPath for any devices that match the specified HardwareId value. 

以toaster驅動為例,在底層匯流排驅動BusEnum.sys已經成功安裝的情況下,執行devcon update會提示安裝失敗,而執行devcon install 能成功預先安裝驅動:

c:\studio><span style="color:#FF0000;">devcon update</span> C:\studio\toaster\wdm\inf\amd64\simple.inf {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToasterUpdating drivers for {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster from C:\studio\toaster\wdm\inf\amd64\simple.inf.<span style="color:#FF0000;">devcon failed.</span>

c:\studio><span style="color:#FF0000;">devcon install</span> C:\studio\toaster\wdm\inf\amd64\simple.inf {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToasterDevice node created. Install is complete when drivers are installed...Updating drivers for {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster from C:\studio\toaster\wdm\inf\amd64\simple.inf.<span style="color:#FF0000;">Drivers installed successfully.</span>

顯示,devcon install安裝驅動後,toaster裝置執行個體為ROOT\TOASTER\0000。從結果來看,驅動雖然安裝了,但並沒有安裝在BusEnum匯流排下,而出現在root匯流排下,換句話說toaster驅動並沒有運行只是靜靜的蹲在角落裡;當真正的toaster裝置接入系統後,由pnp管理器為該裝置匹配devcon install預先安裝的驅動程式。


    既然說道UpdateDriverForPlugAndPlayDevices是Hardware-first安裝方式,如果先運行enum.exe -p 1(由於沒有驅動程式,會在裝置管理員下出現帶黃色驚嘆號的Unknow Device),再以devcon update方式後安裝裝置驅動,也能使前面虛擬出來的toaster裝置正常工作。再繼續新的內容前,容我先總結一下UpdateDriverForPlugAndPlayDevices函數的作用:本質上,安裝驅動需要依靠UpdateDriverForPlugAndPlayDevices這個函數,執行這個函數相當於在裝置管理員右鍵菜單上點擊"掃描檢測硬體改動"。它會尋找當前已經添加到系統中但還沒有安裝驅動程式的硬體裝置,並為之安裝驅動。

       前面介紹的cmdUpdate函數並不能實現驅動程式預先安裝,接下來的篇幅我們來看看它的加強版----cmdInstall,它是如何?驅動程式預先安裝的。在裝置插入系統前,系統沒有裝置資訊,因此cmdInstall所做的是虛擬出一個裝置(在root下虛擬一個裝置),並將它註冊到系統註冊表中去。

      cmdInstall先調用SetupDiGetINFClass,從inf檔案中擷取裝置類GUID。然後將獲得的裝置類Guid傳遞給SetupDiCreateDeviceInfoList用以建立裝置資訊塊列表和SetupDiCreateDeviceInfo建立裝置資訊塊。這個很好理解,windows將屬性相近的裝置歸入同一個裝置類,如usb類,hid類。系統應該用一個列表維護裝置類中的各個裝置,除此之外系統中應該還有一個像物件導向語言中基類一樣的描述符,用以描述裝置類的屬性(我按代碼猜的,畢竟windows的pnp管理器沒公開)。現在要在這個裝置類下建立一個新裝置,那必定要獲得裝置類的描述符,並添加新裝置屬性---這個裝置的HardwareID(就如衍生類別除了有基類的公用屬性還有自己特有的屬性),然後往裝置類列表中添加新裝置。SetupDiSetDeviceRegistryProperty完成新裝置的註冊工作。一切完成後,還要調用類安裝器做裝置類安裝時的相似工作(如設定註冊表,拷貝檔案等),這個動作反應到代碼中就是調用SetupDiCallClassInstaller。現在虛擬裝置已經存在了,就可以調用UpdateDriverForPlugAndPlayDevices更新驅動了。這些過程完成了我們的目標----預先安裝驅動程式。

      cmdInstall函數很強大,可以預先安裝匯流排驅動/功能驅動和簡單的過濾驅動,如果inf檔案中提供了hardwareID。本篇到此結束,下一篇來討論一下類過濾驅動和多層過濾驅動的安裝。



安裝驅動程式(1)----驅動預先安裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.