联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
你想详细了解你的设备驱动程序吗? 你想直接通过内存了解软件内容吗? 你想了解磁盘的盘体逻辑结构信息吗? 那就让我们一起来学习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)
%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
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
赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突 ? ?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 - .