Visual Studio 2010 編譯驅動程序

開發環境:Win7 + VS2010

目標平臺:XPE

 

一.用VS2010創建一個“空項目”:(“Visual C++” -> “常規” -> “空項目”)

二.將編寫好的源代碼文件導入項目中

三.修改VS2010的IDE 設置,添加支持驅動程序編譯鏈接的頭文件和庫文件

在Include目錄中添加:

D:\WinDDK\7600.16385.1\inc\wxp
D:\WINDDK\7600.16385.1\inc\crt (可選)
D:\WINDDK\7600.16385.1\inc\ddk\wxp
D:\WINDDK\7600.16385.1\inc\ddk\wdm\wxp

在Lib目錄中添加:

D:\WINDDK\7600.16385.1\lib\wxp\i386

 

四.修改項目屬性。

將項目屬性依次修改爲:

 

“配置屬性”->“C/C++” -> “常規”:

調試信息格式:C7 兼容(/Z7)

 

“配置屬性”->“C/C++” -> “預處理器”:

預處理器定義:WIN32=100;_X86_=1;WINVER=0x501;DBG=1

( WINVER = 驅動運行的Windows版本: 0x500 = win2000 , 0x501 = winxp 0x502 = win2003
_X86_ 表示 32位系統,_AMD64_ 表示64位系統 ,_IA64_ 表示intel 安騰 64位系統
DBG=1 表示創建調試版本的驅動 )

( 編譯2000的NDIS驅動時增加:BINARY_COMPATIBLE=0;NDIS40_MINIPORT=1;NDIS40=1;NDIS_MINIPORT_DRIVER=1 )
( 編譯XP,2003的NDIS驅動時增加:BINARY_COMPATIBLE=0;NDIS51_MINIPORT=1;NDIS51=1;NDIS_MINIPORT_DRIVER=1 )
( 如果項目有 source 文件,那麼該文件的 C_DEFINES 字段會說明此項目編譯時需要預定義的標識符 )
( 有時候有些問題,比如未聲明的標識符,或者標識符的類型不對,或者結構沒有成員之類的問題,這時需要看具體源碼中的一些定義是不是被條件編譯指令 #if 屏蔽,如果是,增加一些定義項目再嘗試編譯 )

忽略標準包含路徑:是 ( 設置爲此值時,必須加入項目需要的所有頭文件所在的目錄,參看第三步的內容,這樣項目就不會依賴IDE環境的設置 )
否 ( 設置爲此值時,將依賴 IDE 的環境的相關設置 )

 

“配置屬性”->“C/C++” -> “代碼生成”:

啓用最小重新生成:否

基本運行時檢查:默認值

運行時庫:多線程調試(/MTd) 或 多線程(/MT)

緩衝區安全檢查:否 (可避免出現 LINK : error LNK2001: 無法解析外部符號 __security_cookie)

 

“配置屬性”->“C/C++” -> “高級”:

調用約定:__stdcall (/Gz)

 

“配置屬性”->“鏈接器” -> “常規”:

輸出文件:$(OutDir)\$(ProjectName).sys

啓用增量鏈接:否(/INCREMENTAL:NO)

忽略導入庫:是 ( 設置爲此值時,必須在附加庫目錄中加:D:\WINDDK\3790.1830\lib\wxp\i386 ,這樣項目就不會依賴IDE環境的設置 )
否 ( 設置爲此值時,將依賴 IDE 的環境的相關設置 )

 

“配置屬性”->“鏈接器” -> “輸入”:

附加依賴項:ntoskrnl.lib Hal.lib wdm.lib wdmsec.lib wmilib.lib ndis.lib MSVCRT.LIB LIBCMT.LIB
( HalXXX函數在Hal.lib,WmiXXX函數在 wmilib.lib ,NdisXXX函數在 ndis.lib )
( 必要時需要增加微軟的標準庫 MSVCRT.LIB MSVCRTD.LIB(調試庫) LIBCMT.LIB LIBCMTD.LIB(調試庫) )
( 如果源碼中有 source 文件,那麼該文件的 TARGETLIBS 字段會列出該項目需要的庫 )

忽略所有默認庫:是(/NODEFAULTLIB)

 

“配置屬性”->“鏈接器” -> “清單文件”:

啓用用戶帳號控制UAC:否

 

“配置屬性”->“鏈接器” -> “調試”:

生成映像文件:是(/MAP)

映像文件名:$(TargetDir)$(TargetName).map

 

“配置屬性”->“鏈接器” -> “系統”:

堆棧保留大小:4194304

堆棧提交大小:4096

驅動程序:驅動程序(/DRIVER)

 

“配置屬性”->“鏈接器” -> “高級”:

入口點:DriverEntry

設置效應和:是(/RELEASE)

基址:0x10000

隨機基址:默認值

數據執行保護(DEP):默認值

 

“配置屬性”->“鏈接器” -> “命令行”->“附加選項”:

添加開關:/SECTION:INIT,D /IGNORE:4078 /safeseh:no
可以避免以下錯誤提示
LINK : warning LNK4078: 找到多個“INIT”節,它們具有不同的屬性(E2000020)
LINK : error LNK2001: 無法解析的外部符號__load_config_used

 

五.編譯,鏈接。

 

本人按照以上設置成功編譯鏈接 Windows XP,並安裝成功

一些要修改DDK例子源碼方能成功的問題,目前不知道什麼選項可以不改:
源碼中的關鍵字 try 要改爲 __try , except 要改爲 __except .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章