|
||||
多路中断INT2FH的分析与应用宋立波 |
|
DOS系统的INT2FH是未见文档的中断调用功能,被称为多路复用 中断。系统在执行内部命令和外部命令时首先要调用该中断,判断该命令是内 部命令还是外部命令即应用程序。如果是内部命令则利用DOS系统内核功能 执行之;如果是外部命令则查找其所在目录,然后利用DOS内核功能加载并 执行之。笔者通过对该中断进行跟踪分析,总结出DOS系统中多路复用中断 INT2FH在命令执行过程中的具体工作原理及其调用格式,并根据该原理 结合程序实例总结出INT2FH在扩充DOS内部功能过程中的使用技巧。 一、INT2FH具体工作原理 DOS系统的多路复用中断INT2FH在命令的执行过程中起到了举足 轻重的作用,具体原理阐述如下: 内部命令的执行过程 1、DOS系统利用INT21H的0AH号子功能在命令行循环等待接 受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F H。 2、该中断首先调用其子功能AE00H子功能调用判断该命令是否为D OS的内部命令。如果是在AL寄存器中返回OOH,并自动调用子功能11 23H利用中断INT21H各个子功能完成文件的查找、打开、拷贝和删除 等操作。在此过程中如果遇到非法中断内部命令的执行的其它操作(CTRL -C等),则立即中止当前中断调用功能,转到INT2FH的1120H进 行命令中断处理,并转步骤“4”中继续进行其它任务处理工作。 3、其次调用INT2FH的子功能1122H进行命令结束时的善后处 理工作。 4、最后依次调用INT2FH的111DH、1125H进行当前驱动 器和当前目录的设置工作,并完成系统命令行提示状态,进行步骤“1”,调 用INT21H的0AH号子功能等待输入命令。 外部命令的加载执行过程 1、DOS系统利用INT21H和0AH号子功能在命令行循环等待接 受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F H。 2、当DOS系统接受命令行命令后利用INT2FH的AE00H子功 能调用,判断该命令是否为DOS的外部命令。如果是则自动调用INT2F H子功能1123H,根据PATH命令设置的路径利用中断INT21H的 子功能查找该应用程序。找到该程序之后进行如下工作:如果程序名后跟有命 令行参数,则将DOS暂驻区的原始命令行参数内容转换成标准格式化参数形 式传送到程序的格式化参数区PSP:005CH和PSP:006CH处, 并将未经转换的原来命令行参数直接送到非格式化参数区PSP:0080H 处;如果程序名后未跟命令行参数,则将格式化参数区填充以字符20H,并 将程序名传送到非格式化参数区中。 3、然后利用中断调用INT21H的子功能4B00H完成程序的加载 和执行任务,在此过程中如果遇到非法中断内部命令的执行的其它操作(CT RL-C等),则立即中止当前中断调用功能,转到INT2FH的1120 H进行命令中断处理工作,之后转入步骤“5”中继续进行其它任务处理工作。 4、其次,在程序执行完后调用INT2FH的子功能调用1122H进 行程序结束处理,并利用多路复用中断子功能1123H重新加载COMMA ND的第二副本(暂驻区)到内存高端。 5、最后依次调用INT2FH的111DH、1125H进行当前驱动 器和当前目录的设置工作,并完成系统命令行提示状态,进行步骤“1”,调 用INT21H的0AH号子功能等待输入命令。 特殊程序APPEND.EXE的工作过程 APPEND.EXE是DOS 3.3以后增加的外部命令,该外部命 令与内部命令PATH相对应,APPEND是设置应用程序查找数据或任意 文件的路径外部命令,而PATH只是设置系统查找应用程序路径的内部命令 。通过对APPEND程序的跟踪分析,发现其工作过程如下: 1、DOS系统利用INT21H的0AH号子功能在命令行循环等待接 受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F H。 2、当接到的命令是APPEND.EXE程序时,如果是首次加载执行 该程序,则与执行其它外部命令的过程基本相同,并将APPEND.EXE 程序驻留于内存中形成非弹出式TSR程序,并接管INT2FH的子功能A E00H和AE01H。 3、如果是再次执行该程序时,DOS系统首先自动调用INT2FH的 AE00H子功能,利用APPEND程序扩充该子功能部分,调用INT2 FH的B700H子功能判断APPEND命令是否安装,如果已经安装则在 出口寄存器ALH中设置出口参数FFH。 4、根据出口参数,系统自动调用INT2FH的子功能AE01H,A PPEND扩充的AE01H子功能部分根据命令行具体参数的内容完成相应 的任务:如果命令行带有参数,则扩充的子功能AE01H自动完成数据文件 路径的重新设置工作并继续进行下一步骤;如果命令行不带任何参数则自动调 用APPEND扩充的多路复用中断子功能B700H、B702H和B70 4H进行已经设置的路径和版本等信息的查找与显示。 表一:INT2FH 子功能调用格式 ---------------------------------- 子功能 入口参数 出口参数 ---------------------------------- AX=AE00H AL=00H 表示一般 DX=FFFFH DOS命令 DS:BX或ES:BX指向 并且自动调用1123H子功 AE00H 初始命令行暂驻区 能执行之 DS:SI或ES:SI指向 AL=FFH表示扩充DOS 大写命令暂驻区 内部命令 并且自动调用AE01H ---------------------------------- AX=AE01H DX=FFFFH DS:BX或ES:BX指向 DS:SI指向大写命令行暂 AE01H 初始命令行暂驻区 驻区及其命令参数计数单元 子功能执行任务 DS:SI或ES:SI指向 大写命令暂驻区 ---------------------------------- AX=1123H DS:BX或DS:DX外部 命令路径地址指针 DS:BX找到或加载执行程 1123H ES:DI指向查找命令的 序的字符串地址指针 路径地址指针 ---------------------------------- AX=1125H 1125H ES:SI指向当前路 无 径名地址指针 ---------------------------------- AX=111DH 111DH DS:BX指向当前驱 无 动器符地址指针 ---------------------------------- 1122H AX=1122H 无 ---------------------------------- 1120H AX=1120H 无 ---------------------------------- 表二:APPEND程序扩充子功能调用格式 ---------------------------------- 子功能号 入口参数 出口参数 ---------------------------------- B700H AX=B700H AL=00H 表示APPEND命令 未安装 INT2FH AL=FFH 表示APPEND命令 已经安装 ---------------------------------- B702H AX=B702H AL=DOS主版本号 INT2FH AL=DOS次版本号 ---------------------------------- B704H AX=B704H ES:DI指向APPEND命令设置 的路径 ---------------------------------- 工作; 5、最后调用INT2FH的子功能1125H完成系统命令行提示状态 ,进入步骤“1”,调用INT21H的0AH号子功能等待输入命令。 二、INT2FH的中断调用格式 以上对INT2FH的工作原理进行具体分析,要充分开发利用该中断的 具体功能,还要了解其中断调用的具体格式,本文给出了该中断的所有子功能 的入口参数及出口参数的格式,见表一。 三、扩充DOS内部功能实现机制 通过上述剖析DOS系统多路复用中断INT2FH的工作原理及其调用 格式,不但了解到DOS内部、外部命令加载执行过程及其在DOS系统中的 作用,还可以发现DOS系统中提供了扩充类似内部命令的接口子功能AE0 0H和AE01H。该两个接口子功能在命令输入后由DOS系统自动调用执 行,我们只是重新编制这两个调用接口功能模块,将自己的应用程序设计成类 似APPEND.EXE的非弹出式内存TSR程序,将其驻留内存之后就可 以像DOS的内部命令一样,不受系统当前驱动器和路径制约,对于常用实用 程序来说这有利于提高程序的执行速度,增强程序使用的方便性。 这里需要指出的是INT2FH的子功能AE00H的入口参数DS:B X指向的原始命令行暂驻区与程序段前缀PSP:0080H处的非格式化参 数区略有不同,DS:BX参数处的格式如下: DSN...PPPPPPPP...... 1、其中首字节“D”代表当前驱动器符,如80H代表当前驱动器、8 1H代表当前驱动器为A、82H代表当前驱动器为B、83H代表当前驱动 器为C等等。 2、第二个字节“S”代表命令行参数的总计数值,其中不包括回车符0 DH。 3、第三个字节开始处“N”代表参数中的命令名部分。 4、其后的字节“P”代表命令名后的其它命令行参数。 该参数区与PSP:0080H处的长度均为128个字节,所不同的是 :PSP:0080H处没有当前所在驱动器说明部分“D”;当程序名后跟 有命令行参数时没有程序名部分“N”,而多路复用中断中DS:BX参数暂 驻区部分则是命令行参数最完整最原始的形式。 四、程序实例 文后所附程序REND.ASM就是通过接管上述INT2FH的AE0 0H和AE01H两上接口功能,在AE00H子功能模块中判断命令REN D是否已经驻留内存。驻留则在AL中返回FFH,实现自动调用子功能AE 01H;在AE01H子功能根据特定标志单元和DX:BX参数暂驻区取得 的参数,利用DOS系统的中断调用INT21H的11H、12H和17H 子功能,实现任意驱动器、任意路径下的具有任何属性的子目录的改名任务。 该实用程序只要经汇编连接生成COM文件后运行一次驻留内存,这时我们就 可以像使用DOS的内部命令REN一样完成修改子目录名功能,而不必考虑 当前所在的驱动器和程序所在的路径等因素,而且命令执行的速度要比一般外 部命令速率高。 本文不仅提供了一个实用程序,更重要的是提供了扩充DOS内部功能的 实现机制。 程序清单附后: ;REND.ASM CODE SEGMENT`CODE` ORG 100H ASSUME CS:CODE,DS:CODE START: JMP BEGIN BUFF DB 0FFH,0,0,0,0,0,17H;文件控制块 BUFFA DB 12 DUP(20H);第一个目录名 DB 5 DUP(?) BUFFB DB 11 DUP(20H);第二个目录名 DB 8 DUP (?) MYBUFF DB 64 DUP (?) SCREENO DB `FAIL FOR SUBDIRECTORY SCAN!`,24H SCREEN1 DB `RENDIR PARAMENTER NOT!`,24H SCREEN2 DB `RENDIR UNVARABLE PARAMENTER!`,24H OLD2FH DD 0000H NAMFLAG DB 00H PARAFLAG DB 00H NEW2FH PROC FAR STI CMP AX,OAE00H JE EQUAL1 CMP AX,OAE01H JE EQUAL2 JMP SHORT EXIT2FH EQUAL1: CMP DX,OFFFFH ;AE00H子功能扩充部分 JNE EXIT2FH PUSH SI PUSH BX MOV SI,BX INC SI INC SI CALL CMPNAME POP BX POP SI JNZ EXIT2FH MOV CS:NAMFLAG,01H MOV AL,OFFH IRET EXIT2FH: JMP CS:0LD2FH EQUAL2: CMP DX,0FFFFH ;AE01H子功能扩充部分 JNZ EXIT2FH CMP CS:NAMFLAG,01H JNE EXIT2FH MOV CS:NAMFLAG,00H PUSH DS PUSH ES PUSH DI PUSH SI PUSH DX PUSH BX PUSH CS POP ES LEA DI,CS:BUFFA ;取第一个目录名 MOV SI,BX INC SI CMP BYTE PTR [SI],09H JB EXIT1 MOV AL,[SI-01H] SUB AL,80H STOSB ADD SI,05H MOV CS:PARAFLAG[0],00H CALL NAMEMOV JC EXIT1 PUSH DS PUSH SI PUSH CS POP DS MOV DX,OFFSET MYBUFF MOV AH,1AH INT 21H MOV DX,0FFSET BUFF MOV AH,11H ;查找及取文件属性过程 INT 21H OR AL,AL JNZ EXIT2 ATTRIB: MOV BX,0FFSET MYBUFF MOV SI,0FFSET BUFF MOV AL,[BX] CMP AL,0FFH JNZ NEXT MOV AL,[BX+6] MOV [SI+6],AL JMP RENAME NEXT: MOV DX,0FFSET BUFF MOV AH,12H INT 21H OR AL,AL JNZ EXIT2 JMP ATTRIB RENAME: POP SI ;取第二个目录名 POP DS LEA DI,CS:BUFFB MOV CS:PARAFLAG[0],01H CALL NAMEMOV JC EXIT1 PUSH CS POP DS MOV DX,0FFSET BUFF MOV AH,17H ;改目录名操作 INT 21H CMP AL,00H JZ EXITNEW MOV DX,0FFSET SCREEN2 JMP EXIT EXIT2: POP SI POP DS MOV DX,0FFSET SCREEN0 JMP EXIT EXIT1: MOV DX,0FFSET SCREEN1 EXIT: PUSH CS POP DS MOV AH,09H INT 21H EXITNEW: POP BX POP DX POP SI POP DI POP ES POP DS MOV BYTE PTR DS:[SI],00H IRET NEW2FH: ENDP NAMEMOV PROC NEAR ;取目录名子程序 NEXT1: LODSB CMP AL,20H JNE NEXT2 JMP SHORT NEXT1 NEXT2: CMP AL,0DH JE EXITMOV MOV CX,000BH NEXT3: CMP AL,61H JB NEXT31 CMP AL,7AH JA NEXT31 AND AL,0DFH NEXT31: STOSB NEXT4: LODSB CMP AL,20H JE NEXT5 CMP AL,0DH JE NEXT6 CMP AL,2EH JE NEXT4 LOOP NEXT3 LODSB CMP AL,20H JNE EXITMOV RETURN: CLC RET NEXT5: JCXZ RETURN MOV AL,20H STOSB LOOP NEXT5 JMP RETURN NEXT6: JCXZ NEXT7 MOV AL,20H STOSB LOOP NEXT6 NEXT7: CMP CS:PARAFLAG[0],01H JE RETURN EXITMOV: STC RET NAMEMOV ENDP CMPNAME PROC NEAR ;命令名比较子程序 PUSH CX PUSH AX LODSB AND AL,0DFH CMP AL,`R` JNZ EXITCMP LODSB AND AL,ODFH CMP AL,`E` JNZ EXITCMP LODSB AND AL,0DFH CMP AL,`N` JNZ EXITCMP LODSB AND AL,0DFH CMP AL,`D` JNZ EXITCMP LODSB CMP AL,0DH JE EXITCMP CMP AL,20H EXITCMP: POP AX POP CX RET CMPNAME ENDP BEGIN: PUSH CS POP DS MOV AX,352FH INT 21H MOV WORD PTR 0LD2FH,BX MOV WORD PTR 0LD2FH+2,ES MOV DX,0FFSET NEW2FH MOV AX,252FH INT 21H MOV DX,0FFSET INSTALL MOV AH,09H INT 21H MOV DX,0FFSET BEGIN ADD DX,000FH MOV CL,04H SHR DX,CL MOV AX,3100H INT 21H INSTALL DB` CODE ENDS END START (计算机世界报 1994年 第20期) |
周报全文频道联系方式:010-68130909 |
||||||
| 【关于我们】 【广告服务】 【周报发行】 【投稿指南】 【投稿声明】 【联系方式】 【法律声明】 【媒体手册】 【编读往来】 |
||||||
| Copyright© ccw.com.cn,All rights reserved | ||||||
| 中国计算机世界出版服务公司版权所有 | ||||||