我这当了一份资料里有,不过没试过,贴给你看看吧,vc++5.0的代码,也许对你有用:)<br>这 是 一 个Win32 Console Program( 控 制 台 应 用 程 序), 虽 然 运 行 中 看 <br>起 来 很 像DOS 筐 中 运 行 的 实 模 式DOS 程 序, 但 它 是 货 真 价 实 的 运 行<br> 在Ring3 下 的Win32 程 序。 用Visual C + + 5.0 AppWizard 创 建 一 个Win32 <br>Console Program 项 目, 添 加 以 下.CPP 文 件, 编 译 即 可。 <br> <br> #include <br> #include <br> #include <br> #include <br> // 若 无DDK 带 下 划 线 的 可 略 去, <br> 这 些 语 句 演 示 了 调 用VMM/VXD 服 务 <br>DWORDLONG IDTR,SavedGate; <br>WORD OurGate[4]={0,0x0028,0xee00,0x0000}; <br>// 中 断 门 描 述 符 格 式 如 下: <br> <br> <br> <br>DWORD _eax,_ecx,_cr0; <br>WORD vmmver; <br>HVM sysvm; <br> <br>void nothing() <br>{ <br> //Used to test call in Ring0 <br> sysvm=Get_Sys_VM_Handle(); <br>} <br> <br>void __declspec( naked ) Ring0Proc(void) <br> // 中 断 例 程, 运 行 在Ring0 <br>{ <br> _asm{ <br> mov _eax,eax // <br> mov _ecx,ecx // <br> mov eax, CR0 <br> // 测 试Ring3 中 不 能 执 行 的 特 权 指 令 <br> mov _cr0,eax // <br> } <br> VMMCall(Get_VMM_Version); <br> // 调 用VMM 服 务 <br> _asm{ <br> mov vmmver,ax <br> } <br> nothing(); <br> // 测 试 在 运 行 于Ring0 的 <br> 中 断 例 程 中 调 用 子 <br> _asm iretd <br> // 中 断 返 回, 与 在 实 模 式 <br> 编 程 无 本 质 区 别 <br>} <br>void main() // 主 程 序 <br>{ <br> _asm{ <br> mov eax, offset Ring0Proc <br> mov [OurGate], ax // 将 中 断 函 数 的 地 址 <br> shr eax, 16 // 填 入 新 造 的 中 断 门 <br> mov [OurGate +6], ax // 描 述 符 <br> <br> sidt fword ptr IDTR <br> // 将 中 断 描 述 符 表 寄 存 器(IDTR) <br> 的 内 容 取 出 <br> mov ebx, dword ptr [IDTR +2] <br> // 取 出 中 断 描 述 符 表(IDT) 基 地 址 <br> add ebx, 8 *9 <br> // 计 算Int 9 的 描 述 符 应 放 置 的 地 址 选 用 <br> Int9 是 因 为 它 在Win32 保 护 模 式 下 未 占 用 <br> <br> mov edi, offset SavedGate <br> mov esi, ebx <br> movsd // 保 存 原 来 的Int 9 描 述 符 到 <br> movsd //SavedGate 以 便 恢 复 <br> <br> mov edi, ebx <br> mov esi, offset OurGate <br> movsd // 替 换 原 来 的 中 断 门 描 述 符 <br> movsd // 以 安 装 中 断 服 务 例 程 <br> <br> mov eax,0x6200 <br> // 用 以 测 试 放 在EAX 中 的 数 据 <br> 能 否 正 确 传 到Ring0 中 断 <br> mov ecx,0 <br> // 用 以 测 试 放 在ECX 中 的 数 据 <br> 能 否 正 确 传 到Ring0 中 断 <br> mov ecx,0 <br> // 用 以 测 试 放 在ECX 中 的 数 据 <br> 能 否 正 确 传 到Ring0 中 断 <br> // 因 为 很 多VxD 服 务 都 用 <br> 此 二 寄 存 器 传 递 参 数 <br> int 9h <br> // 人 为 触 发 中 断, 平 时 会 出 现 <br> 保 护 错 误 蓝 屏 或 非 法 操 <br> // 作 对 话 框, 现 在 安 装 了 <br> // 中 断 服 务 例 程 后, 就 会 通 过 <br> //VMM 在Ring0 调 用 中 断 服 务 例 程 <br> - -Ring0Proc <br> <br> mov edi, ebx <br> mov esi, offset SavedGate <br> movsd // 恢 复 原 来 的 中 断 门 描 述 符 <br> movsd <br> } <br> cout<<"CR0="<<_cr0< <br> 运 行 结 果: <br> <br> <br> <br>----此 方 法 的 好 处 一 是 回 避 了 奇 特 的VxD <br>文 件 格 式, 不 用 使 用 汇 编 语 言 编 程, 二 是 应 用 程 序 不 用 带 一 个 <br>单 独 的VxD 文 件, 干 净 利 索。 <br>