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