分享
 
 
 

在VisualStudio98 中 直 接 构 造NT kmode 驱 动 程 序

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在VisualStudio98 中 直 接 构 造NT kmode 驱 动 程 序

深 圳 迪 瑞 计 算 机 技 术 有 限 公 司

蒋 宗 文

---- 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), 但 大 部 分 是 我 自 己 的 工 作 经 验, 希 望 对 大 家 有 所 帮 助.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有