VC6.0 + WDK 7600.16385.1 開發環境配置

之前用着VisualDDK挺爽的,可以直接用VS來調試,但是隻支持Visual2005以上版本,另外對VS2008中文旗艦版的支持不好,被迫無奈我下了個VS2010。無可置疑Visual DDK用起來真的挺爽的,起碼能省去配置環境的時間。另外,搭配Visual KD雙機調試,速度比用傳統的串口調試速度快多了。

今天,想用VC6.0來寫下驅動代碼,VC6.0畢竟小巧靈活點,但奈何VisualDDK不大支持。好吧,只得自己配置一下環境了。參考了下網上其他的文章,結合自己的實踐、理解終於搞定了。

VC6.0 + WDK 7600.16385.1,這裏主要是爲了開發XP下的NT式驅動程序,我這裏就主要測試了這個,其他的類似。

 

1.       安裝好VC6和WDK,先後順序無關。

 

從開始菜單找到WDK的程序目錄(Windows Driver Kits),進入相關的編譯環境,這裏選擇“Windows XP Checked Build Environment”,輸入命令"build",此時WDK將會把自己進行編譯,大約需要1分鐘。

 

2.       VC6設置Include/Lib/Executable目錄。

 

進入 菜單欄-->工程-->選項-->目錄

 

PS:設置爲自己需要編譯的平臺的各個目錄即可, Include要確保找到ntddk.h等,Lib與Include對應,Executable 要確保能找到cl.exe等。

 

例如XP平臺下設置爲:

“Include Files”包含部分:

D:\WinDDK\7600.16385.1\inc\ddk
D:\WinDDK\7600.16385.1\inc\api
D:\WinDDK\7600.16385.1\inc\crt

嗯,還是說下吧CRT是C Runtime Library的簡寫

“Library Files”包含部分:

D:\WinDDK\7600.16385.1\lib\wxp\i386
D:\WinDDK\7600.16385.1\lib\Crt\i386

PS:這裏選擇自己平臺的庫吧,WXP表示XP的,I386是CPU架構。

“可執行文件”包含部分:

D:\WinDDK\7600.16385.1\bin\x86\x86

注意,將剛纔添加的這些目錄要將其移動最前面,按圖示的上箭頭就行了,否則可能會出現各種問題。


 

 

3.       保存配置,現在給這個空工程建一個c文件,複製以下內容:

 

要是一個個改,要改的地方不少,我們就來直接點吧。嗯,說明下,下面的配置的是調試版本Check。

 

清空C/C++和Link下面的Option文本框,按下面的填寫。

 

C/C++選項的Option填寫:

/nologo /Gz /MLd /W3 /WX /Z7 /Od /DWIN32=100 /D _X86_=1 /D WINVER=0x500 /D DBG=1 /Fo"MyDriver_Check/"/Fd"MyDriver_Check/" /FD /c

說明:

  /nologo:表示不顯示編譯的版權信息

  /Gz:默認函數調用採用標準調用方式,即__stdcall

  /W3: 採用第三級的警告模式。

  /WX: 將警告信息變成錯誤信息,最大程度地保證了代碼的可靠性。代碼運行在內核模式裏,沒有差錯機制,出錯就會藍屏,這個選項很有必要。

  /Z7:用C7模式產生調試信息。VC默認的Program Database for “Edit & Continue” 和link的/driver 選項衝突。

  /Od:關閉調試模式。驅動程序不需要像Win32的應用程序那樣用VC調試器調試,需要用內核調試器才能調試。

  /D WIN32=100 /D _X86_=1 /D WINVER=0x500 /D DBG=1:定義一些宏,必需的。

  /Fo"MyDriver_Check/":設置中間代碼的生成路徑。

  /Fd"MyDriver_Check/":設置pdb文件的目錄位置。pdb文件包含了大量的符號,對調試驅動程序的時候很有幫助。

  /FD:生成文件依賴。

  /c:只進行編譯,而不連接。


LINK選項的Option填寫:

 

NT式驅動:

ntoskrnl.libhal.lib usbd.lib /nologo /base:"0x10000" /stack:0x400000,0x1000/entry:"DriverEntry" /incremental:no/pdb:"MyDriver_Check/Driver1.pdb"/map:"MyDriver_Check/Driver1.map" /debug /machine:I386 /nodefaultlib/out:"MyDriver_Check/Driver1.sys" /subsystem:native /driver/SECTION:INIT,D   /IGNORE:4078

說明:

  ntoskrnl.lib hal.lib usbd.lib:qudong 驅動程序需要鏈接的庫文件。根據需要增減。

  /nologo:表示不顯示鏈接的版權信息。

  /base:"0x10000":加載驅動程序的基址。

  /stack:0x400000,0x1000:設定使用的堆棧大小。

  /entry:"DriverEntry":入口函數的地址,此函數必須是符號標準函數調用的。

  /incremental:no:非遞增式的鏈接。

  /pdbtype:sept 選項可以使得調試信息各自保存在各自的PDB文件中,這樣可以加快鏈接速度,不利的是調試信息分散,調試時需要多個PDB文件。[可選]

  /pdb:"MyDriver_Check/Driver1.pdb":設置pdb文件的文件名。

  /map:"MyDriver_Check/Driver1.map":設置map文件的文件名。[可選]

  /debug:以Deubg方式鏈接。

  /machine:I386:產生的代碼是386兼容平臺的。

  /nodefaultlib:不使用默認庫。

  /out:"MyDriver_Check/Driver1.sys":輸出的最終程序的名稱。

  /subsystem:native:子系統是內核系統。

  /driver:編譯驅動程序。

  /SECTION:INIT,D:將INIT的段設置爲可拋棄的。

  /IGNORE:4078:忽略4078號警告錯誤。



WDN式驅動:

ntoskrnl.libhal.lib usbd.lib /nologo /base:"0x10000" /stack:0x400000,0x1000/entry:"DriverEntry" /subsystem:console /incremental:no /pdb:"MyDriver_Check/Driver1.pdb"/debug /machine:I386 /nodefaultlib /out:" MyDriver_Check/Driver1.sys"/subsystem:native /driver /SECTION:INIT,D /IGNORE:4078


 

4.       保存配置,測試。以NT式驅動爲例。

 

現在給這個空工程建一個c文件,複製以下內容:

#include<ntddk.h>
NTSTATUSDriverEntry(
        IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath
        )
{
        NTSTATUS status = STATUS_UNSUCCESSFUL;
        return status;
}  


如果是CPP文件,則拷貝下面這段:

#ifdef__cplusplus
extern"C"
{
#endif
#include<NTDDK.h>
#ifdef__cplusplus
};
#endif
extern “C” NTSTATUSDriverEntry(
        IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath
        )
{
        NTSTATUS status = STATUS_UNSUCCESSFUL;
        return status;
}  
 

編譯通過則配置成功!!!



編譯通過後,在程序源代碼目錄的MyDriver_Check\子目錄下會生成相關的驅動程序



每次新建工程都得重新配置,但可以配置好一個工程,以後寫代碼,拷貝這個工程,然後在上面做修改。

 

至此,配置完成。



發佈了28 篇原創文章 · 獲贊 27 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章