在正式開始驅動開發之前,需要自行搭建驅動開發的必要環境,首先我們需要安裝Visual Studio 2013這款功能強大的程式開發工具,在課件內請雙擊ISO檔案并運行內部的vs_ultimate.exe安裝包,Visual Studio的安裝非常的簡單,您只需要按照提示全部選擇默認引數即可,根據機器配置不同可能需要等待一段時間;
配置驅動開發環境
在正式開始驅動開發之前,需要自行搭建驅動開發的必要環境,首先我們需要安裝Visual Studio 2013這款功能強大的程式開發工具,在課件內請雙擊ISO檔案并運行內部的vs_ultimate.exe安裝包,Visual Studio的安裝非常的簡單,您只需要按照提示全部選擇默認引數即可,根據機器配置不同可能需要等待一段時間;

接著讀者還需要繼續安裝Windows Driver Kit 8.1工具包,請將該工具包解壓縮到桌面,并雙擊wdksetup.exe進行安裝,程序中只需要一直下一步,并等待WDK工具包安裝完成;
WDK就是內核編程開發工具包,某些讀者可能聽說過DDK或者IFSDDK,最典型的開發工具包莫過于DDK7600,直到目前此類工具包仍然可以正常使用,但并不推薦,

為了能測驗驅動程式運行狀態,讀者需安裝VMWare虛擬機,雙擊附件中的VMware-workstation-full-16.2.4-20089737.exe安裝程式一直點擊下一步即可,需要注意的是在如下選項中請在增強型鍵盤驅動程式上打對勾,之后等待安裝完畢即可;

接著打開VMware虛擬機,并在【檔案】處選擇【新建虛擬機】,單機下一步并選中【稍后安裝作業系統】,在作業系統選擇頁面選擇【Win10 x64】版本,

在硬體配置處,讀者可根據自己電腦的配置靈活的選擇,當自定義配置完成后,則虛擬機模板將被創建,

虛擬機模板創建完成后,讀者可根據如下配置選擇編輯虛擬機設定,并在磁盤位置處將課件中的cn_windows_10_consumer_editions_version_1903_x64_dvd_8f05241d.iso掛載到虛擬機上;

點擊開啟虛擬機,并按照提示將Windows系統正確的安裝,需要注意的是在選擇版本時,讀者最好使用教育版與筆者開發環境保持一致,至此只需等待系統安裝完畢,根據系統差異安裝時間可能有所差別,耐性等待即可;
當一切安裝就緒后我們需要在系統中安裝VMware Tools工具,該組件在安裝后可讓虛擬機具備有拖拽上傳檔案的功能,且滑鼠鍵盤將可以自由切換,該功能是我們必須要用到的;

安裝VMware Tools工具很容易,只需要點擊安裝選單,后會在虛擬機中出現DVD驅動器,此時雙擊驅動器并按照要求安裝即可,安裝完成后重啟系統,此時則具備了拖拽上傳功能;

當這些都做好以后,建議用戶關閉虛擬機,并點擊【虛擬機】選單,找到【快照】并拍攝一個快照,快照的作用是當虛擬機系統出現問題后可快速恢復到初始模式,避免重裝系統,在后續課程中讀者會出現無數次的藍屏,而虛擬機快照的快速恢復功能則是一個很好的選擇;

配置驅動開發模板
1.打開Visual Studio開發工具,然后選擇【檔案】選單新建專案,并在已安裝模板中選中【Visual C++】新建空專案,并將專案名稱命名為【WinDDK】點擊確定,

2.依次選擇【解決方案視圖-源檔案-添加新建項】選項卡,或者直接按下Ctrl + Shift + A快捷打開選單,并創建main.c檔案,

3.接著需要修改配置管理器,添加自定義配置管理,選擇【生成-配置管理器-新建】選項卡,此處我們命名為WinDDK即可,

4.修改配置屬性中的【常規】屬性,點擊選單欄中的除錯,選擇【WinDDK屬性-配置-常規】修改為標黃處所示內容即可,

5.配置可執行檔案路徑與匯入庫路徑,這里我們選擇【配置屬性-VC++目錄】依次將如下資訊填入配置項,
可執行目錄
C:\Program Files (x86)\Windows Kits\8.1\bin\x64
C:\Program Files (x86)\Windows Kits\8.1\bin
包含目錄
C:\Program Files (x86)\Windows Kits\8.1\Include\km
C:\Program Files (x86)\Windows Kits\8.1\Include\shared
C:\Program Files (x86)\Windows Kits\8.1\Include\um
C:\Program Files (x86)\Windows Kits\8.1\Include\wdf\kmdf\1.13
C:\Program Files (x86)\Windows Kits\8.1\Include\wdf\umdf\2.0
C:\Program Files (x86)\Windows Kits\8.1\Include\winrt
參考目錄
C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\km\x64
庫目錄
C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\km\x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\kmdf\x64\1.13
C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\umdf\x64\2.0
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\km\x64
當如上檔案配置完成后,最終效果如下圖所示;

6.配置C/C++優化選項,在配置屬性中找到【C/C++-所有選項】并依次修改下方幾個關鍵位置,
安全檢查 禁用安全檢查 (/GS-)
將警告視為錯誤 否 (/WX-)
警告等級 關閉所有警告
啟用C++例外 否
呼叫約定 __fastcall (/Gr)
優化 已禁用 (/Od)
運行庫 多執行緒 (/MT)
前處理器定義 _AMD64_;_DDK_;_WIN32_WINNT=0x0501;WINVER=0x0501;_NDEBUG;DBG=0;%(PreprocessorDefinitions)
當如上檔案配置完成后,最終效果如下圖所示;

7.配置連接器選項,選擇【連接器-所有選項】依次修改下方幾個關鍵位置,
附加選項 /IGNORE:4078 /safeseh:no
附加依賴項 ntoskrnl.lib;ndis.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib
固定基址 此處需要清空
忽略所有默認庫 是 (/NODEFAULTLIB)
啟用增量鏈接 否 (/INCREMENTAL:NO)
驅動程式 驅動程式 (/Driver)
入口點 DriverEntry
生成清單 否 (/MANIFEST:NO)
生成除錯資訊 是 (/DEBUG)
生成映射檔案 是 (/MAP)
資料執行保護 是 (/NXCOMPAT)
隨機基址 此處需要清空
子系統 本機 (/SUBSYSTEM:NATIVE)
當如上檔案配置完成后,最終效果如下圖所示;

8.上方的配置已經基本完成了,接著我們撰寫一段驅動初始化代碼,然后按下F7即可完成驅動的編譯,
// 署名權
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: [email protected]
#include <ntifs.h>
// 卸載驅動
NTSTATUS UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint("Uninstall Driver Is OK \n");
return STATUS_SUCCESS;
}
// 驅動入口地址
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
DbgPrint("Hello LyShark \n");
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
9.最后生成一個驅動開發模板,依次選擇【檔案-匯出模板-專案模板-下一步-完成】即可完成模板的匯出,此時關閉VS工具并再次打開,就能直接使用我們的模板來開發驅動了,當用戶需要使用時,不需要每次都配置,
- 模板位置:C:\Users\admin\Documents\Visual Studio 2013\My Exported Templates

讀者也應注意,如果用戶通過模板創建驅動開發專案則需要手動在配置選單中切換到WinDDK選項的x64模式下,

配置驅動雙機除錯
1.首先需要在VMware虛擬機關閉狀態下添加一個管道虛擬串口,此處需要洗掉列印機,否則串口之間沖突,
操作步驟:編輯虛擬機設定 -> 添加 -> 串行埠 -> 完成
引數配置:使用命名管道 -> \\.\pipe\com_1 -> 該端是服務器,另一端是應用程式 -> 輪詢時主動放棄CPU->確定

2.開啟虛擬機中的Windows系統,然后以管理員身份運行CMD命令列,輸入bcdedit命令,可以查看到系統的當前啟動項,如果是新的系統,則只會有{current}啟動項以及一個{bootmgr}項,

連續執行下方的七條命令,依次建立啟動項,激活Windows系統的除錯模式,并開啟串口通信,除錯埠波特率為115200
bcdedit /set testsigning on
bcdedit -debug on
bcdedit /bootdebug on
bcdedit /set "{current}" bootmenupolicy Legacy // 修改啟動方式為Legacy
bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200 // 設定串口1為除錯埠波特率為115200
bcdedit /copy "{current}" /d "Debug" // 將當前配置復制到Debug啟動配置
bcdedit /debug "{<新建的啟動配置的識別符號>}" on // 打開除錯開關
但需要注意{<新建的啟動配置的識別符號>}需替換成{bdb0b3b6-3f21-11ed-9931-d46011246f28}標志,如下所示,

3.最后查看一下當前除錯配置選項,執行命令 bcdedit /dbgsettings,顯示出使用的第一個串口,波特率為115200bps,保持默認不需要修改,

4.配置完成后,重新啟動系統,在開機的時候選擇Windows10 [啟用除錯程式]則系統會黑屏,說明已經正常進入除錯模式了,

5.此時回到物理機上面,解壓縮課件中的WinDBG_10.0.16299.15.zip到D盤根目錄下,我們在命令列中切換到WinDBG\x64的根目錄下,并執行以下命令,即可連接虛擬機串口進行除錯了,
- 執行命令
windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe如下圖

6.至此我們還需要加載符號,符號的作用是方便我們除錯,該符號是由微軟官方維護的權威資料,在命令列下依次執行以下命令,配置好符號加載并啟動系統,
kd> .sympath SRV*c:\mySymbols*http://msdl.microsoft.com/download/symbols
kd> .reload
kd> g
kd> g
kd> ed nt!Kd_SXS_Mask 0
kd> ed nt!Kd_FUSION_Mask 0
kd> u KiSystemServiceUser
這樣即可完成配置操作,此時系統已被斷下等待我們執行操作,如下圖所示,

7.最后我們配置測驗一下除錯功能,首先撰寫以下代碼,代碼中使用DbgBreakPoint()設定斷點,將會在入口處中斷,
// 署名權
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: [email protected]
#include <ntifs.h>
// 驅動默認回呼
NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
// 驅動卸載函式
VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint("驅動已卸載 \n");
}
// 驅動入口地址
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
// 初始化默認派遣函式
NTSTATUS status = STATUS_SUCCESS;
for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
Driver->MajorFunction[i] = DriverDefaultHandle;
}
// 設定斷點
DbgBreakPoint();
// KdBreakPoint();
// __debugbreak();
DbgPrint("驅動已加載 \n");
// 驅動卸載函式
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
通過Visual Studio工具編譯如上代碼片段,并在WinDBG中輸入g命令讓系統運行起來,將編譯好的驅動程式拖入到虛擬機中,并以管理員身份打開Windows 64Signer.exe,使用該工具對驅動程式進行簽名,如下圖所示;

簽名完成后將我們的驅動檔案WinDDK.sys,拖入到KmdManager.exe驅動加載工具中,并通過驅動加載工具加載運行,此時Windows系統會卡死,回到WinDBG中發現已經可以進行除錯了,如下圖所示;

此處需要擴展一個知識點,如果不使用WinDBG工具而想要獲取到DbgPrint()函式輸出結果,則你可以使用課件中提供的dbgview64.exe程式,不過此程式需要注意幾點,該程式需要使用管理員身份運行,且運行后需要將Capture選單中的屬性全部打對勾,如下圖所示;

此時DebugView會出現很多的無用輸出,則你需要打開過濾器按鈕,輸入STORMINI將此類輸出屏蔽掉,如下圖所示;

至此再次使用KmdManager工具加載WinDDK驅動,則可以無干擾的輸出我們所需結果,
文章出處:https://www.cnblogs.com/LyShark/p/17163377.html
著作權宣告:本博客文章與代碼均為學習時整理的筆記,文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!
轉載文章請遵守《中華人民共和國著作權法》相關法律規定或遵守《署名CC BY-ND 4.0國際》規范,合理合規攜帶原創出處轉載,如果不攜帶文章出處,并惡意轉載多篇原創文章被本人發現,本人保留起訴權!(著作權著作權所有,侵權必究!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546680.html
標籤:其他
