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

epluguo發表於2013-08-01

之前用著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\子目錄下會生成相關的驅動程式



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

 

至此,配置完成。



相關文章