開發環境: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 .