| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2305 人关注过本帖
标题:关于windows ring3保护模式与中断调用
只看楼主 加入收藏
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
结帖率:0
收藏
 问题点数:0 回复次数:5 
关于windows ring3保护模式与中断调用
最近发现了一个问题,就是进行某些中断调用时,并不如想象中的那样执行. 比如一个简单的ROM BASIC调用,我的机器(XP系统)弹出一个对话框:NTVDM不支持ROM BASIC.而且我在进行ROM BASIC调用的时候,用尽了一切办法,DEBUG跟踪、嵌入汇编、找到中断的地址直接调用等,结果都是一样的,系统通知我NTVDM不支持ROM BASIC.这就让我很郁闷,因为ROM BASIC 是系统热启动的中断,但是很显然不能够通过中断调用的形式对其进行引用操作.我去问了下QQ上的朋友,其曰此乃WINDOWS下的保护模式起的作用,它会保护某些中断以及系统的安全性,会禁止执行某些中断,除非进入ring0的系统级别.此其一. 第二,某年某月某日我执行了一个简单的程序,它的作用是屏蔽CTRL+ALT+DEL键的热启动键,程序如下: #include<dos.h> unsigned char stack[0x1000]; unsigned int ss,sp; int key; char far *fp; void interrupt (*old9)(); void interrupt newint9() {

disable(); ss=_SS; sp=_SP; _SS=_DS; _SP=(unsigned)&stack[0x1000-2]; enable(); if((key=inportb(0x60))==0x53) /*del键的扫描码*/ {

if((bioskey(2)&0xc)==0xc) /*CTRL+ALT的状态码*/ {

key=inportb(0x61); outportb(0x61,key); /*清除键盘缓冲区*/ outportb(0x20,0x20); /*结束键盘硬中断*/ *fp=0; /*将键盘缓冲区的状态字清零*/

} else old9();

} else old9(); disable(); _SS=ss; _SP=sp; enable(); } int main(int argc,char *argv[]) {

switch(argc) {

case 1: fp=MK_FP(0x40,0x17); /*键盘缓冲区状态字的地址*/ old9=getvect(0x9); setvect(0x60,old9); setvect(0x9,newint9); keep(0,(_SS+(_SP/16))-_psp); /*安装新中断并驻留*/ printf("Install OK!\n"); break; case 2:if(argv[1][0]=='d') {

disable(); setvect(0x9,old9); enable(); printf("Deinstall OK!\n"); } break; default:printf("BYE BYE!\n"); } getch(); return 0; } 程序的意思是改变原来的键盘中断,判断当键盘按下的时候是否按了CTRL+ALE+DEL,如果按了就清除键盘缓冲区中的内容,从而屏蔽热键. 而运行结果呢,无论是在DOS下还是在WINDOWS下,CTRL+ALT+DEL百试百灵,屡试不爽,就是说程序根本就没有起到什么作用.那么是不是说这个热键热启动也是在WINDOWS的保护伞之下呢? 但是C语言完全可以操作底层的东西,操纵一些键盘操作应该是没有什么问题地,与是我尝试用最简单的办法直接用一条空指令代替原INT 9H中断,结果是:在该程序下键盘失灵,而当跳出程序键盘就恢复正常了. 所以关于在WINDOWS下的中断调用我很迷茫,是不是说中断调用你只可以利用它完成一些事情,而不可以彻底的改变它? 在我对键盘中断的其他改动中,都可以正确执行,惟有对热键进行屏蔽时会出现问题。还是另外有其他的办法进行屏蔽? 所以还请各位不吝赐教,在下洗耳恭听,我很想明白如何利用中断改变系统的中断,或者说我该如何跳过WINDOWS的控制?就拿上面两个例子来说,如果我要进行机器热启动的话,如何调用ROM BASIC,还是另外有其他的办法。再有如果要进行屏蔽热键,如何才能做到,还是用C语言的办法行不通(我想不应该行不通的吧?),莫非非要用VC、VB之类的语言才行么? 总之还请各位赐教。

搜索更多相关主题的帖子: windows ROM BASIC 模式 系统 
2005-08-14 12:25
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
1。dos中断是与dos版本密切相关的,不同的版本之间是有差异的

2. 大凡中断都与你的硬件相关,不同的硬件其实现的中断号可能会有变化的

3。在windows下屏蔽CTRL+ALE+DEL,有点麻烦,目前我所知道的方法必须先判定系统,不同的win有不同的方法,用TC是不可能做到的,且不说别的TC是16位编译器, win是32位的操作系统.........

4.进入ring0到是不难,有API函数

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-08-21 10:14
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 
我感觉是因为,你所谓的DOS也只是在WIN下面的操作,意思是你的DOS是受到WIN控制的,当你的程序需要操作时,DOS把操作传送给WIN,然后WIN给出允许否,如果允许操作,不允许WIN弹出说明。意思是你所做的操作只可以控制WIN下的DOS但控制不了WIN!

差点把你忘了...
2005-08-22 11:56
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 
顺便问一下:ring3什么意思?

差点把你忘了...
2005-08-22 11:56
bigbigboy
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-5-4
收藏
得分:0 
受教!谢谢!
2007-06-05 11:24
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
你也知道你的程序是以windows ring3保护模式下运行的,做这种底层操作当然不行,只有调用api才可以进入ring0,也可以自己写ring0的程序比如驱动程序
至于你说做修改后在其他程序中没有变化,这是因为NT之后的都没有纯DOS模式,有的是系统的虚拟DOS模式,只在该进程中虚拟,对其他进程无效,这就是保护模式的操作系统。这和你用哪种编程语言无关,编译后都是二进制的可执行程序。

建议写驱动程序,深入ring0去直接控制硬件
2007-06-05 12:34
快速回复:关于windows ring3保护模式与中断调用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011473 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved