Visual Studio 2010 編譯驅動程序

開發環境:Win7 + VS2010安全

目標平臺:XPEcookie

 

一.用VS2010建立一個「空項目」:(「Visual C++」 -> 「常規」 -> 「空項目」) 多線程

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

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

在Include目錄中添加:spa

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 .

相關文章
相關標籤/搜索