您的位置:IT教程网首页>操作系统教程>dos>检测DOS程序执行的目录

检测DOS程序执行的目录



您正在看的DOS教程是:检测DOS程序执行的目录。

检测DOS程序执行的目录

在DOS程序执行时,要确定当前目录是很容易的,有现成的DOS中断,但当程序是在PAHT指定的目录中执行时,有时要用到相同目录下的数据文件,这样就需要获得执行程序所在的目录。

DOS程序执行时,系统要建立一个用于进程的环境块,文件刚开始执行时,DS和ES指向地址,而段的偏移002CH处的一个字的内容就是环境块的段地址。环境块里面是用SET命令可以看到的环境字符串,包括PATH,PROMPT串等等,每个串以00结尾,整个环境块以0000结束,在环境串以后为字节0100,再接下去就是包括全路径的执行文件名,对这个字符串进行处理,截去最后的文件名,得到的就是当前文件所在的目录。

C:\gt;debug
-d002c
1577:002CD60E4E01..N.
(0ED6:0000即环境块段地址)
-d0ed6:0
0ED6:0000434F4E4649473D4E-6F7200544D503D43CONFIG=Nor.TMP=C
0ED6:00103A5C57494E444F57-535C54454D500054:\WINDOWS\TEMP.T
0ED6:0020454D503D433A5C57-494E444F57535C54EMP=C:\WINDOWS\T
0ED6:0030454D500077696E62-6F6F746469723D43EMP.wiootdir=C
0ED6:00403A5C57494E444F57-5300434F4D535045:\WINDOWS.COME
0ED6:0050433D433A5C57494E-444F57535C434F4DC=C:\WINDOWS\COM
0ED6:00604D414E442E434F4D-00504154483D453AMAND.COM.PATH=E:
0ED6:00705C424F524C414E44-5C42494E3B443A5C\BORLAND\BID:\
0ED6:00804144565343483B43-3A5C57494E444F57ADVSCH;C:\WINDOW
0ED6:0090533B433A5C57494E-444F57535C434F4DC:\WINDOWS\COM
0ED6:00A04D414E443B433A5C-544F4F4C533B433AMAND;C:\TOOLC:
0ED6:00B05C444F533B433A5C-4E4F52544F4E3B44\DOC:\NORTOD
0ED6:00C03A5C50524F54454C-3B443A5C5046573B:\PROTEL;D:\PFW;
0ED6:00D0443A5C5046570050-524F4D50543D2470D:/PFW.PROMPT=$P
0ED6:00E02467200077696E64-69723D433A5C5749$g.windir=C:\WI
0ED6:00F04E444F575300424C-41535445523D4132NDOWS.BLASTER=A2
0ED6:01003230204935204431-205436205033313020I5D1T6P310
0ED6:011000434D444C494E45-3D64656275670000.CMDLINE=debug..
0ED6:01200100433A5C57494E-444F57535C434F4D..C:\WINDOWS\COM
0ED6:01304D414E445C444542-55472E45584500CDMAND\DEBUG.EXE..
0ED6:01405AEB0E1591C0CD21-44454255470021C3Z......!DEBUG.!.
0ED6:0150CD2000A0009AF0FE-1DF01403160D6D01.............m.
(红字0000即环境块结束,蓝字为当前执行文件名)

汇编编程示例:

...
moves,ds:[002ch];DS指向段地址,DS的002C为环境块段地址
movcx,0ffffh;取环境块段地址
xordi,di
xoral,al
cld
re_scan:
rezsca;查找00
sca;判断下一个字节是否为00
jnzre_scan;不是则继续查找
incdi;找到0000则加2字节地址就是文件名
incdi;现在ES:DI所指的就是执行的文件名
...