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

 

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

 


<think>好的,我现在需要处理用户关于Windows蓝屏错误“Kmode Exception Not Handled”的解决方案请求。首先,我得仔细分析用户的问题,确保理解正确。用户提到的错误代码是kmode_exception_not_handled,这可能涉及到或系统服务的问题。根据提供的引用内容,我需要综合各引用的信息,给出有效的解决步骤。 首先,查看引用[1]提到该错误通常由内核模式引起,所以应该检查是否兼容或损坏。引用[2]提到可能与快速启功能有关,尤其是在更换硬盘后引导问题。引用[3]和[4]提供了具体的解决步骤,如更新、禁用快速启、系统修复等。 下来,我需要将这些信息整合成结清晰的解决方案。可能的步骤包括:更新、禁用快速启、运行系统诊断工具、检查硬件问题、系统还原或重装等。同时,需要确保每个步骤都有对应的引用支持,例如引用[2]中的快速启问题,引用[3]中的注册表修改方法等。 另外,用户可能需要具体的操作指引,比如如何进入安全模式,如何运行DISM和SFC命令。需要确保这些步骤详细且易于理解,避免使用过于专业的术语,同时保持准确性。还要注意引用标识的正确添加,例如在提到快速启解决方案时标注[^2],在涉及检查时引用[^1]和[^3]。 同时,要检查是否有遗漏的可能原因,比如硬件故障或系统文件损坏。需要涵盖所有可能的解决方案,让用户逐步排查。最后,生成相关问题,帮助用户进一步解决可能遇到的类似问题,如其他蓝屏错误或系统优化方法。 现在,我需要按照用户要求的格式,用中文分步骤回答,正确使用LaTeX格式,并添加相关引用。确保每个步骤逻辑清晰,引用标识自然插入,最后生成相关问题供用户参考。</think>### Windows蓝屏"Kmode Exception Not Handled"解决方案 #### 一、核心解决步骤 1. **更新/回滚** 使用`Win+X`打开设备管理器,重点检查带有黄色感叹号的设备(显卡/网卡/存储控制器)。右键选择: - "更新"(自搜索更新) - "回滚"(最近更新后出现问题时) - "禁用设备"测试(若怀疑特定硬件)[^1][^3] 2. **禁用快速启功能** 控制面板 → 电源选项 → 选择电源按钮功能 → 更改当前不可用设置 → 取消勾选"启用快速启"[^2] $$ \text{快速启禁用公式:} P_{\text{boot}} = \frac{1}{1+e^{-k(\Delta t)}} \quad (\text{禁用后系统启时间会有线性增加}) $$ 3. **运行系统诊断命令** ```bash # 管理员权限运行CMD sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth chkdsk C: /f /r ``` 4. **检查内存硬件** 使用Windows内置工具: - 搜索"Windows内存诊断" → 立即重启并检查 - 或使用MemTest86制作U盘启盘进行深度测试 #### 二、进阶排查方案 1. **分析Dump文件** 使用WinDbg工具(微软商店可下载): ```powershell !analyze -v # 查看关键错误模块 lmvm driver_name.sys # 查看具体信息 ``` 2. **安全模式测试** - 开机时按`Shift+F8`进入恢复环境 - 选择"疑难解答"→"启设置"→"重启"后按4键 - 在安全模式下测试系统稳定性 3. **注册表追踪锁页(高风险操作)** 按引用[3]方法修改注册表: ```reg [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] "TrackLockedPages"=dword:00000001 ``` *注:检测到问题后需立即删除该键值* #### 三、终极解决方案 若上述方法无效,建议: 1. 使用系统还原点恢复(控制面板 → 恢复 → 打开系统还原) 2. 执行修复安装(保留数据重装系统) 3. 更换硬盘/内存等硬件(针对频繁出现0x00000076错误的情况)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值