寒江独钓1
驅(qū)動模型區(qū)分:
WDM 必須滿足n種被要求的特性(如電源管理,即插即用);如果沒有這些功能,則統(tǒng)一稱為NT式驅(qū)動;如果調(diào)用了WDF的內(nèi)核API,則稱為WDF驅(qū)動。
本書關(guān)注于通用的內(nèi)核程序開發(fā),不是針對某種硬件。例如,文件系統(tǒng)驅(qū)動,存儲設(shè)備驅(qū)動,網(wǎng)絡(luò)驅(qū)動。不是為了驅(qū)動某個硬件,而是在通用的windows上實現(xiàn)某種功能。
開發(fā)環(huán)境的搭建:
下載WDK,編譯調(diào)試。無需VS,VS只是方便工程管理和編碼。
因為不是應(yīng)用程序,所以所有win32API都不能使用。部分C Runtime函數(shù)也不能使用,但文檔中說明的函數(shù)則可以使用。
簡單代碼示例:
#include <ntddk.h>// 提供一個Unload函數(shù)只是為了 VOID DriverUnload(PDRIVER_OBJECT driver) {// 但是實際上我們什么都不做,只打印一句話:DbgPrint("first: Our driver is unloading…\r\n"); }// DriverEntry,入口函數(shù)。相當于main。 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) { #if DBG // _asm int 3 #endif// 這是我們的內(nèi)核模塊的入口,可以在這里寫入我們想寫的東西。// 我在這里打印一句話。因為”Hello,world” 常常被高手恥笑,所以// 我們打印一點別的。DbgPrint("first: Hello, my salary!");// 設(shè)置一個卸載函數(shù)便于這個函數(shù)能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }DriverEntry 是每個內(nèi)核模塊的入口,在加載這個模塊時,被系統(tǒng)進程System調(diào)用一次。
設(shè)置DriverUnload函數(shù)指針,這樣這個模塊可以被動態(tài)地卸載。如果沒有設(shè)置DriverUnload指針,則一個內(nèi)核模塊一旦被加載就不能卸載了。
增加兩個文件,以便WDK build。
makefile,直接到Sample下找個,無需修改。sources,需要編譯那些文件,只需要.c,不要加入.h,以及編譯.sys的名字。
TARGETNAME=first TARGETTYPE=DRIVER SOURCES=first.c TARGETPATH=obj編譯選擇,Check,Free。build。
安裝工具
srvinstw.exe,通過“安裝服務(wù)”,指定.sys文件路徑,“設(shè)備驅(qū)動”,指定為“手動”,安裝驅(qū)動。
通過“net start xxx”啟動驅(qū)動?!皀et stop xxx”停止驅(qū)動。(系統(tǒng)軟件服務(wù)列表中,是不顯示該項的)
虛擬機調(diào)試配置,以在前面的Blog中寫明。
調(diào)試
windbg下載安裝。設(shè)置Symbol,SourceFile,Image。Windbg把內(nèi)核視為一個整體,沒有必要告訴它需要調(diào)試哪個具體的模塊。只要指定
Symbol和Source。
在設(shè)置斷點不方便的地方,小技巧。
#if DBG
_asm int 3 ?//等于手動設(shè)置斷點,但是只在調(diào)試狀態(tài),在非調(diào)試狀態(tài)會藍屏。
#endif
轉(zhuǎn)載于:https://www.cnblogs.com/huangyong9527/archive/2012/07/25/2608159.html
總結(jié)
- 上一篇: 鸟哥的Linux私房菜-合集
- 下一篇: idea合并svn不同分支_如何在Int