?? wdm-driver-how to .txt
字號:
用VC++ 6.0來編譯WDM驅動
作者:Arthur Tu
2003年9月28日星期日
標題:用VC++ 6.0來編譯WDM驅動(限于2K DDK)
Version 1.02
如果轉貼,務必加上以下內容:
***************************************
作者:Arthur Tu
出處:驅動開發網 www.driverdevelop.com
***************************************
內容:
用VC++ 6.0來編輯(不是編譯)Driver的源文件是很不錯的選擇,尤其是搭配用Visual Assist,更方便了。編輯完了,就在VC++里面build,就更方便了。
我在M$的站點參考了些,DS生成的dsw、和build生成的log文件,都有參考。實際上,M$站點上就是根據build的log文件來改VC的Setting的。Me too;)
限于2K DDK,因為XP DDK和2003 DDK不需要VC++6.0了。并且我用VC6來build的時候,會告訴你“Compiler version not supported by Windows DDK”,不過沒有進一步去嘗試。
DDK自己帶了link,98、2K DDK似乎都是VC5的,如果像我這樣做,實際上是用VC6的link了。
不考慮source、dir、make文件。
DDK的build,其實算是一個調用nmake工具,而nmake去調相應的文件如cl.exe、link.exe等。
cl的選項設置,主要注意DDK的include路徑問題,link的選項,就是要讓link去link出一個sys而不是exe,呵呵
預備工作:
1、安裝了DDK(呵呵,說句廢話)。目錄名字最好不要帶空格。
2、建立一個workspace,把自己的c、h、rc等文件加進去。
3、Configurations,添加Checked、Free,不要Debug、Release(其實這并沒有什么必要,Checked、Debug,看你怎么叫了)。
剩下的就是改各個設置,讓VC為你build出一個sys文件了。
我們一個一個的來。所有的改動,都在Project->Setting下面。主要集中在C/C++和Link下。
1、 General,就一個,Not Using MFC;
2、 Debug,沒有什么可改的;
3、 C/C++:
1.1 General:
3.1.1 Warning level,用Level3,驅動嘛,穩定壓倒一切,而且DDK sample就是warning 3的,Warnings as errors選上;
3.1.2 Optimizations,對checked,我是Disable(Debug),省的用SoftIce的時候會有變量說Watch不了,對Free的,我是Customize,后面會講到;
3.1.3 Debug Info,Free當然是沒有了,你要加上是你的事了,Checked,我用C7;VC默認的Program Database for "Edit & Continue",和link的/driver選項沖突;
3.1.4 Preprocessor definitions,有些我并沒有弄清楚,有些可能是DS用的,大概說說。下面是我某個dsw用的。
RDRDBG, SRVDBG, FPO=0, WIN32=100, STD_CALL, CONDITION_HANDLING=1, NT_UP=1, NT_INST=0, _NT1X_=100, WINNT=1, _WIN32_WINNT=0x0400, WIN32_LEAN_AND_MEAN=1, DEVL=1, _DLL=1, _X86_=1, $(CPU)=1, NTVERSION='WDM', WINVER=0x500, NTDEBUG=ntsd,DBG=1
STD_CALL不必說了,driver的函數全部是__stdcall的,其實在其他地方有設置的。
WINVER=0x500,是因為你是for 2K的。XP的是0x501,不過沒有用,反正不能用VC6了。
_X86_=1,沒有的話,嘿嘿。Alpha等CPU不是這個值了。
DBG,free的話,就不要定義,或為0。
FPO,checked的為0,free的為1。我想應該是指Fram-Pointer Omission吧
NTDEBUG= checked ? ntsd : ntsdnodebug
WIN32_LEAN_AND_MEAN, Exclude rarely-used stuff from Windows headers,non-mfc的,用這個能減少build的時間。多些definitions也沒有關系,不影響其他的就好;)
NT_UP,為0表示是MP,多處理器的,1表示你在單處理器用的。
NT_INST, set to turn on instrumentation
根據driver類型,你可能還要加上別的preprocessor definitions,比如NDIS的IMD,就要NDIS50, NDIS_MINIPORT_DRIVER, NDIS50_MINIPORT。
3.1.5 Project Options 你只需要最后添加幾個就好了,包括/QIfdiv- /QIf /QI0f,可以在MSDN上查到。值得一提是VC產生的workspace的debug setting,默認有個GZ選項,Catch Release-Build Errors in Debug Build,編譯的時候會說error LNK2001: unresolved external symbol __chkesp,去掉就好了。
1.2 C++ Language 沒有什么說的,不要RTTI, exception handling看你用沒有用了。
1.3 Code Generation 把Calling convention用__stdcall,其余不管了(記得STD_CALL嗎);
1.4 Customize 沒有什么可說的,我一般是function-level linking,因為加了GF選項,Eliminate duplicate strings我也就不選了;
1.5 Listing Files 就Listing file type可說一下。你要想看匯編代碼的話,可以在這里改改;
1.6 Optimizations checked自然是disable了,free的,我選是Full optimization和Frame_Popinter Omission,以及Only __inline,其實這看個人了;
1.7 Precompiled Headers 這個就不說了,看MSDN吧,默認也可以;
1.8 Preprocessor Preprocessor definitions前面已經說了,重點在Additional include directories上,$(BASEDIR)incddkwdm, $(BASEDIR)incddk, $(BASEDIR)inc, $(BASEDIR)incwin98, ....inc,這是我某個dsw的,所以,BASEDIR的環境變量要設置好,我就順便用DS的工具來start VC,它恰好幫你設置了,當然你也可以直接寫上你的DDK的安裝路徑。找不到include 路徑,會引發一大堆錯誤,比如WDM.H有錯誤等。。。是很多人問的問題;
4、 好了,輪到Link了
4.1 General 選Ignore all default libraries,你可以選上generate map file, map文件有時候很有用的;Checked的當然要選上generate debug info, Link incrementally不選;Objects/library modules,添加wdm.lib等,ntoskrnl.lib好像輸出了諸如sprintf、strcat等一些函數(注1),根據driver可能還要其他的,比如ndis.lib;別忘了Output file name改成yourname.sys,可不是yourname.exe啊;)
4.2 Debug 就checked要改改,選上Debug info,我是選Both formats的;
4.3 Input 重點之一,Additional lib path,$(BASEDIR)libchki386,這是我的一個dsw用的,checked填checked lib的路徑,free填freelib的路徑
4.4 Output 在Entry-point symbol,填DriverEntry,或_DriveEntry@8,一樣;
根據link的輸出來看,Base address應該填0x10000,Stack,Reserve的應該填0x40000,Commit填0x1000;Version Info,自己填吧;
4.5 Project Options,重點,很多選項要直接在這里添加。要添加的包括:
/machine:IX86,CPU相關的
/debug:full,/debugtype:both 根據M$站點的說法,為了使WinDbg能找到你的symbol,這兩是都要的,而且還要單獨用linker來link一次,VC不認/debug:full,free就沒有這個問題了。根據M$的方法,可以這樣:寫個lnk文件,在Post-build step,再link一次,添加link @yourlnk.lnk,這個lnk文件,可以從log文件提取,如果不用WinDbg,就無所謂了;
/driver,Use this linker option to build a Windows NT kernel mode driver,MSDN說的
/IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096,4210 查MSDN
/MERGE:_PAGE=PAGE /MERGE:_TEXT=.text /SECTION:INIT,d,DriverEntry就可以放到INIT section去。
/FULLBUILD
/RELEASE,在文件頭添加checksum
/FORCE:MULTIPLE
/OPT:REF /OPT:ICF /align:0x20 /osversion:5.00 /subsystem:native
特別注意/subsystem:native和/driver不要漏了。
一長串的/ignore可以讓你即使選warning level 4也能通過:D,warning level 4有點變態的:D
其實上面說的大部分是廢話:),大部分選項,你看看build輸出的log文件,就能知道了。這樣你也可以根據你的driver,自己添加一些必要的選項。
越寫越覺得自己無知:(
有什么不對的地方,請指出。
另外還有用個bat文件在VC下build的方法等,不多說了。
注1:2003的DDK帶了個ntstrsafe.h,有一些很方便的string函數可以用,而且保證安全,在NT、2K也可以用的,我把它貼上來。用ntoskrnl輸出的如strcpy等函數現在就沒有必要了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -