另一種vc編譯驅動方法

2021-05-02 12:06:35 字數 3396 閱讀 5259

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

以上的設定大部分都可以儲存在vc工程檔案(*.dsp)裡,除了設定的include路徑,lib路徑和編譯器路徑,這些路徑是全域性的,在開啟另一些工程也會留下了,就會給編譯應用程式帶來麻煩,還需要乙個乙個改回去,而目錄切換器就是為了快速切換這些路徑而開發的。

另一種尊重

上中學的時候,有一節課印象非常深刻。老師問我們如果無意闖入乙個房間,發現房間裡有一位女士正在洗澡,這時應該怎麼辦?有同學回答就當什麼也沒看見,退出房間。還有同學回答 說聲對不起!女士。然後退出去。老師笑了笑說,還有更好的答案,那就是 對不起,先生!有一對結婚多年的夫妻,有一次出差在外的妻子有一件急事...

另一種勝利

另一種勝利 written by allen lee 剛才我的扣殺,出界了5.3厘公尺。雖然很可惜,但還是出界了,請確認下吧。幹 真是的,那些任性的傢伙!但是,到最後還只顧自己網球原則的正直笨蛋,和一定要用迴旋蛇標打中單人區的笨蛋,給我們看了場好比賽啊。龍崎 海棠和幹他們雖然輸了這場比賽,但他們堅持...

另一種字元裝置驅動程式

前一種字元裝置驅動程式 之前通過register chrdev 0,hello hello fops 註冊字元驅動程式,乙個主裝置號下的所有裝置 major,0 major,255 都對應hello fops。另一種字元裝置驅動程式 實現函式 自動分配主裝置號,只有 major,0 和 major,...