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

100編程書屋_孔夫子舊書網

  • 配置驅動開發環境
  • 配置驅動開發模板
  • 配置驅動雙機調試

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40528.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2009-2024年第一季度上市公司華證ESG評級季度數據

2009-2024年第一季度上市公司華證ESG評級季度數據 1、時間&#xff1a;2009-2024年第一季度 2、指標&#xff1a;證券代碼、證券簡稱、評級日期、綜合評級、綜合得分、E評級、E得分、S評級、S得分、G評級、G得分、證監會行業&#xff08;新&#xff09;、同花順行業&#xff…

Visio框圖自動帶填充色原因及如何取消

0 Preface/Foreword Visio&#xff0c;Windows的一個流程圖&框圖制作工具。 1 新建Visio文件 1.1 圖形帶填充 新建Visio時候&#xff0c;如果選擇了模版&#xff0c;那么就后期使用的工具元素會自動填充。 帶來的弊端&#xff0c;在元素編輯文字時&#xff0c;如果此時不…

蘋果公司的Wifi定位服務(WPS)存在被濫用的風險

安全博客 Krebs on Security 2024年5月21日發布博文&#xff0c;表示蘋果公司的定位服務存在被濫用風險&#xff0c;通過 "竊取"WPS 數據庫&#xff0c;可以定位部隊行蹤。 相關背景知識 手機定位固然主要依賴衛星定位&#xff0c;不過在城市地區&#xff0c;密集的…

Perl 語言開發(五):循環語句

目錄 1. 循環語句概述 2. while 循環 2.1 基本語法 2.2 示例 2.3 無限循環 3. until 循環 3.1 基本語法 3.2 示例 3.3 無限循環 4. for 循環 4.1 基本語法 4.2 示例 4.3 嵌套循環 5. foreach 循環 5.1 基本語法 5.2 示例 5.3 遍歷哈希 6. 循環控制語句 6.1 …

新建Vue工程的幾種方法

文章目錄 使用CLI2 : vue-cli使用CLI3 : vue/cli使用 vue3構建 &#xff08;內置Vite&#xff09;直接使用Vite使用parcel (最少配置方案) 使用CLI2 : vue-cli vue-cli是針對構建vue的腳手架CLI2&#xff0c;只能新建vue2工程。 全局安裝vue-cli之后&#xff0c;構建vue2項目的…

03.C1W2.Sentiment Analysis with Na?ve Bayes

目錄 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…

大數據領域的深度分析——AI是在幫助開發者還是取代他們?

在大數據領域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的應用正在迅速擴展&#xff0c;改變了數據科學家和開發者的工作方式。本文將從大數據的專業視角&#xff0c;探討AI工具在這一領域的作用&#xff0c;以及它們是如何幫助開發者而非取代他們的。 1. 大數據…

npm 淘寶鏡像證書過期,錯誤信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更換 npm 證書 問題描述報錯原因更換步驟1 找到 nvm 安裝目錄2 發現證書過期3 更換新地址4 保存后&#xff0c;重新安裝成功 問題描述 在使用 nvm 安裝新版本時&#xff0c;未成功&#xff0c;出現報錯&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

【postgresql】表操作

創建表 (CREATE TABLE): CREATE TABLE table_name ( column1 data_type constraint,column2 data_type constraint,... ); 插入數據 (INSERT INTO): INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 查詢數據 (SELECT): SELECT column1, c…

火山引擎數據飛輪實踐:在電商場景中,如何建設全鏈路數據血緣?

數據作為新型生產要素&#xff0c;正支撐企業的數智化轉型。但企業數字化建設也存在管理成本高、數據產品使用門檻高、數據資產價值不夠的問題&#xff0c;其原因在于業務和數據之間沒有形成雙向良性驅動。 結合新時代企業數字化轉型需求&#xff0c;火山引擎基于字節跳動十余…

IC燒錄員-帶著工程師的夢想遠航!

如果說軟件工程師是代碼程序的創造者&#xff0c;那么IC燒錄員就是把工程師們辛苦敲代碼&#xff0c;日夜辛勞的成果燒錄到芯片里面的實踐者&#xff0c;是他們&#xff0c;讓工程師們的夢想運用到實踐中&#xff0c;是他們帶著工程師的夢想遠航&#xff0c;他們的薪酬或許沒有…

第一節-k8s架構圖

一個Deployment&#xff0c;可以由多個不同Node下的Pod組成&#xff0c;每個Pod又由多個Container組成。 區分Deployment是用Labels(key:value)&#xff0c;區分Pod是用PodName&#xff0c;區分Container是用ContainerName。 一個Node可以包含多個不同Deployment中的pod&…

MySQL-作業1

一、數據庫 1、登陸數據庫 2、創建數據庫zoo 3、修改數據庫zoo字符集為gbk 4、選擇當前數據庫為zoo 5、查看創建數據庫zoo信息 6、刪除數據庫zoo 二、創建表 1、創建一個名稱為db_system的數據庫 2、在該數據庫下創建兩張表&#xff0c;具體要求如下&#xff1a; 員工表 user …

米國政府呼吁拋棄 C 和 C++

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01; 很多觀點認為C 或 C永遠不可被…

頁面集成技術方案匯總

1.window.open() 優點: 新開窗口或標簽頁展示內容&#xff1a;允許在新的瀏覽器窗口或標簽頁中打開指定的URL&#xff0c;適用于需要獨立頁面交互的場景。隔離性&#xff1a;新窗口擁有獨立的執行環境&#xff0c;不會干擾主頁面的JavaScript上下文和DOM結構。易于實現&#…

聚鼎裝飾畫:裝飾畫生意現在做晚嗎

在這個充滿機遇與挑戰的時代&#xff0c;涉足裝飾畫領域是否為時已晚?許多人心中或許有著這樣的疑問。事實上&#xff0c;盡管市場上的競爭者眾多&#xff0c;但正如“朝霞映滿天&#xff0c;別樣紅”一般&#xff0c;每個行業的黃金時期都有所不同&#xff0c;關鍵在于我們能…

設計模式-裝飾器

裝飾器模式是一種結構型設計模式&#xff0c;它允許在運行時擴展一個對象的功能&#xff0c;而不需要改變其現有結構。這種模式的核心思想是通過創建一個裝飾器來動態地增強或修改原有對象的行為。裝飾器模式是繼承的一個補充&#xff0c;提供了比繼承更加靈活的方式來擴展對象…

在線JSON可視化工具--改進

先前發布了JSON格式化可視化在線工具&#xff0c;提供圖形化界面顯示結構關系功能&#xff0c;并提供JSON快速格式化、JSON壓縮、快捷復制、下載導出、對存在語法錯誤的地方能明確顯示&#xff0c;而且還支持全屏&#xff0c;極大擴大視野區域。 在線JSON格式化可視化工具 但…

Cannot load configuration class: com.xxx.NacosConfigApplication

Cannot load configuration class: com.xxx.NacosConfigApplication 無法啟動成功 表象錯誤的日志信息解決方案結言 表象 最簡單的Spring Boot maven 配置 properties配置 啟動類&#xff0c;但是&#xff0c;就是無法啟動成功。 錯誤的日志信息 java.lang.IllegalStateEx…