VC6編譯驅動的方法 含32和64位

2021-04-30 19:52:14 字數 3789 閱讀 7979

vc6只是乙個ide,可以方便的呼叫編譯器,鏈結器,標頭檔案,庫檔案,如果編輯和編譯驅動能整合在一起,這樣可以提高開發效率。

對於普通的win32應用程式,vc6已經預設支援了,而對於驅動程式沒有設定好的工程嚮導。其實驅動程式也就是乙個sys,是通過c語言寫成,所以編譯它理論上沒有問題,只是在實際操作上有點麻煩。

下面就來說明一下各種平台編譯sys驅動的方法(包括64位平台)

先看32位版本驅動的編譯方法,首先你得準備一些編譯必備工具:

1.要安裝vc6

2.安裝ddk(裝哪個呢?這個問題其實很簡單的,只是很多人不明白,裝ddk當然是越新越好了,越新支援的平台越多,像2000ddk你是絕 對編譯不出來64位sys的,因為它沒帶64位的庫和編譯器,所以我們選擇現在最比較新的,2003ddk(wdk也可以),支援的平台很 多,amd64,ia64,2000,xp,2003都支援)。

好了,這下我們的系統已經安裝了最強的開發工具vc6,最新ddk,在vc裡編譯各個平台的驅動都沒有問題了!

開始,假設我們的ddk裝在

c:/2003ddk 目錄,那麼我會發現裡面有很多驅動的例子(安裝的時候全選),我們選擇c:/2003ddk/src/wdm/usb/bulkusb作為我們的實驗範例。

第一步:

開啟vc,建立乙個

an empty project (我用英文版的vc,建議你也換成英文版的),意思就是建立乙個空的win32工程,工程名字就叫bulkusb,點finish.

第二步:

將c:/2003ddk/src/wdm/usb/bulkusb/sys(這裡是驅動**,另乙個exe裡是使用者程式,不管它)裡的所有檔案拷貝到bulkusb工程目錄下。然後把.h,.c,.rc 匯入到vc裡對應的目錄裡面去。

第三步:

然後就是開始設定工程選項,把這些**編譯成sys了。 要編譯我們需要ddk,所以先要在vc的tool->options->directories裡設定一些路徑給vc呼叫(設定基本原則:要保證下面所有設定的路徑排在前面)。

設定include路徑:

c:/2003ddk/inc

c:/2003ddk/inc/crt

c:/2003ddk/inc/wnet

c:/2003ddk/inc/ddk/wnet

c:/2003ddk/inc/ddk/wdm/wnet

要按這樣的順序新增。注意這裡的wnet目錄了嗎? 這就是2003最新標頭檔案,其實選擇wxp或者w2k目錄也是可以的,只是wnet裡的標頭檔案最全,因為系統不斷進步,有些新的api只有新的標頭檔案裡才 有定義。當然最好是選擇對應的標頭檔案來編譯對應系統的驅動,但是我試過用wnet編譯的驅動在2000下也能用,因為我們一般用不到那些新新增的 api.。

設定lib路徑:

c:/2003ddk/lib

c:/2003ddk/lib/crt/i386

c:/2003ddk/lib/wnet/i386

//wnet 道理和上面一樣

設定executable file:

c:/2003ddk/bin/x86

// 這就是

編譯器的路徑,包含 cl.exe,link.exe的目錄,由於我們要編譯32位驅動,所以把這個新增進去,放在第一項。

總的來說,只要設定好include,lib和編譯器,編譯什麼檔案都沒問題的,你也可以自己嘗試安裝最新的2003sdk,編譯win32應用程式成64位。

第四步:

開始進入工程設定,先設定c/c++,在preprocesser definitions裡輸入如下字串:

release下輸入:

_x86_=1,i386=1,std_call,win32=100,_win32_winnt=0x0501,winver=0x0501,ndebug

debug下輸入:

_x86_=1,i386=1,std_call,win32=100,_win32_winnt=0x0501,winver=0x0501,_debug

在code generation裡的calling convention用

__stdcal l,(這是驅動程式必須的)

debug版有個特殊編譯選項/gz(注意是大寫的,小寫的不要刪!)

刪掉,否則有鏈結錯誤,chkesp鏈結不上什麼的。

第五步:

開始設定link頁,將輸出檔名改為sys副檔名,

在general的object/library modules, 填入驅動所呼叫到的幾個lib:

ntoskrnl.lib hal.lib usbd.lib wmilib.lib 。

然後進入output在entry-point symbol:

填 driverentry

下面就是往project options

/machine:ix86 /driver /subsystem:native /section:init,d /ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221

刪除如下選項:

/subsystem:windows

/machine代表目標機器型別,/driver代表驅動,/subsystem:native 也是代表驅動。

ok,大功告成,我們可以編譯32位驅動了!

那麼如果我們要編譯

64位驅動呢? 這裡大家注意一下,64位有兩種,乙個是amd64,乙個是ia64,要選定你的目標平台,目前amd64平台最為流行.

其實編譯成64位也很簡單,只要把32位的配置稍微改一下就行了,我們以編譯amd64位驅動為例(你會複製vc的工程 configurations吧,把32位的relase,debug各複製乙份改名為releaseamd64和debugamd64,然後在複製品的 基礎上修改):

1.要修改兩個lib路徑:

c:/2003ddk/lib/crt/i386改為:

c:/2003ddk/lib/crt/amd64

c:/2003ddk/lib/wnet/i386 改為:

c:/2003ddk/lib/wnet/amd64

2.修改編譯器路徑:

c:/2003ddk/bin/x86

改為:c:/2003ddk/bin/win64/x86/amd64

c:/2003ddk/bin/x86          //這句也要存在

3.修改c/c++裡的preprocesser definitions為:

releaseamd64下輸入:

_amd64_,amd64,std_call,win32=100,_win32_winnt=0x0501,winver=0x0501,ndebug

debugamd64下輸入:

_amd64_,amd64,std_call,win32=100,_win32_winnt=0x0501,winver=0x0501,_debug

4.需要修改link頁裡的project options,手動改一下:將/machine:ix86改為:

/machine:amd64

5.理論上到這裡設定就ok了,不過還是有乙個鏈結錯誤unresolved external symbol __security_cookie ,只要在鏈結的lib裡加入

bufferoverflowk.lib (為什麼是bufferoverflowk.lib?看這裡:http://support.microsoft.com/kb/894573) 就可以了。

另外,本人為了方便切換vc6的標頭檔案庫檔案路徑而開發了乙個小工具:vc6目錄切換器

VC6編譯驅動的方法 含32和64位

本來用系統自帶的build命令編譯 後來發現windows驅動開發技術詳解上說用vc6可以編譯,一直操作到了最後,一編譯居然發現沒有編譯通過,於是在網上google了下,發現了別人的方法,看到中間的步驟就發現出問題來了,書中的是拿win2k的ddk做例子,可是裝的xp的ddk是編譯有問題的,暈,問題...

VC6編譯驅動的方法 含32和64位

vc6只是乙個ide,可以方便的呼叫編譯器,鏈結器,標頭檔案,庫檔案,如果編輯和編譯驅動能整合在一起,這樣可以提高開發效率。對於普通的win32應用程式,vc6已經預設支援了,而對於驅動程式沒有設定好的工程嚮導。其實驅動程式也就是乙個sys,是通過c語言寫成,所以編譯它理論上沒有問題,只是在實際操作...

VC6 編譯選項問題

為了能將原始檔編譯成dll目標 以前總以為是要設定 mt,md mt d,md d.那麼在link命令列中有 1 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.li...