Windows 7 驱动开发
?
本文是對Win7(64)+VS2010+WDK7.1.0(WinDDK\7600.16385.1)開發(fā)驅(qū)動的小結(jié)。?
?
一、系統(tǒng)工具
?
1、Win7(amd64位)系統(tǒng)
注:已裝系統(tǒng)后,管理員身份運行cmd命令,查看bcdedit?/set?testsigning?true、bcdedit??/debug?on?等命令是否運行成功。若失敗,請將bcdedit命令所在文件夾boot對應(yīng)的盤(一般C盤)設(shè)置為活動狀態(tài);若依然失敗,請修復(fù)C盤下的Boot(系統(tǒng)引導(dǎo)文件所在),或重裝系統(tǒng)。
?
2、VS2010
?
3、WDK7.1.0(WinDDK\7600.16385.1)
地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365?該地址還連接?Windbg?調(diào)試工具?和Windows?Symbols?,可以下載下來備后續(xù)調(diào)試時用。
?
4、WinDbg
地址:http://www.microsoft.com/whdc/devtools/debugging/default.mspx
Symbols:
地址:https://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx
注:Symbol文件是從微軟的網(wǎng)站上http://msdl.microsoft.com/download/symbols下載而來,這個網(wǎng)址是不可以用IE直接打開的,WinDbg->File->Symbol?File?Path界面中輸入SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols;?并選擇Reload,WinDbg會自動幫你下載,關(guān)鍵是勾選reload。
?
5、InstDrv軟件(用于安裝、啟動、停止、卸載驅(qū)動)
注:srvinstw.exe?也可以安裝、卸載sys文件,但需要在cmd命令窗口下執(zhí)行net?start?驅(qū)動名、net?stop?驅(qū)動名來啟動、停止服務(wù)。
?
6、64Signer-V1.2(Win7?64位?私有測試數(shù)字簽名軟件)
?
7、DbgWiew.exe?(查看內(nèi)核模塊的輸出信息)
地址:https://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
?
8、虛擬機(WMware10.0供雙機調(diào)試)
地址:http://www.microsoft.com/zh-CN/download/confirmation.aspx?id=8002
?
9、其他軟件:?虛擬光驅(qū)DAEMON?Tools?Lite、EasyBCD(系統(tǒng)引導(dǎo)文件修復(fù)工具)、PartitionManager(將C盤設(shè)置為活動分區(qū))等
?
?
二、配置VS2010?64位開發(fā)環(huán)境
1、在VS中VisualC++下新建?空項目
?
?
添加Driver類,將頭文件刪除,將Driver.cpp文件修改為Driver.c文件,內(nèi)容如下:
#include?"ntddk.h"
?
//?提供一個Unload函數(shù)只是為了
VOID?DriverUnload1(PDRIVER_OBJECT?driver)
{
//?但是實際上我們什么都不做,只打印一句話:
DbgPrint("MyDriver:?Our?driver?is?unloading…\r\n");
}
?
NTSTATUS
DriverEntry(PDRIVER_OBJECT?DriverObject,PUNICODE_STRING?RegistryPath)
{
DbgPrint("MyDriver:?Hello,?my?salary!");
DriverObject->DriverUnload?=?DriverUnload1;
return?STATUS_UNSUCCESSFUL;
}
?
注:添加類后,在屬性中顯示出C/C++項,供配置屬性。
?
2、點擊VS中的解決方案配置的下按鈕(即debug所處的下拉框按鈕),點擊配置管理器,點擊活動方案配置,點擊新建,輸入DriverDebug64、默認空,解決方案平臺:選X64。
建成后的效果
?
3、點擊VS中視圖->其他窗口->屬性管理器
?
?
4、右擊屬性管理器中的DriverDebug64,選擇屬性,在彈出的窗體中進行必要的設(shè)置。
(此處的設(shè)置都是必須的,?對復(fù)雜些的驅(qū)動開發(fā)也許還要額外另加設(shè)置)
?
注:WDK7.1.0默認安裝在C:\WinDDK\7600.16385.1文件夾下
?
?
1)常規(guī)
目標文件擴展名:.sys
2)VC++目錄
可執(zhí)行文件目錄(編譯器路徑):C:\WinDDK\7600.16385.1\bin\amd64
注:Xp系統(tǒng)64位如下:
----------C:\WinDDK\7600.16385.1\bin\x86\amd64
?????? ----------C:\WinDDK\7600.16385.1\bin\x86
包含目錄:C:\WinDDK\7600.16385.1\inc\api
C:\WinDDK\7600.16385.1\inc\crt
C:\WinDDK\7600.16385.1\inc\ddk
庫目錄:C:\WinDDK\7600.16385.1\lib\win7\amd64
3)C/C++
預(yù)處理器->預(yù)處理器定義:
_AMD64_=1,AMD64=1,STD_CALL=1,WINVER=0x0501,_DEBUG?=1
高級->調(diào)用約定:__stdcall?(/Gz)
代碼生成-->運行庫:選擇多線程調(diào)試/MTd 或者 多線程調(diào)試DLL/MDd (主要解決_DEBUG未預(yù)定義的問題)
4)連接器
輸入->附加依賴項:ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB;%(AdditionalDependencies)
輸入->忽略所有連接庫:是?(/NODEFAULTLIB)
清單文件->啟用用戶賬戶控制(UAC):否?(/MANIFESTUAC:NO)
系統(tǒng)->子系統(tǒng):控制臺?(/SUBSYSTEM:CONSOLE)
系統(tǒng)->驅(qū)動程序:驅(qū)動程序?(/Driver)
系統(tǒng)->堆棧保留大小:4194304(可修改)
系統(tǒng)->堆棧提交大小:4096??(可修改)
高級->入口點:DriverEntry
高級->基址:0x10000?
高級->隨機基址:(清空)
高級->數(shù)據(jù)執(zhí)行保護(dep): (清空)
?
調(diào)試下:
解決_DEBUG未預(yù)定義的問題
C/C++
代碼生成-->運行庫:選擇多線程調(diào)試/MTd?或者?多線程調(diào)試DLL/MDd?
解決找不到符合問題(包含調(diào)試信息的未生成工程名.pdb文件)
C/C++
常規(guī)-->調(diào)試信息格式:用于“編輯并繼續(xù)”的程序數(shù)據(jù)庫?(/ZI)
優(yōu)化:已禁用?(/Od)
連接器
生成調(diào)試信息:是?(/DEBUG)
?
注:參考C:\WinDDK\7600.16385.1文件夾的ia64、X86等路徑,進行修改可以配置為ia64、32位系統(tǒng)。
?
5、編譯若通過,則配置成功,并生產(chǎn).sys等文件。
?
三、調(diào)試
?
配置調(diào)試機
?
1、將Win7設(shè)置為可調(diào)試狀態(tài)
1)以管理員身份打開cmd命令窗口:Win?+?R?打開運行輸入框,輸入cmd;或鼠標點擊系統(tǒng)開始圖標,在輸入框中輸入cmd,右擊上方搜索顯示出的cmd.exe,以管理員身份運行。
2)依次輸入:
bcdedit?/?
Bcdedit?/enum?OSLOADER
Bcdedit?/copy?{current}?/d?“Windows?7?Copy”
Bcdedit?/debug?on
Bcdedit?/bootdebug?on
Bcdedit?/dbgsettings
Bcdedit?/timeout?7
?
2、將Win7設(shè)置為測試版
管理員身份運行cmd命令,bcdedit?/set?testsigning?true
?
3、測試證書數(shù)字簽名
以管理員身份運行64Signer?V1.2.exe,點擊瀏覽找到并雙機.sys文件,點擊簽名。
?
4、查看內(nèi)核輸出信息
以管理員身份運行Dbgview.exe,點擊Capture菜單,勾選上Captrue?kernel項。
?
5、配置WinDbg
1)設(shè)置系統(tǒng)字符表路徑:WinDbg->File->Symbol?File?Path界面中輸入
SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols;?并選擇
Reload,WinDbg會自動下載字符表,關(guān)鍵是勾選reload。
2)設(shè)置自己生成的.sys對應(yīng)的字符(Symbol)路徑:
E:\Project\TestDriver\TestDriver\x64\DriverDebug64
3)設(shè)置自己生成.sys的原代碼路徑:E:\Project\TestDriver\TestDriver
注:自己生成的.sys文件默認路徑:E:\Project\TestDriver\x64\DriverDebug64
?
6、安裝.sys文件
以管理員身份運行運行InstDrv.exe,選擇.sys文件,進行安裝、啟動等操作
?
注:請不要在本地主機,測試含有斷點的內(nèi)核,否則卡機,無法進行任何操作,應(yīng)該采用雙機調(diào)試(即新建個虛擬機,本地機與虛擬機通過管道進行通信)。
?
配置虛擬機
?
1、安裝虛擬機
注:主板默認沒有開啟虛擬化技術(shù),一般方法是開機或重啟時按F12鍵進入BIOS菜單,將虛擬化(Virtualization...
?
2、配置虛擬機
1)開始-->WMware?Work?Stations-->雙擊“我的電腦”下的一個虛擬機(Windows?7?x64)-->編輯虛擬機設(shè)置-->移除打印機-->添加竄行端口
2)選中剛添加的竄行端口,在右側(cè)的對話框中,設(shè)置如下:
勾選?啟動時連接
選擇?使用命名的管道(N)
其下的兩個下拉框分別選擇:該端是服務(wù)器、另一端是應(yīng)用程序
3)本人執(zhí)行和未執(zhí)行該步驟都能夠調(diào)試成功。本步驟作為多余補償,如果你未執(zhí)行該步驟失敗,請將主機目錄C:\WINDOWS\Symbols下的拷貝到虛擬機的相同位置。并且把自己生成的驅(qū)動編譯后生成的字符文件(E:\Project\TestDriver\TestDriver\x64\DriverDebug64
目錄下)放到虛擬機的C:\WINDOWS\Symbols目錄下。主要匹配主、客機上字符的一致性。
3、雙機調(diào)試
給源代碼添加調(diào)試時中斷語句
#if?_DEBUG //DBG
???? __debugbreak();?//64位
#endif
重新生成sys文件,重新執(zhí)行以上步驟,然后以管理員身份打開主機上的WinDbg軟件,再在客戶機安裝.sys文件及開啟、關(guān)閉、卸載等操作。開啟后即進入中斷點,可以一步步進行調(diào)試。。。
注:匯編_asm?int?3?中斷,在xp上?正確,在64位Win7上報錯。如果未能進入斷點進行調(diào)試,請檢查sys文件是否在客戶機(虛擬Win7系統(tǒng))安裝成功,系統(tǒng)字符集(Symbols)、本人字符Symbols是否下載或設(shè)置正確,管道端口是否正確等
?
提示:在本地主機上不以管理員身份運行軟件,也可能是管理員身份成功運行,而客戶機(虛擬機上一般都要是以管理員身份運行軟件)
?
若進行 Win7 + WDK8.0+Windbg 進行Driver Filter開發(fā),請將WDK7卸載,否則運行時會報大堆離奇錯誤。。。。
轉(zhuǎn)載于:https://www.cnblogs.com/shenchao/p/4832843.html
總結(jié)
以上是生活随笔為你收集整理的Windows 7 驱动开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “千脑智能理论”或颠覆AI,比尔·盖茨重
- 下一篇: 第一百一十一期:思考 | 一文说透秒杀系