C Builder的60个编程 2.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C Builder的60个编程 2

C Builder的60个编程资料 2 31、令Win32应用程序跳入系统零层众所周知,在Windows95/98的Win32 on Intel x86体系中利用了处理器的三环保护模型中的零环(Ring0,最高权限级别)和三环(Ring3,最低权限级别)。一般应用程序都运行在Ring3下,受到严格的保护,只能规矩地使用Win32API。如果我们想进行一些系统级的操作,例如在嵌入汇编中使用诸如Mov EAX,CR0,或像在DOS下那样调用一些必不可少的系统服务(如BIOS,DPMI服务)而用Int xx,都会导致非法操作。但这种能力有时是必不可少的,一到这种时候Microsoft就建议编写一个VxD。VxD大家早有所闻了,在VxD里,不但可以执行CPU的所有指令,而且可以调用VMM(虚拟机管理器)和其他VxD提供的上千个系统级服务。获得这一能力的最本质原因在于它运行在Ring0,与系统内核同一级别。但是它体系的复杂性、开发工具的不易获得、帮助文档的不完备,使Microsoft排除了一大批程序员和竞争对手。而将在Windows2000(Windows98也开始支持)中取代VxD的WDM对Win95程序员也是个噩梦,它需要了解Windows NT核心驱动模型。--有没有简单一些的办法呢?我们可以令一个普通Win32应用程序运行在Ring0下,从而获得VxD的能力吗?答案是肯定的。下面我们就简述一下这一技巧,有关Intel x86保护模式的基础知识请大家看有关书籍。--首先此技巧基于以下理论根据:--一、SIDT指令(将中断描述符表寄存器IDTR--64位宽,16~47Bit存有中断描述符表IDT基地址-的内容存入指定地址单元)不是特权指令,就是说我们可以在Ring3下执行该指令,获得IDT的基地址,从而修改IDT,增加一个中断门安置我们的中断服务,一旦Ring3程序中产生此中断,VMM就会调用此中断服务程序,而此中断服务程序就运行在Ring0下了。这一点与在DOS下非常相似。--二、Windows95 Win32应用程序运行一个映射到全部4G内存的段中,选择子为0137h,Ring0中的VxD运行在另一个映射到全部4G内存的段中,选择子028h,这两个段除了选择子决定的访问权限不同外,没什么不同,各自段中相同的偏移量对应了相同的线性地址。所以我们放在Win32应用程序中的中断服务程序可以以Ring3的段偏移量被Ring0中的VMM寻址。--下面我们以具体例子进一步说明,程序中有详细注释。----这是一个Win32 Console Program(控制台应用程序),虽然运行中看起来很像DOS筐中运行的实模式DOS程序,但它是货真价实的运行在Ring3下的Win32程序。用Visual C++5.0 AppWizard创建一个Win32 Console Program项目,添加以下.CPP文件,编译即可。#include#include#include#include//若无DDK带下划线的可略去,这些语句演示了调用VMM/VXD服务DWORDLONG IDTR,SavedGate;WORD OurGate[4]={0,0x0028,0xee00,0x0000};//中断门描述符格式如下:DWORD _eax,_ecx,_cr0;WORD vmmver;HVM sysvm;void nothing(){//Used to test call in Ring0 sysvm=Get_Sys_VM_Handle();}void __declspec(naked)Ring0Proc(void)//中断例程,运行在Ring0{_asm{mov _eax,eax//mov _ecx,ecx//mov eax,CR0//测试Ring3中不能执行的特权指令mov _cr0,eax//}VMMCall(Get_VMM_Version);//调用VMM服务_asm{mov vmmver,ax}nothing();//测试在运行于Ring0的中断例程中调用子_asm iretd//中断返回,与在实模式编程无本质区别}void main()//主程序{_asm{mov eax,offset Ring0Proc mov[OurGate],ax//将中断函数的地址shr eax,16//填入新造的中断门mov[OurGate+6],ax//描述符sidt fword ptr IDTR//将中断描述符表寄存器(IDTR)的内容取出mov ebx,dword ptr[IDTR+2]//取出中断描述符表(IDT)基地址add ebx,8*9//计算Int 9的描述符应放置的地址选用Int9是因为它在Win32保护模式下未占用mov edi,offset SavedGat

您可能关注的文档

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档