Win10下VS2015(WDK10)驅動開發環境配置
1、 概述
微軟在”WDK7600“以後就不再提供獨立的核心驅動開發包了,而是必須首先安裝微軟整合開發環境VisualStudio,然後再從微軟官網下載整合的WDK開發包、或者離線安裝包,但是安裝後Visual Studio就集驅動程式開發,編譯,安裝,部署和除錯於一身,使得Windows驅動程式開發會變得更容易。對於Windows 10和Visual Studio2015驅動開發WDK環境變數的配置,與其它版本的Windows和WDK環境的配置有很大不同。本人也是苦苦探索了近一週的時間才配好。
2、 WDF驅動模型
裝置驅動程式是硬體裝置連線到計算機系統的軟體介面,任何裝置都必須有相應的驅動程式才能在計算機系統上正常工作。裝置驅動程式的優劣直接關係到整個系統的效能和穩定性,因此,設計和開發穩定高效的驅動程式具有重要意義。
早期的Windows 95/98的裝置驅動是VxD(Virtual DeviceDriver),其中x表示某一類裝置。從Windows 2000開始,開發驅動程式必以WDM(Windows Driver Model)為基礎的,但是,如果使用DDK來開發WDM,其開發難度之大,根本不能奢望像使用者模式應用程式開發那樣容易,因此,一般使用者都是使用WinDriver、DriverStudio之類的第三方工具。為改善這種局面,從Vista開始,微軟推出了新的驅動程式開發環境WDF(Windows Driver Foundation )。WDF(WindowsDriver Foundation)是微軟提出的下一代全新的驅動程式模型,它是在WDM(windowsDriver Model)的基礎上發展而來的,支援面向物件、事件驅動的驅動程式開發,提供了比WDM更高層次抽象的高度靈活、可擴充套件、可診斷的驅動程式框架。WDF框架管理了大多數與作業系統相關的互動,實現了公共的驅動程式功能(如電源管理、PnP支援),隔離了裝置驅動程式與作業系統核心,降低了驅動程式對核心的影響。
WDF提供了兩個框架:KMDF(核心模式驅動程式框架)和UMDF(使用者模式驅動程式框架)。
1、核心模式驅動程式 KMDF(Kernel-Mode DriverFramework):
這類驅動程式作為核心模式作業系統元件的一部分執行,它們管理I/O、即插即用、記憶體、程序和執行緒、安全等。核心模式驅動程式通常為分層結構。KMDF是Windows系統底層驅動,檔名為:*.SYS。關於KMDF更多的內容,可參閱 MSDN中“Getting Started with Kernel-ModeDriver Framework ”。
2、使用者模式驅動程式 UMDF(User-Mode DriverFramework):
這類驅動程式通常提供 Win32 應用程式與核心模式驅動程式或其他作業系統元件之間的介面。使用者模式驅動程式支援基於協議或基於序列匯流排(如攝像機和便攜音樂播放器)的裝置。UMDF是使用者層驅動,檔名為:*.DLL。關於KMDF更多的內容,可參閱 MSDN中“Introduction to UMDF“。
無論核心模式的驅動程式或者使用者模式的驅動程式,都使用同一環境進行構建,這一環境稱為WDK;都採用同一套物件模型構建,採用同一個基礎承載,這個基礎就是WDF。由於WDF驅動模型提供了面向物件和事件驅動的驅動程式開發框架,大大降低了開發難度。從現在開始,掌握Windows裝置驅動程式的開發人員,由過去的“專業”人士,將變為“普通”大眾。因此,像WinDriver、DriverStudio之類的第三方工具也隨之退出歷史舞臺。更重要的,也是微軟反覆炫耀的是封裝了驅動程式中的某些共同行為:例如即插即用和電源管理就屬於這種共同行為。因為大多數驅動程式中都需要處理即插即用和電源管理問題,據說這大概要上千行的程式碼,況且,沒有相當水平還不一定能處理好。為了一勞永逸,WDF乾脆將即插即用和電源管理封裝了進了物件之內,一舉成了物件的預設(預設)行為。WDF將驅動程式與作業系統核心之間進行了分離,驅動程式與作業系統互動工作交給框架內封裝的方法(函式)完成,這樣驅動開發者只需專注處理硬體的行為即可。這不僅避免了顧此失彼兩面不周的弊端,也由於雙方的分離,對作業系統內的某些改動,硬體製造商配套驅動程式的開發都有莫大的好處。
3、 使用者模式和核心模式
執行 Windows 的計算機中的處理器有兩個不同模式:“使用者模式”和“核心模式”。根據處理器上執行的程式碼的型別,處理器在兩個模式之間切換。應用程式在使用者模式下執行,核心作業系統元件在核心模式下執行。多個驅動程式在核心模式下執行時,某些驅動程式可能在使用者模式下執行。
當啟動使用者模式的應用程式時,Windows 會為該應用程式建立“程序”。程序為應用程式提供專用的“虛擬地址空間”和專用的“控制代碼表格”。由於應用程式的虛擬地址空間為專用空間,一個應用程式無法更改屬於其他應用程式的資料。每個應用程式都孤立執行,如果一個應用程式損壞,則損壞會限制到該應用程式。其他應用程式和作業系統不會受該損壞的影響。
使用者模式應用程式的虛擬地址空間除了為專用空間以外,還會受到限制。在使用者模式下執行的處理器無法訪問為該作業系統保留的虛擬地址。限制使用者模式應用程式的虛擬地址空間可防止應用程式更改並且可能損壞關鍵的作業系統資料。
在核心模式下執行的所有程式碼都共享單個虛擬地址空間。這表示核心模式驅動程式未從其他驅動程式和作業系統自身獨立開來。如果核心模式驅動程式意外寫入錯誤的虛擬地址,則屬於作業系統或其他驅動程式的資料可能會受到損壞。如果核心模式驅動程式損壞,則整個作業系統會損壞。
此圖說明了使用者模式元件與核心模式元件之間的通訊。
4、 驅動模型特點
UMDF和傳統的驅動程式差異非常大,簡要說來,UMDF是這樣的:
- UMDF是基於COM思想的,運行於使用者模式(RING3)的驅動程式模組。
那麼,這種驅動模型帶來什麼變化呢?
首先基於COM思想,引入介面機制,可以把相關聯的函式分門別類進行組織,使得驅動程式碼清晰明瞭;其次,執行在RING3的驅動,大幅度降低了驅動程式在穩 定性和安全性上面的風險,UMDF驅動崩潰不會導致bugcheck(藍屏),並且UMDF驅動的宿主程序是在受限的使用者身份下執行的,不是受信任的系統核心模組。可以在UMDF裡面使用Win32 API。
運行於RING3的UMDF對於程式設計師開說至少帶來兩個額外好處:
- 驅動程式不需要強制數字簽名,因為UMDF驅動不是系統信任模組,所以在x64下面的部署更加方便。特別是個人開發者可能無法承受WHQL的費用,或者其他原因暫時無法WQHL的情況下,使用UMDF是一個較好的選擇。
- 除錯難度大幅降低,不再需要SoftICE和Syser之類的單機核心偵錯程式或者WinDBG之類的雙機除錯,我們可以用WinDBG或者VS偵錯程式attach到UMDF宿主程序即可進行除錯。可以參考除錯UMDF驅動。
而KMDF核心模式驅動程式中的錯誤會損壞系統地址空間,並可能會導致計算機失敗。由於這些驅動模型的特點,在構建驅動程式的開發除錯環境是也會有所區別,一般在做KMDF驅動的開發除錯時都選擇雙機或搭建虛擬機器環境進行,而UMDF驅動可以進行單機除錯,下面的環境搭建主要以更為複雜的KMDF模式為例。
5、 開發除錯環境配置
5.1 工具及平臺環境
平臺:Windows 10作業系統
開發環境:Visual Studio 2015 Enterprise 和Windows WDK、Windows SDK
除錯環境:Oracle VM VirtualBox 5.0.14虛擬機器
5.2 方法/步驟
5.2.1 設定主計算機和測試計算機
設定目標或測試計算機是配置計算機以便進行自動驅動程式部署、測試和除錯的過程。一個測試和除錯環境具有兩臺計算機:主計算機和目標計算機。目標計算機也稱為“測試計算機”。使用主機上的 Vsual Studio 開發和構建驅動程式。除錯程式在主計算機上執行(可以使用 Visual Studio 使用者介面或WinDbg除錯工具),當測試和除錯驅動程式時,驅動程式在目標計算機上執行。
1 安裝設定主計算機
本次搭建環境主計算機作業系統使用win10,首先安裝Visual Studio 2015 Enterprise,然後安裝Wdk 10。注意:WDK10一定要在vs2015後面安裝,安裝完後,啟動vs2015在介面選單上會出現driver選單,如下圖。另外,一般VisualStudio 2015 Enterprise是已經內帶windows SDK,但是如果不是和安裝的WDK一致的版本,建議在單獨安裝windows SDK 10,使得WDK和SDK版本一致。
2 安裝設定目標計算機
本次測試目標計算機採用Oracle VM VirtualBox 5.0.14虛擬機器。首先在主計算機上安裝Oracle VM VirtualBox5.0.14虛擬機器,然後在虛擬機器上安裝win10作業系統。
3 聯通主計算機和目標計算機
主計算機和目標計算機必須能夠彼此按名稱執行 ping 操作。如果兩臺計算機已加入到同一工作組或同一網路域,則此操作可能更容易。
驗證主機和目標計算機可以彼此執行 ping 操作。開啟命令提示符視窗,並輸入 ping 192.168.X.X(ip_adress)。
如果主計算機和目標計算機已加入到一個工作組,但它們位於不同的子網上,你可能必須調整某些防火牆設定,以便主計算機和目標計算機可以通訊。請按照下列步驟進行操作:
兩種方法(選一即可):
方法一:
在目標計算機上的“控制面板”中,轉到“網路和 Internet”>“網路共享中心”。注意你的活動網路。它可能是“公共網路”、“私有網路”或“域”。
在目標計算機上的“控制面板”中,轉到“系統和安全”>“Windows 防火牆”>“高階設定”>“入站規則”。
在入站規則列表中,查詢用於活動網路的所有網路發現規則。(例如,查詢所有“配置檔案”為“專用”的網路發現規則。)雙擊每個規則,然後開啟“作用域”選項卡。在“遠端 IP 地址”下,選擇“任何 IP 地址”。
在入站規則列表中,查詢用於活動網路的所有“檔案和印表機共享”規則。對於每個規則,雙擊該規則,將開啟“作用域”選項卡。在“遠端 IP 地址”下,選擇“任何 IP 地址”。
方法二:
“控制面板”->“系統和安全”->“Windows防火牆”->"啟動或關閉Windows防火牆"->"關閉Windows防火牆"
4 目標計算機允許核心除錯
1) 在測試目標計算機上用系統管理員賬戶開啟CMD命令視窗,輸入下面命令:
C:\> bcdedit /set {default} DEBUG YES
C:\> bcdedit /set TESTSIGNING ON
5.2.2 設定WinDbg除錯方式
由於除錯方式有好多種,我們選擇常用的串列埠除錯和網路除錯兩種方式進行討論。首先我們進行串列埠方式的設定。
5.2.2.1 設定測試目標計算機為串列埠除錯方式
A. 在虛擬機器上設定串列埠
首先關閉虛擬機器上的作業系統,在虛擬機器上設定。對於普通的VirtualBox中的虛擬機器,預設配置情況下,是沒有開啟對應的串列埠的,其配置對應的是這樣的:
把串列埠設定成主機上的一個管道pipe(pipe是個軟體上的概念)
如何設定:
- Windows系統中:名字必須為
\\.\pipe\<name>
- 其中name自己隨便起一個(當然,應該起一個,和你的虛擬機器所對應的,有意義的名字)
B. 在測試目標計算機上設定串列埠除錯
在測試目標計算機上用系統管理員賬戶開啟CMD命令視窗,輸入下面命令:
C:\> bcdedit /debug on
C:\> bcdedit /dbgsettings serial debugport:1 baudrate:115200
其中debugport:1,表示選擇串列埠com1。
然後重啟作業系統,在測試目標計算機上開啟CMD命令視窗,輸入下面命令,就可以看到剛才配置的引數:
C:\> bcdedit / bcdedit /dbgsettings
C. 在主計算機啟動WinDbg除錯程式
在主計算機上開啟CMD命令視窗,進入到WinDbg程式的資料夾,一般在如下的路徑:
C:\>cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
C:\> windbg -k com:pipe,port=\\.\pipe\vmbox,resets=0,reconnect
Windbg程式正常執行,效果如下,說明配置正確,可以通過串列埠除錯驅動程式了。
5.2.2.2 設定測試目標計算機為網路除錯方式
A. 在測試目標計算機上設定網路除錯
在測試目標計算機上用系統管理員賬戶開啟CMD命令視窗,輸入下面命令:
C:\> bcdedit /debug on
C:\> bcdedit /dbgsettings net hostip:192.168.12.109 port:50000 key:1.2.3.4
其中hostip:192.168.12.109,表示主計算機ip地址,port:50000制定通訊埠,key引數指定通訊使用的加密金鑰key。
然後重啟作業系統,在測試目標計算機上開啟CMD命令視窗,輸入下面命令,就可以看到剛才配置的引數:
C:\> bcdedit / bcdedit /dbgsettings
B. 在主計算機啟動WinDbg除錯程式
在主計算機上開啟CMD命令視窗,進入到WinDbg程式的資料夾,一般在如下的路徑:
C:\>cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
C:\> WinDbg –k net:port=50000,key=1.2.3.4
Windbg程式正常執行,效果如下,說明配置正確,可以通過串列埠除錯驅動程式了。
5.2.3 設定Visual Studio 2015除錯方式
Visual Studio 2015本身集驅動程式開發,編譯,安裝,部署和除錯於一身,使得Windows驅動程式開發會變得更容易。Visual Studio 2015作為除錯、部署介面和使用WinDbg作為除錯介面在配置上有一些不同。
5.2.3.1 設定測試目標計算機為串列埠除錯方式
A. 在虛擬機器上設定串列埠
首先關閉虛擬機器上的作業系統,在虛擬機器上設定。對於普通的VirtualBox中的虛擬機器,預設配置情況下,是沒有開啟對應的串列埠的,其配置參看上一節的串列埠設定。
B. 在測試目標計算機上設定串列埠除錯
在測試目標計算機上用系統管理員賬戶開啟CMD命令視窗,輸入下面命令:
C:\> bcdedit /debug on
C:\> bcdedit /dbgsettings serial debugport:1 baudrate:115200
其中debugport:1,表示選擇串列埠com1。
然後重啟作業系統,在測試目標計算機上開啟CMD命令視窗,輸入下面命令,就可以看到剛才配置的引數:
C:\> bcdedit / bcdedit /dbgsettings
C. 設定測試目標計算機為WDKRemoteUser
在目標計算機上,執行與目標計算機平臺匹配的 WDK 測試目標安裝程式 MSI。可以在安裝過WDK10的主計算機的WDK10安裝目錄下找到該 MSI。
例如:C:\Program Files (x86)\WindowsKits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
注意:如果該程式沒有安裝,則下一步再vs2015上面做的配置就不能成功,我就在這一步上被卡住很久,一直找不到原因。
D. 在主計算機設定Visual Studio 2015程式
在主計算機上,在 Visual Studio 的“Driver”選單中,選擇“Test”>“Configure Deivce”。
單擊“Add New Device”。
這裡需要注意:如果vs2015的版本是vs2015 Update 1版本,這時候會出現一個錯誤提示視窗,不能進行相應的設定,提示如下:
這是可以從驅動程式的專案點右鍵—》選擇屬性選單—》選擇除錯選項—》在右邊要啟動的偵錯程式上選擇Debugging Tools for windows – Kernel Debugger—》在Remote Computer Name上點選配置,就會出現配置視窗,介面如下:
點選Add New Devide新增提個測試主機,在出現的介面上填寫測試目標主機的顯示名稱,裝置型別(計算機裝置或移動裝置),測試目標主機的主機名(我測試填IP地址也可以),在Provision Options選項中建議選擇第一項Provision Deviceand choose debugger setting”,這樣vs2015就能就行自動部署測試的驅動程式,但是設定的時候測試目標主機會自動多次重啟以完成設定。選擇第二項的話,測試目標主機不會重啟,但是需要手工部署測試的驅動程式。
點選下一步,出現連線型別(可以選擇串列埠/網路等),本次選擇串列埠,然後填寫在測試目標主機上設定的引數,設定介面如下:
設定完成,點選下一步,則會在測試目標主機上進行相應的環境設定,期間測試目標主機會有多次重啟。顯示介面如下:
注意:如果在設定過程中在Creaing system restorepoint出現錯誤的話,需要在測試目標主機的C盤上開啟系統還原點。設定的步驟為:開始右鍵—》系統—》系統保護—》配置—》啟動並設定C盤還原點。
設定完成後顯示如下介面,提示配置成功:
點選完成,顯示如下介面:
點選Apply應用,然後選擇OK。
E. 在主計算機Visual Studio 2015程式測試配置
最後在主計算機的VS2015的除錯選單中—》選擇附加到程序--》在傳輸(P)下拉框中選擇Windows Kernel ModelDebugger,在限定符(Q)下拉框中選擇剛才配置的測試目標主機名稱—》在可用程序中選擇Kernel—》最後點選附加按鈕。
點選附加按鈕後出現除錯介面表示配置成功,可以進行驅動除錯了。
注意:這裡如果點選附加按鈕後Vs2015出現崩潰現象請檢查Win10的版本,如果win10的版本還是10240版本的話請升級到10586版本。可以點選VS2015的幫助選單—》關於Microsoft Visual Studio—》系統資訊可以檢視到系統的版本。本人在這裡折騰了將近兩天的時間,最後才找到是由於版本不匹配的問題。
5.2.3.2 設定測試目標計算機為網路除錯方式
A. 設定測試目標計算機為WDKRemoteUser
在目標計算機上,執行與目標計算機平臺匹配的 WDK 測試目標安裝程式 MSI。可以在安裝過WDK10的主計算機的WDK10安裝目錄下找到該 MSI。
例如:C:\Program Files (x86)\WindowsKits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
注意:如果該程式沒有安裝,則下一步再vs2015上面做的配置就不能成功,我就在這一步上被卡住很久,一直找不到原因。
B. 在主計算機設定Visual Studio 2015程式
在主計算機上,在 Visual Studio 的“Driver”選單中,選擇“Test”>“Configure Deivce”。
單擊“Add New Device”。
這裡需要注意:如果vs2015的版本是vs2015 Update 1版本,這時候會出現一個錯誤提示視窗,不能進行相應的設定,提示如下:
這是可以從驅動程式的專案點右鍵—》選擇屬性選單—》選擇除錯選項—》在右邊要啟動的偵錯程式上選擇Debugging Tools for windows – Kernel Debugger—》在Remote Computer Name上點選配置,就會出現配置視窗,介面如下:
點選Add New Devide新增提個測試主機,在出現的介面上填寫測試目標主機的顯示名稱,裝置型別(計算機裝置或移動裝置),測試目標主機的主機名(我測試填IP地址也可以),在Provision Options選項中建議選擇第一項Provision Deviceand choose debugger setting”,這樣vs2015就能就行自動部署測試的驅動程式,但是設定的時候測試目標主機會自動多次重啟以完成設定。選擇第二項的話,測試目標主機不會重啟,但是需要手工部署測試的驅動程式。
點選下一步,出現連線型別(可以選擇串列埠/網路等),本次選擇網路,然後填寫在測試目標主機上設定的引數,設定介面如下:
設定完成,點選下一步,則會在測試目標主機上進行相應的環境設定,期間測試目標主機會有多次重啟。顯示介面如下:
注意:如果在設定過程中在Creaing system restorepoint出現錯誤的話,需要在測試目標主機的C盤上開啟系統還原點。設定的步驟為:開始右鍵—》系統—》系統保護—》配置—》啟動並設定C盤還原點。
設定完成後顯示如下介面,提示配置成功:
點選Apply應用,然後選擇OK。
C. 在主計算機Visual Studio 2015程式測試配置
最後在主計算機的VS2015的除錯選單中—》選擇附加到程序--》在傳輸(P)下拉框中選擇Windows Kernel ModelDebugger,在限定符(Q)下拉框中選擇剛才配置的測試目標主機名稱—》在可用程序中選擇Kernel—》最後點選附加按鈕。
點選附加按鈕後出現除錯介面表示配置成功,可以進行驅動除錯了。
注意:這裡如果點選附加按鈕後Vs2015出現崩潰現象請檢查Win10的版本,如果win10的版本還是10240版本的話請升級到10586版本。可以點選VS2015的幫助選單—》關於Microsoft Visual Studio—》系統資訊可以檢視到系統的版本。本人在這裡折騰了將近兩天的時間,最後才找到是由於版本不匹配的問題。