|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
16 楼』:
Re fdsiuha:
对你提供测试示例表示感谢,是我孤陋寡闻了。
目前为止,我在Win98的命令行下可以完成以上测试,包括rd .的测试。但是在Win98的DOS模式下,此测试仍然无法通过。这似乎说明,这是某种Windows的机制在起作用(可能与进程间的消息传递方式有关),而非你所说的DOS的环境变量管理的疏漏。
而且,我也不倾向将当前目录看作环境变量,因为它毕竟不在环境变量空间保存,无论是公共空间,还是每个DOS窗口自己的私有空间,除非将它看作一种广义上的“环境变量”。但是因为我尚未得知这个当前目录的具体保存位置,所以无法作出更准确的判断。
你知道得更多吗?
[ Last edited by willsort on 2005-8-14 at 07:15 ]
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2005-8-13 22:36 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
17 楼』:
当然 当前目录作为整个DOS系统的参数是不用具体提供给某个程序,但应该在PSP中间引用。但是具体位置尚不知晓,实际上这个比提供给程序的环境变量要低级,一般不需要特别应用,我用C从来就没有碰到过要使用这个的必要(汗)。我努力在网找一下,看看有没有外文的资料。
另外你说的在完全的DOS环境下不能使用,我还在找原因..。
[ Last edited by fdsiuha on 2005-8-14 at 00:41 ]
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 00:40 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
18 楼』:
转洪恩的网页,注意CDS项
Quote: | 你想详细了解你的设备驱动程序吗?
你想直接通过内存了解软件内容吗?
你想了解磁盘的盘体逻辑结构信息吗?
那就让我们一起来学习DOS系统中的一个重要的数据结构-系统内部参数表,又称表之表(List of lists-LOL)。
调用未公开的DOS中断21h的52号系统功能可获取LOL的表首地址于ES:BX中。
1、将BX减8h,即LOL-8h处的双字单元为当前磁盘缓冲区(Disk buffer)的地址。 DBF的长度为532字节(DOS 6.2,下同),包括20字节的缓冲区控制块和正好容纳一扇数据的512字节的缓冲区。
2、LOL-2h处的字单元为第一个内存控制块MCB(Memory Control Block)的段地址,偏移为0。
MCB的长度为16字节。 首字节为标志位,为“Z”(5Ah)表示最后一个内存块,为“M”(4Dh)表示为非最后块。 01h字节单元为0000h表示内存块空闲,否则为拥有此内存块程序的程序段前缀(PSP)的段地址。
03h字节单元表示以节为单位的内存块的大小。
05h 11字节保留。
下一个MCB的段址为现MCB的段址加1,再加上内存块的大小(3-4字节中的数)
3、LOL+0h处的字单元地址为驱动器参数块DBF(Drive Parameter Block)链首地址,即而得到DBF的地址。
DBF长度为33字节,具体意义如下: 00h字节:驱动器号(0=A:,1=B:,2=C:等等)
01h字节:子单元号(unit)
02h字: 每扇字节数
04h字节:簇内最大扇区号(此值加1即为簇扇数)
05h字节:簇大小以2为底的指数
06h字: 保留扇区数
08h字节:FAL的数目
09h字: 根目录区项数
0Dh字: 文件区第一扇的逻辑扇号
0Fh字: 每个FAL的扇数
11h字: 根目录区第一扇的逻辑扇号
13h双字:块设备驱动程序(设备头)的段:偏移
17h字节:介质标志(F8为硬盘)
18h字节:DBF有效标志(为FFFF表示必须重建DBF;为0表示刚用过)
19h双字:下一个DBF的段:偏移(若偏移为FFFF,则本DBF为最后一个)
1Dh字:目录首簇号(0为根目录,1为子目录)
1Fh字:盘上空闲数(-1为未确定)
4、LOL+04h处的双字单元为面向句柄的系统文件表SFT(System File Table)第一个表组的地址。
此SFT表由两个表组组成,每个表项长度为59字节,每个表组有一个6字节的组头,前四个字节为下一表组指针,后两个字节为表组内的项数。
5、LOL+12h处的双字单元的DBF键首地址
6、LOL+16h处的双字单元为当前日期目录结构数组表CDST(Current Directory Structure Table)的首地址。
CDST由若干个CDS组成,每个CDS的长度为88字节,意义如下:
00h 67字节:当前目录的路径名ASCII字符串
43h字:标志记道常为40h
b15位: 1-网络驱动器;0-本地驱动器
b14位: 1-物理驱动器;0-虚拟驱动器
b13位: 1-本驱动器符已被连接到指定路径;否则为0
b12位: 1-本驱动器符被用来代替指定路径;否则为0
b11和b10位:未知
45h双字:此驱动器的DPB的地址(段:偏移)
49h字: 当前目录的首簇号(0:根目录;+1:从未访问过)
4Bh双字:未知
4Fh字: 当前目录的路径名(前67个字节)中,相当于根目录的“\” 符前的字节数(通常为2)
51h~57h:保留
7、LOL+1Ah处的双字单元为面向FCB的SFT表组的头部地址。 此SFT只有一个表组,组头的前四个字节未用,其他同面向句柄的SFT表组。
8、LOL+22h处的字节单元为CDST的表项数,即config.sys 中lastdrive的值在面向句柄的SFT中第一个表组项数为5,第二个表组项数为此值减5。
9、LOL+22h处的双字单元为NUL设备驱动程序的头部,长度 18字节,意义如下:
00h双字:下一设备头的地址(段:偏移)
04h字: 设备属性(b15为1表示字符设备;为0是块设备)
06h-09h 4字节:中断例程入口的段内偏移量
10h-17h 8字节:设备名(字符设备:此域存放逻辑设备名;块设备:只第一字节中写有块设备驱动程序所支持的子单元数目,其余字节为0) |
|
以下引自一个病毒编写技术文章
Quote: | %DIB(DOS Info Block DOS信息模块)%
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
利用DIB,我们能够访问那些重要的不能利用其它方法访问结构。这个结构并不是固定的在内存中的,我们必须利用INT 21h的52h功能。在DOS文档里没有这个函数的介绍。当我们调用这个函数的时候,我们将会在ES:BX里得到DIB的地址。你将会得到:
___________________________________
| Pointer to first MCB |<---- -0004h
|___________________________________| Size:1 DWORD
| Pointer to first DPB |<-----+0000h
|___________________________________| Size:1 DWORD
| Pointer to DOS last buffer |<-----+0004h
|___________________________________| Size:1 DWORD
| Pointer to $CLOCK |<-----+0008h
|___________________________________| Size:1 DWORD
| Pointer to CON |<-----+000Ch
|___________________________________| Size:1 DWORD
| Maximum sector length |<-----+0010h
|___________________________________| Size:1 WORD
| Pointer to DOS first buffer |<-----+0012h
|___________________________________| Size:1 DWORD
| Pointer to array of cur dir struc |<-----+0016h
|___________________________________| Size:1 DWORD
| Pointer to SFT |<-----+001Ah
|___________________________________| Size:1 DWORD
Total Size:34 BYTES |
|
另外,我试图看一下这个中断究竟是怎样工作的。
还有就是纯DOS7.1确实不能这样应用,我怀疑是不是WIN的与DOS不一样,WINNT内核没有办法试,那位GG现在装了DOS7.1+WIN3.2,帮忙试一试,大家一起来探个究竟。
[ Last edited by fdsiuha on 2005-8-14 at 01:23 ]
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 01:07 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
19 楼』:
另外DOS提供了另外的一个47h的中断可以正常使用。我困死了,今天先到这里吧.
用DEBUG测试,在删掉当前目录的时候47号功能依然返回的是删除以前的目录。
就是说,当前目录没有发生任何变化。只是不存在了。
单步跟踪47号功能,发现依然是查CDS表,跟踪到的内存地址与52号功能返回地址相同。
另外,再删掉当前目录后马上使用EDIT打开文件会提示目录有问题。估计也是因为使用了这个中断,要按照这个结果搜索当前目录文件的时候自然会发生的问题。
真是搞不懂WIN在干什么,另外有没有人在DOS7.1+WIN3.2做过实验?
[ Last edited by fdsiuha on 2005-8-14 at 11:13 ]
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 01:32 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
20 楼』:
Re fdsiuda:
我搜索了Win98下所有的command.com,均能找到“Attempt to remove...”这个错误信息字符串。也就是说,无论实际测试结果如何,Win98的原意都并非是将删除当前目录的权限开放,这从另一个侧面佐证了 Climbing 兄关于它是个 BUG 的猜测。这也进一步验证了Win98的“粗放型特征”。至于DOS7+Win3,我没有平台可以验证,但我猜测它的“开放性”并没有如此高。
关于这个问题的成因,我有两个猜测:第一,Win98的进程管理中将删除当前目录的消息过于落后地传递给其它进程,直到进程开始访问当前目录时,这个消息才被动地被执行或者传递;第二个,可能是它不完善的硬盘缓冲机制在起作用,也就是说,删除当前目录的实际操作是在再次访问当前目录之前才被执行的。
但以上的两点推测,都无法说明为什么"Attempt to remove..."为什么被抛弃不用。
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2005-8-14 11:40 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
21 楼』:
我还是不觉得是个问题,而且觉得应该不会是进程间的原因。每一个DOS窗口都有自己的COMMAND.com的所有特征信息,但是仍然公用基本的DOS系统IO.SYS。这个系统变量只在同一个DOS窗口里面有效。COMMAND.com在启动的时候确实从系统得到当前的目录信息,但是只得到了一个COPY,而不是整个系统的该信息的内存地址类似C语言的传值,而不是给出一个指针,指向系统变量,因为这个是受保护的。
所以纯DOS下绝对不能非法改变这个值,因为这是一个系统级的。但是在WIN98下的DOS窗口是个独立于系统外的,同时也获得了一个系统变量的COPY。当然这个COPY数据是可以自由变化的,我使用DEBUG验证确实每一个DOS窗口都有自己的CDS。
所以我希望能够WIN3.x尝试一下,如果WIN3.x的DOS窗口下与WIN9X一样,那么说明WIN9x允许这样使用,实际是扩展了DOS的功能,而不是一个BUG。
另外DOS6.X+WIN3.X也可以试一下,也可能可以成功。
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 13:28 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
22 楼』:
Re fdsiuha:
刚才在Virtual PC 5 的 MS-DOS7.1 环境安装了 Windows3.2 简体中文版,在其“ MS-DOS 方式”下进行了测试,结果确认了我的猜测。
Quote: | Microsoft(R) MS-DOS 7.1
(C)Copyright Microsoft Corp 1981-1999.
C:\WINDOWS>cd\temp\r\a
C:\TEMP\R\A>rd \temp\r\a
Attempt to remove current directory - \temp\r\a
C:\TEMP\R\A>rd ..
Invalid path, not directory,
or directory not empty |
|
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2005-8-14 18:56 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
23 楼』:
第二个命令是否COPY的时候COPY错了?
第三种命令其实在WIN的DOS窗口也是不能实现的。不能删除父目录,只能删除当前目录 RD .
[ Last edited by fdsiuha on 2005-8-14 at 20:59 ]
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 20:36 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
24 楼』:
Re fdsiuha:
拷贝过程我一字未易,不知你所说的错误是指非“rd .”吗?我是根据你之前的示例做的测试。当然,我也尝试过 rd . / rd ..\a,也是同样的错误提示。
Quote: | 赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突
? ?Type EXIT and press ENTER to quit this MS-DOS prompt and ?
? return to Windows. ?
? ?Press ALT+TAB to switch to Windows or another application. ?
? ?Press ALT+ENTER to switch this MS-DOS Prompt between a ?
? window and full screen. ?
韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图
Microsoft(R) MS-DOS 7.1
(C)Copyright Microsoft Corp 1981-1999.
C:\WINDOWS>cd\temp\r\a
C:\TEMP\R\A>rd ..\a
Attempt to remove current directory - ..\a
C:\TEMP\R\A>rd .
Attempt to remove current directory - . |
|
[ Last edited by willsort on 2005-8-14 at 20:45 ]
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2005-8-14 20:41 |
|
|
fdsiuha
高级用户
闷
积分 587
发帖 302
注册 2005-7-25
状态 离线
|
『第
25 楼』:
对不起,是我看错了。这么说确实WIN98在这个地方有问题。我在WINME下试过了,但是还是出现与WIN98同样的情况,我很想知道到底是什么原因造成这种情况,好象还没有E文文献记载这个事情。
DOS一直强调不能删除当前目录,然而WIN9X下却破坏了这个规矩,不知道究竟是何道理。
[ Last edited by fdsiuha on 2005-8-14 at 21:49 ]
|
欢迎造访DOS的小屋!
http://risky.ik8.com |
|
2005-8-14 21:06 |
|