Win10下VS2015(WDK10)驅動開發環境配置

一、     概述

微軟在」WDK7600「之後就再也不提供獨立的內核驅動開發包了,而是必須首先安裝微軟集成開發環境VisualStudio,而後再從微軟官網下載集成的WDK開發包、或者離線安裝包,可是安裝後Visual Studio就集驅動程序開發,編譯,安裝,部署和調試於一身,使得Windows驅動程序開發會變得更容易。對於Windows 10和Visual Studio2015驅動開發WDK環境變量的配置,與其它版本的Windows和WDK環境的配置有很大不一樣。本人也是苦苦探索了近一週的時間才配好。程序員

二、     WDF驅動模型

設備驅動程序是硬件設備鏈接到計算機系統的軟件接口,任何設備都必須有相應的驅動程序才能在計算機系統上正常工做。設備驅動程序的優劣直接關係到整個系統的性能和穩定性,所以,設計和開發穩定高效的驅動程序具備重要意義。windows

早期的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(用戶模式驅動程序框架)。網絡

一、內核模式驅動程序 KMDF(Kernel-Mode DriverFramework):框架

這類驅動程序做爲內核模式操做系統組件的一部分執行,它們管理I/O、即插即用、內存、進程和線程、安全等。內核模式驅動程序一般爲分層結構。KMDF是Windows系統底層驅動,文件名爲:*.SYS。關於KMDF更多的內容,可參閱 MSDN中「Getting Started with Kernel-ModeDriver Framework 」。ide

二、用戶模式驅動程序 UMDF(User-Mode DriverFramework):wordpress

這類驅動程序一般提供 Win32 應用程序與內核模式驅動程序或其餘操做系統組件之間的接口。用戶模式驅動程序支持基於協議或基於串行總線(如攝像機和便攜音樂播放器)的設備。UMDF是用戶層驅動,文件名爲:*.DLL。關於KMDF更多的內容,可參閱 MSDN中「Introduction to UMDF「。函數

不管內核模式的驅動程序或者用戶模式的驅動程序,都使用同一環境進行構建,這一環境稱爲WDK;都採用同一套對象模型構建,採用同一個基礎承載,這個基礎就是WDF。因爲WDF驅動模型提供了面向對象和事件驅動的驅動程序開發框架,大大下降了開發難度。從如今開始,掌握Windows設備驅動程序的開發人員,由過去的「專業」人士,將變爲「普通」大衆。所以,像WinDriver、DriverStudio之類的第三方工具也隨之退出歷史舞臺。更重要的,也是微軟反覆炫耀的是封裝了驅動程序中的某些共同行爲:例如即插即用和電源管理就屬於這種共同行爲。由於大多數驅動程序中都須要處理即插即用和電源管理問題,聽說這大概要上千行的代碼,何況,沒有至關水平還不必定能處理好。爲了一勞永逸,WDF乾脆將即插即用和電源管理封裝了進了對象以內,一舉成了對象的缺省(默認)行爲。WDF將驅動程序與操做系統內核之間進行了分離,驅動程序與操做系統交互工做交給框架內封裝的方法(函數)完成,這樣驅動開發者只需專一處理硬件的行爲便可。這不只避免了顧此失彼兩面不周的弊端,也因爲雙方的分離,對操做系統內的某些改動,硬件製造商配套驅動程序的開發都有莫大的好處。工具

三、     用戶模式和內核模式

運行 Windows 的計算機中的處理器有兩個不一樣模式:「用戶模式」和「內核模式」。根據處理器上運行的代碼的類型,處理器在兩個模式之間切換。應用程序在用戶模式下運行,核心操做系統組件在內核模式下運行。多個驅動程序在內核模式下運行時,某些驅動程序可能在用戶模式下運行。性能

當啓動用戶模式的應用程序時,Windows 會爲該應用程序建立「進程」。進程爲應用程序提供專用的「虛擬地址空間」和專用的「句柄表格」。因爲應用程序的虛擬地址空間爲專用空間,一個應用程序沒法更改屬於其餘應用程序的數據。每一個應用程序都孤立運行,若是一個應用程序損壞,則損壞會限制到該應用程序。其餘應用程序和操做系統不會受該損壞的影響。

用戶模式應用程序的虛擬地址空間除了爲專用空間之外,還會受到限制。在用戶模式下運行的處理器沒法訪問爲該操做系統保留的虛擬地址。限制用戶模式應用程序的虛擬地址空間可防止應用程序更改而且可能損壞關鍵的操做系統數據。

在內核模式下運行的全部代碼都共享單個虛擬地址空間。這表示內核模式驅動程序未從其餘驅動程序和操做系統自身獨立開來。若是內核模式驅動程序意外寫入錯誤的虛擬地址,則屬於操做系統或其餘驅動程序的數據可能會受到損壞。若是內核模式驅動程序損壞,則整個操做系統會損壞。

此圖說明了用戶模式組件與內核模式組件之間的通訊。

 

四、     驅動模型特色

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.1     工具及平臺環境

平臺:Windows 10操做系統

開發環境:Visual Studio 2015 Enterprise Windows WDKWindows 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,使得WDKSDK版本一致。

 

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—》系統信息能夠查看到系統的版本。本人在這裏折騰了將近兩天的時間,最後才找到是因爲版本不匹配的問題。

相關文章
相關標籤/搜索