• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 在VisualStudio98中直接構造NT kmode驅動程序

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    深圳迪瑞計算機技術有限公司蔣宗文 ---- Microsoft VisualStudio98 是 一 個 功 能 強 大 的C 和C++ 程 序 開 發 環 境, 其 中 有 幾 項 功 能 我( 相 信 也 是 廣 大C 和C++ 程 序 員 們) 特 別 喜 歡: 彩 色 句 法 敏 感, 源 代 碼 瀏 覽, 類 和 文 件 瀏
    深圳迪瑞計算機技術有限公司  蔣宗文

    ---- Microsoft VisualStudio98 是 一 個 功 能 強 大 的C 和C++ 程 序 開 發 環 境, 其 中 有 幾 項 功 能 我( 相 信 也 是 廣 大C 和C++ 程 序 員 們) 特 別 喜 歡: 彩 色 句 法 敏 感, 源 代 碼 瀏 覽, 類 和 文 件 瀏 覽, 直 接 定 位 語 法 錯 誤 等 等.

    ---- 然 而, 這 么 好 的 工 具, 卻 讓 很 多NT kmode 驅 動 程 序 開 發 者 非 常 惱 火, 因 為 她( 他) 并 不 能 直 接 使 用VS98. MS 所 提 供 的 是 一 個 史 前 的 難 用 的 命 令 行 工 具build! 不 必 說build 運 行 時 產 生 的 許 多 令 人 精 神 錯 亂 的last line incomplete, 最 麻 煩 的 是 改 錯 以 及 查 找 函 數 的 申 明 和 定 義 了.

    ---- 其 實, build 也 使 用 與VS 同 樣 的 編 譯 和 連 接 器, 對VS 稍 做 定 制, 我 們 就 可 以 從 上 述 惡 夢 中 醒 來.

    ---- 1. 創 建kmode 項 目:

    ---- 從VS98 中 選 擇File/New 菜 單 項, 然 后 生 成 一 個 新 的Win32 Dynamic-Link Library 項 目.

    ---- 2. 更 改All Configurations 選 項:

    ---- 選 擇Project/Settings/All Configurations, 轉 到C/C++ 標 簽, 作 如 下 改 動:

    2.1在Category "C/C++ Language"中去除Enable exception handling.
        2.2在Category "Code Generation"中選定Calling convention為__stdcall,以
       及Struct member alignment為8-bytes.
        2.3在Category "Precompiled Headers"中設定"Not using...".
        2.4在Category "Preprocessor"中輸入定義_X86_=1,i386=1,STD_CALL=1,
    CONDITION_HANDLING=1,WIN32_LEAN_AND_
    MEAN=1,NT_UP=1,NT_INST=0,WIN32=100,
    _NT1X_=100,WINNT=1,_WIN32_WINNT=0x0400,
    DEVL=1,NDEBUG,_DLL=1,_IDWBUILD,
    DBCS,PRC,KKBUGFIX,DBCS_VERT,FE_SB.
    并增加include目錄d:\ddk\inc
    (如果你安裝DDK時的設定不同于此,請寫你的設定值).

    轉到Link標簽,定制如下:
        2.5在Category "General"中去除Generate debug info并選定Ignore all
        default libaries和Doesn't produce .LIB.在Object/library modules中加上你
       要連接的庫,一般是int64.lib ntoskrnl.lib hal.lib.
        2.6在Category "Custom"中去除Program database復選框.
        2.7在Category "Output"中設定Entry-point symbol為DriverEntry@8.

    轉到Resource標簽,增加d:\ddk\inc到
    include目錄,并定義符號_X86_=1,i386=1,
    STD_CALL,CONDITION_HANDLING=1,
    NT_UP=1,NT_INST=0,WIN32=100,_NT1X_=100,WINNT=1,
    _WIN32_WINNT=0x0400,WIN32_LEAN_AND
    _MEAN=1,DEVL=1,NDEBUG,_DLL=1,_IDWBUILD,
    DBCS,PRC,KKBUGFIX,DBCS_VERT,FE_SB.

    ---- 3. 定 制Win32 Debug 選 項( 即checked build):

    ---- 選 擇Project/Settings/Win32 Debug, 轉 到C/C++ 標 簽, 作 如 下 改 動:

    3.1在Category "General"中選擇Debug info
    為C7 compatible.增加DBG=1,FPO=0,
    RDRDBG,SRVDBG這幾個符號到
    Preprocessor definitions中的符號之前.并在
    Project Options的最后添加
    /GF /QIfdiv- /QIf三個編譯選項.

    轉到Link標簽,定制如下:
        3.2在Category "General"中設定輸出文件為
          Debug\mydriver.sys(你要產生的sys
       文件).然后在Project Options的最后添加/libpath:"d:\ddk\lib\i386\checked"
        /Subsystem:native這兩個連接選項.

    轉到Resource標簽,增加符號定義DBG=1,FPO=0, RDRDBG,SRVDBG.

    ---- 遺 憾 的 是, 不 能 從VS 中 調 試kmode 驅 動 程 序, 這 只 好 等MS 的 改 進 了, 可 是 現 在 我 們 只 好 用 WinDbg. 且 慢, 我 們 不 能 使 用 采 用 剛 才 設 置 的 選 項 連 接 出 來 的.sys 文 件 調 試, 因 為WinDbg 要 求 連 接 時 采 用/Debug:FULL 和/debugtype:both 選 項, 可 是VS98 不 同 時 支 持 二 者( 你 可 以 試 試). 一 種 解 決 辦 法 是 在 連 接 完 成 后 刪 除.sys 文 件, 手 工( 從 命 令 行 上) 運 行link, 那 多 掃 興 哪. 實 際 上VS 可 以 自 動 在 連 接 完 成 后 運 行 一 些 命 令, 只 要 你 轉 到Post-Build step 標 簽 設 置 一 下 就 可 以 了. 我 是 這 樣 設 的:

    link /nologo @mydriver.lnk
    rebase -b 0x10000 -x Debug Debug\mydriver.sys
    if exist Debug\mydriver.dbg del /f Debug\mydriver.dbg
    move Debug\sys\mydriver.dbg Debug
    rd Debug\sys

    ---- 產 生 的 調 試 文 件mydriver.dbg 你 可 記 得 要 拷 貝 到 調 試 控 制 機 的winnt\symbols\sys 目 錄 下 喲. 其 中mydriver.lnk 是 一 個link 命 令 文 件, 內 容 如 下:

    -machine:i386
    -MERGE:_PAGE=PAGE
    -MERGE:_TEXT=.text
    -SECTION:INIT,d
    -OPT:REF
    -INCREMENTAL:NO
    -FORCE:MULTIPLE
    -RELEASE
    -FULLBUILD
    -IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096
    -NODEFAULTLIB
    -debug:notmapped,FULL
    -debugtype:both
    -version:4.00
    -osversion:4.00
    -PDB:NONE
    -MERGE:.rdata=.text
    -optidata
    -driver
    -align:0x20
    -subsystem:native,4.00
    -base:0x10000
    -entry:DriverEntry@8
    -out:Debug\mydriver.sys
    Debug\mydriver.res
    Debug\mydrv1.obj
    Debug\mydrv2.obj
    D:\DDK\lib\i386\checked\int64.lib
    D:\DDK\lib\i386\checked\ntoskrnl.lib
    D:\DDK\lib\i386\checked\hal.lib

    ---- 這 一 長 串 命 令 是 從build.log 中paste 到 的, 有 什 么 疑 惑 可 以 參 考 聯 機 手 冊.

    ---- 現 在 大 部 分 已 經 自 動 化 了, 稍 有 點 不 方 便 的 是 增 加 一 個 源 文 件 時 要 在.lnk 文 件 中 相 應 增 加 一 行.obj, 可 是 世 上 不 如 意 事 所 在 多 有, 那 也 無 可 如 何 了. 好 在 你 不 會 頻 繁 增 加 源 文 件 吧.

    ---- 4. 定 制Win32 Release 選 項( 即free build), 就 簡 單 多 了.

    ---- 選 擇Project/Settings/Win32 Release, 轉 到C/C++ 標 簽, 作 如 下 改 動:

    4.1在Category "General"中選擇Debug info
    為None.增加FPO=1到Preprocessor
        definitions中的符號之前.然后選擇你喜歡的優化方法.

    轉到Link標簽,定制如下:
        4.2在Category "General"中設定輸出文件為
         Relase\mydriver.sys.然后在Project
        Options的最后添加/libpath:"d:\ddk\lib\i386\free" /Subsystem:native.

    轉到Resource標簽,增加符號定義FPO=1.

    ---- 好, 一 切 設 定 完 成. 增 加 你 的 源 文 件 到Project 之 后, 可 以 按F7( 構 造) 了, 體 會 一 下VS98 這 種 利 器 開 發kmode 驅 動 程 序 的 快 捷 方 便 的 感 覺, 相 信 那 與build 是 大 不 一 樣 的.

    ---- 本 文 有 一 些 部 分 內 容 參 考 了MSDN 的 文 章"The Windows NT Kernel-Mode Driver Cookbook, Featuring Visual C++" 的 說 法( 謝 謝 作 者Ruediger R.Asche), 但 大 部 分 是 我 自 己 的 工 作 經 驗, 希 望 對 大 家 有 所 幫 助. 

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>