|
我使用的是WinXP SP1+DS3.2+XP DDK+VC6.0英文版,以下為DS3.2版本的安裝過程:
個星期前郭老師給我布置了一項任務(wù):開發(fā)我們自己設(shè)計的一塊板子的PCI設(shè)備驅(qū)動,并給我指出了方向,具體說就是“三步走”戰(zhàn)略: (1)入門。熟悉基于DriverStudio開發(fā)環(huán)境的設(shè)備驅(qū)動開發(fā),同時側(cè)面了解PCI設(shè)備驅(qū)動程序的相關(guān)知識。 (2)進(jìn)階。運用純DDK進(jìn)行驅(qū)動開發(fā),著重于學(xué)習(xí)別人的實例,并能熟練進(jìn)行調(diào)試和修改。 (3)實戰(zhàn)。深入研究PCI總線標(biāo)準(zhǔn),結(jié)合具體的電路板特性開發(fā)出一套自己的設(shè)備驅(qū)動。 現(xiàn)在正在入門階段的初級,總結(jié)一下近一周以來的WINDOWS驅(qū)動程序開發(fā)學(xué)習(xí)過程中的經(jīng)驗:
我目前使用的開發(fā)環(huán)境是:WINDDK\2600 + Visual Studio 6.0 + Compuware\DriverStudio 3.2
(前兩者安裝順序不限,DriverStudio要最后安裝)。
參考的主要入門書是:《Windows 2000/XP WDM 設(shè)備驅(qū)動程序開發(fā)(第二版)》武安河 編著
-----------------------------------------
學(xué)習(xí)中遇到的問題和解決方法:
(1)拿到附書代碼,運行出了第一個驅(qū)動程序CharSample,步驟如下:先雙擊代碼光盤提供的注冊表導(dǎo)入文件
Windows2K-XP.reg,然后運行DriverStudio自帶的EzDriverInstaller工具,打開sys目錄下的驅(qū)動安裝配置文件
CharSample.inf,然后Add New Device,提示需要.sys驅(qū)動系統(tǒng)文件,找到sys\objchk\i386目錄下的
CharSample.sys文件,確定后將提示The Driver Loaded Successfully!(如果報錯,而且設(shè)備前帶!號,一般是因為忘記導(dǎo)入注冊表了)
如此安裝好驅(qū)動以后,就可以運行exe\objchk\i386目錄下的應(yīng)用程序Test_CharSample.exe進(jìn)行測試了!
(2)運行成功后,重新編譯時卻總出現(xiàn)錯誤,編譯不過去!
錯誤是:
fatal error LNK1181: cannot open input file "......\DriverStudio\DriverWorks\lib\I386\checked\vdw_wdm.lib" 通過網(wǎng)上學(xué)習(xí)和交流找到答案:原來是因為配置開發(fā)環(huán)境時,漏掉了如下一個步驟:
編譯......\Compuware\DriverStudio\DriverWorks\source目錄下的工程得到vdw_wdm.lib文件!
編譯時,注意用VC打開工程文件后,有兩個工程,要先將VdwLibs工程設(shè)為當(dāng)前Active Project,然后在工具欄上單擊右鍵選擇“組建”,在彈出的編譯工具欄中配置一下編譯平臺的設(shè)置:選擇Win32 WDM Checked平臺(因為我們用的XP),然后編譯就應(yīng)該可以了,但是還有可能出現(xiàn)編譯錯誤:
fatal error C1083: Cannot open include file: 'warning.h': No such file or directory
為啥呢?因為沒有選擇DDK環(huán)境,此時應(yīng)該在DriverStudio菜單-》DDK Build Setting...中選擇我們先前安裝的DDK的目錄,我安裝的目錄是C:\WINDDK\2600,這樣就可以編譯通過了!
編譯完后會在"......\DriverStudio\DriverWorks\lib\I386\checked\"目錄下生成vdw_wdm.lib文件,做完這些后在去編譯自己編寫的驅(qū)動程序工程就不會有上面所列的錯誤了!
當(dāng)然,也有可能會出現(xiàn)這樣的編譯錯誤:fatal error C1051: program database file, '......\compuware\driverstudio\driverworks\source\obj\i386\wdmchecked\vdw_wdm.pdb', has an obsolete format, delete it and recompile
不過編譯器提示的應(yīng)該夠清楚了,只要把連接目錄下的文件刪除再編譯一次就可以了!
(3)用向?qū)陆ㄒ粋€驅(qū)動工程,進(jìn)行編譯會產(chǎn)生如下錯誤:
Linking with DDK linker...
LINK : fatal error LNK1181: cannot open input file 'ntstrsafe.lib'
Error executing link.exe.
因為這個文件在xpddk里面是沒有的,在2003 ddk里面有,拷貝一個過來就可以了,或者在工程-》設(shè)置-》連接選框中把ntstrsafe.lib這個連接項去掉(它與source文件有對應(yīng)關(guān)系,在source文件中把這個庫的鏈接去掉也可以)
在工程中的sources文件里邊,找到下面一行:
TARGETLIBS=$(DDK_LIB_PATH)\ntstrsafe.lib $(DDK_LIB_PATH)\csq.lib
直接刪除即可。有時候還會提示沒有ntstrsafe.h,#include<ntstrsafe.h>出錯,把它注釋掉即可。
(4)在重新編譯武安河這本書中DMASample這個示例程序時,出現(xiàn)了一個錯誤:
fatal error C1189: #error : Compiler version not supported by Windows DDK
這個錯誤是在前面幾個例子中不曾遇到的,原因在于wdm.h文件中有一個條件編譯語句
#if _MSC_VER < 1300
#error Compiler version not supported by Windows DDK
#endif
而VC6對應(yīng)的_MSC_VER(與版本有關(guān))為1200,因此提示如上錯誤
解決此問題是通過運用DDK sources to vcproj Converter工具把驅(qū)動工程的sources文件轉(zhuǎn)換成對VC6相適應(yīng)而解決的。
(5)關(guān)于調(diào)試。調(diào)試方法很多,一般都用DbgPrint。
check和free的區(qū)別。簡單地說,check相當(dāng)于debug,free相當(dāng)于release,前者是調(diào)試版本,后者是發(fā)布版本。你可以使用以下語句實現(xiàn)僅在check版本中輸出調(diào)試語句:
#if dug
#define dprintf DbgPrint
#else
#define dprintf(x)
#endif
然后使用dprintf代替DbgPrint。
調(diào)試工具。ds自帶的softice,DriverMonitor,等。此外,Dbgview和DriverMonitor類似,可以從網(wǎng)上下載到的。Dbgview和DriverMonitor可以看到DbgPrint的字符串。
轉(zhuǎn)換為vc工程。開始--程序--Compuware DriverStudio--develop--DDK sources to vcproj Converter,即可轉(zhuǎn)換。
編譯應(yīng)用程序時盡量用DDK編譯,不要用VC自帶的Build,否則生成的應(yīng)用程序會提示錯誤!
|
|
|