你想详细了解你的设备驱动程序吗?
你想直接通过内存了解软件内容吗?
你想了解磁盘的盘体逻辑结构信息吗?
那就让我们一起来学习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) |
|