Windows驅動開發,vs+vm+wdk安裝及hello,world


近期接手了一個關於Windows系統內核驅動的開發任務,首先需要的就是熟悉相關開發環境的配置與調試,這里采用了vs2013+vm2015+wdk8.1的組合,已經親測完成(踩了無數的坑),在此做一下記錄,下次需要配置環境的時候可以用作參考。

vm,wdk,vs等工具先下載安裝好。

1.首先需要安裝win7虛擬機,這里需要注意系統的鏡像需要時虛擬機專用鏡像,所以在此保存一個64位的win7鏡像,可直接下載:

ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/

選擇配置好虛擬機之后需要首先點擊設置刪除占用com1串口的打印機,然后添串行端口將管道命名為\\.\pipe\com_1(如圖所示)。

 

 2.虛擬機開機后以管理員權限運行cmd,輸入如下命令開啟相應串口並關閉64位驅動強制簽名(64位驅動要求必須有數字簽名才可運行,但是可以在測試中關閉)

  bcdedit /debug on
  bcdedit /dbgsettings serial debugport:n baudrate:115200
  bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS

3.將主機中已安裝的wdk目錄中找到驅動目標程序將其復制進虛擬機中安裝

 

 

 3.運行vs,創建新的空wdm項目

新建first.c源程序

輸入helloworld代碼

#include <ntifs.h>  //<ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT objDriver)
{
    // 避免編譯器關於未引用參數的警告
    UNREFERENCED_PARAMETER(objDriver);
    // 什么也不做,只打印一行字符串
    DbgPrint("My Dirver is unloading...");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)
{
    // 避免編譯器關於未引用參數的警告
    UNREFERENCED_PARAMETER(strRegPath);
    // 如果編譯方式為Debug,則插入一個INT 3指令,方便我們調試
    // 打印一行字符串,並注冊驅動卸載函數,以便於驅動卸載
    DbgPrint("My First Dirver!\r\n");//
    KdPrint(("KD My First Dirver!\r\n"));
    objDriver->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

其中兩個函數,DriverEntry是程序入口相當於main,DriverUnload是卸載驅動時執行的函數。

以下為使用dbgview進行調試

4.將程序選擇win7debug以及x64環境,點擊編譯生成

 

將編譯生成的sys文件復制進虛擬機中

 

 

 

 

5.虛擬機中安裝dbgview,同時輸入以下命令然后重新啟動虛擬機,使其可抓取內核態信息,也就是咱們代碼中的dbgprint輸出的字符串

新建一個txt文件,復制進入如下信息

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
 
"DEFAULT"=dword:00000008

然后將文件后綴名改為.reg,啟動之后重啟計算機即可

6.先運行dbgview用於查看輸出的信息

 可以看到,在運行驅動之前,有一些其他的內核信息

7.運行InstDrv,將sys拖入其中點擊安裝,點擊運行,可看到輸出的helloworld

 

 

 

 

 

 

 

雙機調試

首先需要認識到的是,上面debugview是在虛擬機中進行的測試,下面兩種都將采用雙機測試模式,也就是在主機端進行debug,虛擬機用作執行環境,輸出的信息也全在主機端進行調試。

4.在進行雙機測試之前,需要完成對虛擬機系統的改造,使其進入測試模式。

在虛擬機中以管理員權限運行cmd,運行以下命令

 

bcdedit /copy {current} /d Windows7-雙機調試模式

bcdedit /timeout 10      

bcdedit /set testsigning on //開啟測試模式

  bcdedit /debug ON               //開啟debug

  bcdedit /bootdebug ON

bcdedit /dbgsettings              //查看剛才的設置信息,應該是使用com1串口,波特率為115200

bcdedit /dbgsettings serial debugport:1 baudrate:115200 //如果不是請輸入下行命令進行調整

 

在開機時有選擇啟動方式,其中“Windows7-雙機調試模式”是我們剛增加的啟動方式,選擇此方式進入虛擬機系統,這樣就完成了雙機測試中對虛擬機運行環境的配置。

 

以下為使用windbg進行雙機調試

5.首先在主機安裝windbg,將windbg文件創建快捷方式,這樣我們剛才在虛擬機中設定的串口管道就要用到了。

首先完成如下信息

 -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect –y

其中port為管道名,baud為波特率,需要和虛擬機中設定好的信息一致,然后將該段字符串復制到快捷方式的目標最后

 

 

 6.運行windbg,會提示wait to connect,此時啟動虛擬機選擇雙機調試模式,會遇到int 3中斷,此時在windbg中輸入g即可使虛擬機繼續執行,直至開機。

以下為vs雙機調試

5.vs雙機模式與windbg相似,即通過vs將編寫好的代碼的直接在虛擬機環境中進行debug,首先需要將vs連接虛擬機。

安裝好wdk后,vs欄上會多一個DRIVER的選項,選擇DRIVER-TEST-Configure進入如下界面

 

 點擊add new,選擇第二個選項,可以在配置時測試是否能完成連接(此處有坑,如果選擇第3項如果沒有連接成功也會添加新計算機設備,后續會出現大問題)

 

 計算機名稱一定要使用本機的名稱,通過我的電腦屬性中查看,如圖所示我的電腦是Windows,那么就要填Windows,這樣是通過尋找本機的對應通道進行連接。

 

 

 

 輸入正確的計算機名稱之后,點擊下一步,連接類型選擇Serial串口,同時勾選重連接與管道選項,波特率設定與虛擬機相同,將管道名設定為與虛擬機相同,點擊下一步

 

如果狀態為,則說明已經完成連接。

 

 

 

 

 然后在選項欄會多了一個此設備的選項

 

 然后我們打開剛才的helloworld程序,點擊調試,附加到進程

選擇傳輸方式為Windows Kernel Mode Debugger,選擇核心進程點擊附加,即可進入vs的dbg模式,與windbg顯示相同

 

 在vs的雙機調試中,可在點擊暫停調試后增加斷點,按F11進行單步調試。

 

ps:這個研究任務關系到畢業論文,所以還是重視一點點,這個基本都和內核及內存等有關系,能夠加深對系統底層的理解,平時的學習也不要落下,就醬加油吧,新的學期開始了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM