关于windows ring3保护模式与中断调用
最近发现了一个问题,就是进行某些中断调用时,并不如想象中的那样执行.
比如一个简单的ROM BASIC调用,我的机器(XP系统)弹出一个对话框:NTVDM不支持ROM BASIC.而且我在进行ROM BASIC调用的时候,用尽了一切办法,DEBUG跟踪、嵌入汇编、找到中断的地址直接调用等,结果都是一样的,系统通知我NTVDM不支持ROM BASIC.这就让我很郁闷,因为ROM BASIC 是系统热启动的中断,但是很显然不能够通过中断调用的形式对其进行引用操作.我去问了下QQ上的朋友,其曰此乃WINDOWS下的保护模式起的作用,它会保护某些中断以及系统的安全性,会禁止执行某些中断,除非进入ring0的系统级别.此其一.
第二,某年某月某日我执行了一个简单的程序,它的作用是屏蔽CTRL+ALT+DEL键的热启动键,程序如下:
#include
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之类的语言才行么?
总之还请各位赐教。