驅動開發:配置Visual Studio驅動開發環境

来源:https://www.cnblogs.com/LyShark/archive/2023/03/13/17163377.html
-Advertisement-
Play Games

在正式開始驅動開發之前,需要自行搭建驅動開發的必要環境,首先我們需要安裝`Visual Studio 2013`這款功能強大的程式開發工具,在課件內請雙擊`ISO`文件並運行內部的`vs_ultimate.exe`安裝包,`Visual Studio`的安裝非常的簡單,您只需要按照提示全部選擇預設參... ...


在正式開始驅動開發之前,需要自行搭建驅動開發的必要環境,首先我們需要安裝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驅動,則可以無干擾的輸出我們所需結果。

文章作者:lyshark (王瑞)
文章出處:https://www.cnblogs.com/LyShark/p/17163377.html
版權聲明:本博客文章與代碼均為學習時整理的筆記,文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!

轉載文章請遵守《中華人民共和國著作權法》相關法律規定或遵守《署名CC BY-ND 4.0國際》規範,合理合規攜帶原創出處轉載,如果不攜帶文章出處,並惡意轉載多篇原創文章被本人發現,本人保留起訴權!(著作權版權所有,侵權必究!)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 處理GB/T4754—2017國民經濟行業分類與代碼數據,劃分四級分類存入mysql資料庫【文末獲取下載方式】 第二張圖是之前的格式,今天應一位網友的要求,將其處理為如下第三張圖的格式。更貼近源文檔,方便使用。 如圖所示: 按 門類編碼 門類名稱 大類編碼 大類名稱 中類編碼 中類名稱 小類編碼 小 ...
  • 單元測試、反射 一、單元測試 1.1 單元測試快速入門 所謂單元測試,就是針對最小的功能單元,編寫測試代碼對其進行正確性測試。 我們想想,咱們之前是怎麼進行測試的呢? 比如說我們寫了一個學生管理系統,有添加學生、修改學生、刪除學生、查詢學生等這些功能。要對這些功能這幾個功能進行測試,我們是在main ...
  • 此處為一個測試項目的簡單結構,為了便於管理和使用,所以直接將需要的jar放到lib(名字隨意)文件夾下 方法一、 找到項目結構視窗並打開→打開後按圖片上順序進行點擊→而後找到自己的jar包後選中並確定 以上步驟都結束以後就可以調用包中的方法了 方法二、 打開項目結構管理以後→點擊Libraries→ ...
  • 作者:你呀不牛 鏈接:https://juejin.cn/post/7114669787870920734 前段時間,同事在代碼中KW掃描的時候出現這樣一條: 上面出現這樣的原因是在使用foreach對HashMap進行遍歷時,同時進行put賦值操作會有問題,異常ConcurrentModifica ...
  • 1.總結內容參考:https://blog.csdn.net/dhklsl/article/details/127533485 2.下麵是本人工作項目中實戰到的案例(具體業務的實體沒必要關註) 2.1.攔截器使用 點擊查看代碼 import java.lang.invoke.MethodHandle ...
  • IDEA: 如何導入項目模塊 以及 將 Java程式打包 JAR 詳細步驟 、 @ IDEA 導入項目模塊 Module 一. 創建一個空項目 想要導入模塊 Module ,我們需要先創建一個項目,因為 Module模塊在 IDEA 中是存在於項目下的。 這裡我們先創建一個空項目,當然已經有項目了, ...
  • 我這個人比較懶,總是喜歡把收到的重要文件,或者比較緊急的文件放到桌面,久而久之,桌面或者文件夾越來越亂 。 不知道大家是不是像我一樣的 我滴媽呀,看著就很崩潰! 之所以放在桌面上,主要是為了下次使用的時候好找 但是,其實,結果…並沒有 結果,我的馬馬~~ 反而更難找了 也不知道越亂越好找這句話是誰第 ...
  • 作者:變速風聲 鏈接:https://juejin.cn/post/7104090532015505416 前言 在開發中遇到一個業務訴求,需要在千萬量級的底池數據中篩選出不超過 10W 的數據,並根據配置的權重規則進行排序、打散(如同一個類目下的商品數據不能連續出現 3 次)。 下麵對該業務訴求的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...