在纯DOS中怎样防止用户CTRL+C终止批处理?

2025-03-09 12:48:05
推荐回答(1个)
回答1:

内存驻留程序的资料可以从网上搜索。
至于Ctrl-C(Ctrl-Break)的处理,我查了一下资料,一种方法是使用DOS功能调用33h,使Ctrl-C检测失效,入口参数AH=33H,AL=0检查Ctrl-C的当前状态,功能调用后的状态结果返回放在DL中;AL=1设置Ctrl-C的状态,此时DL中必须有设置所需的状态值,DL=0为关闭Ctrl-C处理,DL=1为打开Ctrl-C处理。
另一种方法是截获Ctrl-C处理中断,只要在键盘或在某个文件或设备字符流处检测到一个Ctrl-C,则某个处理程序(下面代码中用Brk_Routine来表示)将获得控制。
mov ah,25h ;设置中断
mov al,23h ;Ctrl-C处理程序中断向量
mov dx,seg Brk_Routine ;DS:DX=处理程序地址
mov ds,dx
mov dx,offset Brk_Routine
int 21h ;调用DOS改变此向量
Brk_Routine: iret ;DOS检测到Ctrl-C后调用的处理程序,这里的iret只是做立即返回,故Ctrl-C仍留键盘输入流中,并将应用程序下一次从键盘请求字符时传送过去(屏幕显示为^C),如果想执行一些代码,则在iret前加入即可。应用程序结束后,DOS根据PSP中保存的信息自动恢复Int 23h向量以前的内容。
此外,还有一个对Ctrl-Break专门处理的向量Int 1Bh,一般来说,不能把Int 23h编写的处理程序用于Int 1Bh,Int 1Bh使用起来更受到限制,因为它是作为一个硬件中断的结果被调用的,而在发出此中断时有可能正在执行一段非常重要的代码。另外,除CS:IP以外的所有寄存器都处于未知状态,如果不能正确处理此前的堆栈和向量,则会很有可能导致系统死机。