在之前一篇文章裡介紹驅動開發環境搭建過程,現在就開始寫驅動了。我是照著鬱金香的視頻教程學習驅動開發的。那驅動有些課時比較多餘,我在學習的過程當中會終合考慮合并一些課時。今天這一課是學著寫一個驅動的helloworld,並用WDK環境編譯成sys檔案。為了對驅動開發有一個更深入的瞭解,我在此並沒有用我之前搭建好的VS2010驅動便宜環境,而是直接用notepad++,它是一個記事本的擴充程式,支援文法高亮。
建立一個HelloDriverWorld.c,然後用notepad++編輯它,代碼如下:
#include <ntddk.h>VOID Driver_Unload(IN PDRIVER_OBJECT pDriverObject);int DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING RegistryPath){ KdPrint(("Hello Driver World 驅動載入成功")); KdPrint(("記得要用雙括弧,在debug版本中KdPrint會用DbgPrint代替,release版就不做任何事")); DbgPrint("這是最簡單的驅動"); pDriverObject->DriverUnload = Driver_Unload; return (1);}VOID Driver_Unload(IN PDRIVER_OBJECT pDriverObject){ KdPrint(("Hello Driver World 驅動卸載成功"));}
記住驅動的入口函數不是main,而是DriverEntry, 驅動開發時的列印輸出函數是KdPrint或DbgPrint, 它們兩區別是KdPrint在check版本才有輸出功能在Free版本不起作用,DbgPrint則在兩個版本下都要輸出,還在注意KdPrint是有兩對括弧!!!!還有check版本就相當於Debug版本,Free就相當於Release版本!!!Driver_Unload函數驅動卸載時會調用。
到現在為止,我們的驅動源碼已寫好了,如何便宜它呀? 便宜它需要兩個檔案,一個是makefile,另一個是Source檔案,這兩個檔案都是文字檔。
makefiel內容如下:
# 此檔案 一般情況下只有一行 並且不需要修改 不能有前置空格 !INCLUDE $(NTMAKEENV)\makefile.def
Source內容如下:
#下邊這行指定產生驅動名字HelloDriverWorld.sysTARGETNAME=HelloDriverWorld#下邊這行指定組建檔案的類型DRIVER指驅動TARGETTYPE=DRIVER#下邊這行指定產生驅動所在的路徑\SYS\HelloDriverWorld.sysTARGETPATH=SYS#下邊這行指定相關標頭檔所在目錄路徑INCLUDES=$(WDKPATH)\inc;\ $(WDKPATH)\inc\ddk;\##上邊必空一行D:\WINDDK\3790.1830 等價$(WDKPATH),在系統內容變數裡,如果沒有自己添加#下邊這行指定驅動原始碼*.cpp或者*.cSOURCES=HelloDriverWorld.c\
裡面內容都有注釋, 我就不多說了。
好了,編譯的準備工作都做好了,我們開始編譯。(注意,我們是開發NT的驅動,所以得選Windows XP的編譯環境)
開啟WDK的編譯環境,是一個命令列,然後進到我們放上面準備的三個檔案目錄,輸入命令build開始編譯。
如果是已經編譯過,重新編譯命令是:build -c
這樣在同目尋下會成生一個sys目錄,一路點進去,你會發現一個HelloDriverWorld.sys檔案,它就是我們的驅動檔案。
把它拷到我們的VMware xp系統裡,用DriverMonitor這個工具就可以載入它,這時候用DbgView就可以看到我們的列印資訊。
我把需要用到的驅動工具上傳到svn上,大家可以直接下載。
源碼下載:http://code.google.com/p/windows-driver-sky/source/browse/#svn%2Ftrunk%2FHelloDriverWorld
快動手試一試吧!!!!光看不寫是不行的。