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作為我們的實驗範例。
第一步:
第二步:
將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用__stdcall,(這是驅動程式必須的)
debug版有個特殊編譯選項 /gz (注意是大寫的,小寫的不要刪!)刪掉,否則有鏈結錯誤,chkesp鏈結不上什麼的。
第五步:
開始設定link頁,將輸出檔名改為sys副檔名,
在general的object/library modules, 填入驅動所呼叫到的幾個lib:
ntoskrnl.lib hal.lib usbd.lib wmilib.lib。
然後進入output在entry-point symbol:
填driverentry
/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?看這裡: 就可以了。
另外,本人為了方便切換vc6的標頭檔案庫檔案路徑而開發了乙個小工具:vc6目錄切換器
VC6編譯驅動的方法 含32和64位
vc6只是乙個ide,可以方便的呼叫編譯器,鏈結器,標頭檔案,庫檔案,如果編輯和編譯驅動能整合在一起,這樣可以提高開發效率。對於普通的win32應用程式,vc6已經預設支援了,而對於驅動程式沒有設定好的工程嚮導。其實驅動程式也就是乙個sys,是通過c語言寫成,所以編譯它理論上沒有問題,只是在實際操作...
VC6編譯驅動的方法 含32和64位
本來用系統自帶的build命令編譯 後來發現windows驅動開發技術詳解上說用vc6可以編譯,一直操作到了最後,一編譯居然發現沒有編譯通過,於是在網上google了下,發現了別人的方法,看到中間的步驟就發現出問題來了,書中的是拿win2k的ddk做例子,可是裝的xp的ddk是編譯有問題的,暈,問題...
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...