WIN10+VS2017+WDK10+SDK10+VM虛擬機驅動開發調試環境搭建!採坑

1、準備工做

1  系統環境:Win10系統

2  開發工具:VS2015

3  驅動開發工具:WDK10

4  Windows SDKSDK10(安裝的時候必須所有勾選安裝,不然編譯會出現缺乏waring.h等頭文件之類的錯誤)

5  VM虛擬機:VMware WorkStation 12

 

Win十、WDK十、SDK10的版本必須一致個人用的都是15063版本。有些人弄不清win10版本對應關係,又是1506三、又是170三、還有叫RS2的。其實這3個都是指同一個win10的版本。具體對應關係見維基百科,很是詳細!Win10版本對應關係(維基可能被牆給個截圖吧)git

 

win10 64位下驅動安裝工具下載地址(此工具只在上述環境下測試過,請在虛擬機中測試過再在真實環境下安裝不然藍屏本身負責)github

http://download.csdn.net/detail/qing666888/9468506windows

注意事項:安全

關閉 、主機 客戶機 防火牆 、 互相ping都能ping通。函數

 

2、具體操做步驟

工具安裝就不說了,不會的百度一下。只說一下一些關鍵的地方。工具

一、安裝好虛擬機後,給虛擬機增長一個串口設備。具體操做見圖:開發工具

上面的\\.\pipe\com_1能夠改\\.\pipe\com_2,我就不改了後面名字能夠隨便取的,完成配置後虛擬機設備配置就多了一個串行端口的設備。由於打印機用了端口1。因此設備裏面顯示的是串行端口2,從新啓動虛擬機系統後,會發現設備管理裏面多了一個COM2的串口設備(若是想設置成端口1,把打印機設備刪了在添加串口設備)。測試

 

二、配置虛擬機系統爲調試模式this

    以管理員身份,在虛擬機命令行模式下運行以下2個命令開啓。spa

    bcdedit /debug on
    bcdedit /dbgsettings serial debugport:n baudrate:115200
    where n is the number of a COM port on the virtual machine.
  (n時虛擬機的一個COM端口號。就是設備顯示的串行端口2,n就是端口2)。

    咱們使用下面的語句便可:

    bcdedit /debug on

    bcdedit /dbgsettings serial debugport:2 baudrate:115200

 

三、把WDK10的虛擬機調試驅動拷貝到虛擬機中安裝。

由於VS2015能夠調試x86 x64兩種驅動,根據被調試系統選擇不一樣的文件拷貝到虛擬機安裝,個人是64位的選擇x64

 

四、VS2015開發工具配置

在VS2015的菜單欄點擊DRIVER--TEST--CONFIGURE DEVICES,選擇增長新設備,以下圖:

或者換個地方配置,從工程屬性裏面進行配置。右鍵工程屬性配置從這也能夠進行測試設備的配置:

配置界面,下面兩個選項第一項由VS2015幫咱們建立一個WDKuser測試帳戶,自動打開測試模式等。第二個是使用咱們本身配置的參數。因爲上面咱們已經配置了串口參數 、設置了調試模式因此咱們選擇第二個就好了。

以下配置在內核模式中,選擇串口、配置好波特率、勾上2個選項、管道名稱、端口號(咱們上面配置的COM2)。

出現上述紅色框字樣則說明配置已經成功了。(不要開啓全局代理軟件,不然會出現鏈接不上的問題)。

 

五、使用工具安裝調試64位驅動

網上下的下面的驅動安裝軟件貌似64位的都用不了。

本身動手豐衣足食大笑,本身在網上弄了個源碼改了下弄成能夠加載64位的驅動的版本了。

1)使用DebugView打印內核調試信息是開發驅動的很是重要的手段,但DebugView默認在WINDOWS 10下卻沒法獲取內核的調試日誌,驅動調用KdPint/DbgPrint等的打印結果是沒法被DebugView給捕捉到的。設置方法以下(複製下面的代碼到txt文件。改後綴爲.reg後執行(看清楚了是.reg不是.bat敲打),而後重啓電腦):

 
  1. Windows Registry Editor Version 5.00

  2.  
  3. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]

  4. "DEFAULT"=dword:0000000f

2)還有本身編譯出來的驅動要使用編譯的Debug版原本測試,使用KdPrint打印須要顯示的調試信息。下面是在Win10 64位的虛擬機中用此安裝程序,加載64位的驅動以及用DebugView查看驅動打印消息的截圖結果。DebugView中須要勾選Capture Kernel選項。

 

六、在VS2015中下斷點進行調試

若是你第五部已經完成了,而且在DebugView中已經可以輸出調試的打印信息了,辣麼騷年你已經離成功只有一部之遙了大笑

建立一個驅動工程,WDK10提供的模板中根本沒有提供NT驅動模板,咱們如何建立NT驅動呢?
解決:其實雖然沒有提供NT模板,可是咱們能夠創建WDM空模板工程,而後再本身添加文件,編譯,獲得的也就是NT驅動了。

驅動工程中會幫你創建一個inf文件,NT是使用不到的,能夠直接刪除。咱們直接添加一個MyDriver.c,後綴必須是.c。若是後綴是.cpp,編譯會報錯:沒法解析的外部符號 _DriverEntry@8,該符號在函數 _GsDriverEntry@8 中被引用  。

在文件中添加測試代碼。

 
  1. #include <ntifs.h>

  2.  
  3. VOID DriverUnload(PDRIVER_OBJECT objDriver)

  4. {

  5. // 避免編譯器關於未引用參數的警告

  6. UNREFERENCED_PARAMETER(objDriver);

  7.  
  8. // 什麼也不作,只打印一行字符串

  9. KdPrint(("My Dirver is Ending..."));

  10. }

  11.  
  12. NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)

  13. {

  14. // 避免編譯器關於未引用參數的警告

  15. UNREFERENCED_PARAMETER(strRegPath);

  16.  
  17. // 打印一行字符串,並註冊驅動卸載函數,以便於驅動卸載

  18. KdPrint(("My Dirver Is Starting!\r\n"));

  19.  
  20. objDriver->DriverUnload = DriverUnload;

  21.  
  22. return STATUS_SUCCESS;

  23. }

編譯,報錯,沒有關係,這些都是由於安全警告等級過高了,咱們能夠下降編譯器警告等級的方式解決:

執行編譯,編譯的時候選擇Debug模式,選擇X64的選項(由於咱們的虛擬機使用的是64位的系統,不可以運行x86的驅動,若是你編譯出來的是x86的驅動,用上的工具安裝是能夠,可是啓動失敗提示阻止運行之類的)。編譯成功後,按照上面的第五步進行安裝測試。

不知不覺感受已經寫了好長了。。。。奮鬥抽口煙壓壓精。好吧我不抽菸的。。。。。繼續。若是上述的驅動成功編譯出來了。辣麼如今咱們開始附加虛擬機的內核進行調試了。

首先把虛擬機的系統內核附加到VS2015,具體步驟見下圖:

選中內核調試模式、選本身配置的那個電腦、選中下面列表中內核。見下圖

點擊附加,而後出現下圖界面,點擊一下所有中斷。

而後系統就斷下了,虛擬機的系統咱們鼠標已經點不了,如今系統處於掛起狀態了。見下圖

如今咱們能夠到源代碼中下斷點了。我就隨便下個斷點了,見圖:

而後咱們在下面的Debugger Immediate Winddow窗口的 Kd>  一行輸入命令 g 讓系統運行起來。這樣虛擬機中的系統又能夠點擊了。

 

最後一步了。使用咱們剛剛創建的驅動工程編譯出來的.sys驅動文件拷貝到虛擬機中。用第五步的工具進行安裝、啓動。啓動的時候自動觸發VS2015中的下的斷點。至此能夠像平時咱們調試程序同樣進行單步調試了。

注意事項:一、必定要拷貝Debug版本的進行調試。

                  二、拷貝到虛擬機中的.sys文件必定要是你源碼編譯出來的。

                  三、若是改動了源碼後必定要從新拷貝一份新的驅動文件到虛擬機中調試,不然沒法觸發斷點的。

 

3、關於驅動簽名

增長一點關於驅動簽名的吧,有不少小夥伴編譯成功後,驅動安裝的時候一直彈出下面的這個圖片,驅動沒有簽名被系統阻止安裝,解決方案百度上面說的基本是每次開機都進入啓動設置中----禁用驅動簽名強制、bcdedit  nointegritychecks on 或者 loadoptions DDISABLE_INTEGRITY_CHECKS等。這些方法都是之前的方法基本都沒什麼用了。

下面提供兩個可用方法:

1)使用過時簽名(下載個過時簽名給驅動簽上,把系統時間改到簽名有效期內)。簽名有版權問題東西就不提供了,本身到看雪能搜到。

2)使用UPGDSED(能夠同時關閉PathGuard跟驅動強制簽名)使用說明見下:

下載地址:https://github.com/hfiref0x/UPGDSED

管理員權限運行patch.exe,按照提示輸入大寫的CONTINUE按回車確認,patch完成後輸入Enter退出,重啓系統用另一個啓動項啓動系統。本人在windows10 企業版(15063)測試成功,能夠不開啓測試簽名模式下加載64位驅動。

4、採坑

      

1、準備工做

1  系統環境:Win10系統

2  開發工具:VS2015

3  驅動開發工具:WDK10

4  Windows SDKSDK10(安裝的時候必須所有勾選安裝,不然編譯會出現缺乏waring.h等頭文件之類的錯誤)

5  VM虛擬機:VMware WorkStation 12

 

Win十、WDK十、SDK10的版本必須一致個人用的都是15063版本。有些人弄不清win10版本對應關係,又是1506三、又是170三、還有叫RS2的。其實這3個都是指同一個win10的版本。具體對應關係見維基百科,很是詳細!Win10版本對應關係(維基可能被牆給個截圖吧)

 

win10 64位下驅動安裝工具下載地址(此工具只在上述環境下測試過,請在虛擬機中測試過再在真實環境下安裝不然藍屏本身負責)

http://download.csdn.net/detail/qing666888/9468506

注意事項:

關閉 、主機 客戶機 防火牆 、 互相ping都能ping通。

 

2、具體操做步驟

工具安裝就不說了,不會的百度一下。只說一下一些關鍵的地方。

一、安裝好虛擬機後,給虛擬機增長一個串口設備。具體操做見圖:

上面的\\.\pipe\com_1能夠改\\.\pipe\com_2,我就不改了後面名字能夠隨便取的,完成配置後虛擬機設備配置就多了一個串行端口的設備。由於打印機用了端口1。因此設備裏面顯示的是串行端口2,從新啓動虛擬機系統後,會發現設備管理裏面多了一個COM2的串口設備(若是想設置成端口1,把打印機設備刪了在添加串口設備)。

 

二、配置虛擬機系統爲調試模式

    以管理員身份,在虛擬機命令行模式下運行以下2個命令開啓。

    bcdedit /debug on
    bcdedit /dbgsettings serial debugport:n baudrate:115200
    where n is the number of a COM port on the virtual machine.
  (n時虛擬機的一個COM端口號。就是設備顯示的串行端口2,n就是端口2)。

    咱們使用下面的語句便可:

    bcdedit /debug on

    bcdedit /dbgsettings serial debugport:2 baudrate:115200

 

三、把WDK10的虛擬機調試驅動拷貝到虛擬機中安裝。

由於VS2015能夠調試x86 x64兩種驅動,根據被調試系統選擇不一樣的文件拷貝到虛擬機安裝,個人是64位的選擇x64

 

四、VS2015開發工具配置

在VS2015的菜單欄點擊DRIVER--TEST--CONFIGURE DEVICES,選擇增長新設備,以下圖:

或者換個地方配置,從工程屬性裏面進行配置。右鍵工程屬性配置從這也能夠進行測試設備的配置:

配置界面,下面兩個選項第一項由VS2015幫咱們建立一個WDKuser測試帳戶,自動打開測試模式等。第二個是使用咱們本身配置的參數。因爲上面咱們已經配置了串口參數 、設置了調試模式因此咱們選擇第二個就好了。

以下配置在內核模式中,選擇串口、配置好波特率、勾上2個選項、管道名稱、端口號(咱們上面配置的COM2)。

出現上述紅色框字樣則說明配置已經成功了。(不要開啓全局代理軟件,不然會出現鏈接不上的問題)。

 

五、使用工具安裝調試64位驅動

網上下的下面的驅動安裝軟件貌似64位的都用不了。

本身動手豐衣足食大笑,本身在網上弄了個源碼改了下弄成能夠加載64位的驅動的版本了。

1)使用DebugView打印內核調試信息是開發驅動的很是重要的手段,但DebugView默認在WINDOWS 10下卻沒法獲取內核的調試日誌,驅動調用KdPint/DbgPrint等的打印結果是沒法被DebugView給捕捉到的。設置方法以下(複製下面的代碼到txt文件。改後綴爲.reg後執行(看清楚了是.reg不是.bat敲打),而後重啓電腦):

 
  1. Windows Registry Editor Version 5.00

  2.  
  3. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]

  4. "DEFAULT"=dword:0000000f

2)還有本身編譯出來的驅動要使用編譯的Debug版原本測試,使用KdPrint打印須要顯示的調試信息。下面是在Win10 64位的虛擬機中用此安裝程序,加載64位的驅動以及用DebugView查看驅動打印消息的截圖結果。DebugView中須要勾選Capture Kernel選項。

 

六、在VS2015中下斷點進行調試

若是你第五部已經完成了,而且在DebugView中已經可以輸出調試的打印信息了,辣麼騷年你已經離成功只有一部之遙了大笑

建立一個驅動工程,WDK10提供的模板中根本沒有提供NT驅動模板,咱們如何建立NT驅動呢?
解決:其實雖然沒有提供NT模板,可是咱們能夠創建WDM空模板工程,而後再本身添加文件,編譯,獲得的也就是NT驅動了。

驅動工程中會幫你創建一個inf文件,NT是使用不到的,能夠直接刪除。咱們直接添加一個MyDriver.c,後綴必須是.c。若是後綴是.cpp,編譯會報錯:沒法解析的外部符號 _DriverEntry@8,該符號在函數 _GsDriverEntry@8 中被引用  。

在文件中添加測試代碼。

 
  1. #include <ntifs.h>

  2.  
  3. VOID DriverUnload(PDRIVER_OBJECT objDriver)

  4. {

  5. // 避免編譯器關於未引用參數的警告

  6. UNREFERENCED_PARAMETER(objDriver);

  7.  
  8. // 什麼也不作,只打印一行字符串

  9. KdPrint(("My Dirver is Ending..."));

  10. }

  11.  
  12. NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)

  13. {

  14. // 避免編譯器關於未引用參數的警告

  15. UNREFERENCED_PARAMETER(strRegPath);

  16.  
  17. // 打印一行字符串,並註冊驅動卸載函數,以便於驅動卸載

  18. KdPrint(("My Dirver Is Starting!\r\n"));

  19.  
  20. objDriver->DriverUnload = DriverUnload;

  21.  
  22. return STATUS_SUCCESS;

  23. }

編譯,報錯,沒有關係,這些都是由於安全警告等級過高了,咱們能夠下降編譯器警告等級的方式解決:

執行編譯,編譯的時候選擇Debug模式,選擇X64的選項(由於咱們的虛擬機使用的是64位的系統,不可以運行x86的驅動,若是你編譯出來的是x86的驅動,用上的工具安裝是能夠,可是啓動失敗提示阻止運行之類的)。編譯成功後,按照上面的第五步進行安裝測試。

不知不覺感受已經寫了好長了。。。。奮鬥抽口煙壓壓精。好吧我不抽菸的。。。。。繼續。若是上述的驅動成功編譯出來了。辣麼如今咱們開始附加虛擬機的內核進行調試了。

首先把虛擬機的系統內核附加到VS2015,具體步驟見下圖:

選中內核調試模式、選本身配置的那個電腦、選中下面列表中內核。見下圖

點擊附加,而後出現下圖界面,點擊一下所有中斷。

而後系統就斷下了,虛擬機的系統咱們鼠標已經點不了,如今系統處於掛起狀態了。見下圖

如今咱們能夠到源代碼中下斷點了。我就隨便下個斷點了,見圖:

而後咱們在下面的Debugger Immediate Winddow窗口的 Kd>  一行輸入命令 g 讓系統運行起來。這樣虛擬機中的系統又能夠點擊了。

 

最後一步了。使用咱們剛剛創建的驅動工程編譯出來的.sys驅動文件拷貝到虛擬機中。用第五步的工具進行安裝、啓動。啓動的時候自動觸發VS2015中的下的斷點。至此能夠像平時咱們調試程序同樣進行單步調試了。

注意事項:一、必定要拷貝Debug版本的進行調試。

                  二、拷貝到虛擬機中的.sys文件必定要是你源碼編譯出來的。

                  三、若是改動了源碼後必定要從新拷貝一份新的驅動文件到虛擬機中調試,不然沒法觸發斷點的。

 

3、關於驅動簽名

增長一點關於驅動簽名的吧,有不少小夥伴編譯成功後,驅動安裝的時候一直彈出下面的這個圖片,驅動沒有簽名被系統阻止安裝,解決方案百度上面說的基本是每次開機都進入啓動設置中----禁用驅動簽名強制、bcdedit  nointegritychecks on 或者 loadoptions DDISABLE_INTEGRITY_CHECKS等。這些方法都是之前的方法基本都沒什麼用了。

下面提供兩個可用方法:

1)使用過時簽名(下載個過時簽名給驅動簽上,把系統時間改到簽名有效期內)。簽名有版權問題東西就不提供了,本身到看雪能搜到。

2)使用UPGDSED(能夠同時關閉PathGuard跟驅動強制簽名)使用說明見下:

下載地址:https://github.com/hfiref0x/UPGDSED

管理員權限運行patch.exe,按照提示輸入大寫的CONTINUE按回車確認,patch完成後輸入Enter退出,重啓系統用另一個啓動項啓動系統。本人在windows10 企業版(15063)測試成功,能夠不開啓測試簽名模式下加載64位驅動。

4、採坑

       

1.關防火牆,兩邊都能ping通才行

       2. Solution: Log in to the target computer with an admin account. Go to 'Edit Local Users and Groups'.  You should see the 'WDKRemoteUser' in the list. Right-click the user and 'Set Password...'. Put in a password that will work  with your group password policy. Sign out and login as ".\WDKRemoteUser" with your current password. Retry the provisioning with the corresponding debug settings. It will run through the provisioning correctly this time.

Please leave a comment if you have any issues. I'll take a look and try to replicate it.

 

       3.That's a known issue with provisioning a Windows Server target machine. Windows Server does not have restore points, so creating a restore point will always fail.

If all the other steps passed (which is your case), you can safely ignore the restore point failure, and simply click "Next" and then "Finish"once provisioning complete. You will then be able to use the server machine as a target, even though the restore point step failed.

相關文章
相關標籤/搜索