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 ON5.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 /dbgsettingsC.???設置測試目標計算機為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—》系統信息可以查看到系統的版本。本人在這里折騰了將近兩天的時間,最后才找到是由于版本不匹配的問題。
總結
以上是生活随笔為你收集整理的Win10下VS2015(WDK10)驱动开发环境配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Impala 调用Hbase 报错 Le
- 下一篇: sigslot库源码分析