发信人: sle()
整理人: sle(2000-02-29 18:06:34), 站内信件
|
在实际的程序编制中,经常需要知道系统有多少个逻辑驱动器,以避免操作 非法的逻辑驱动器符,提高程序的适应性和容错性。
在DOS系统中每一逻辑驱动器对应一驱动器参数块(Drive Parameter Block), DPB由盘符、字节数/扇区、扇区数/簇、引导区扇区数、分配表扇区数、最大簇等 信息构成,是磁盘BIOS参数块(BIOS Parameter Block)拷贝,磁盘驱动程序用以 将逻辑扇区号转换为物理扇区号,这些DPB被组织成单向链表,由IO.SYS在初始化 自己时建立。如果搜索DPB链,就可得到驱动器的个数及其它关于该驱动器的信息 。INT 21H中断功能52H返回该链首址的指针(ES:BX),在每一个DPB的偏移18H(4 .0以下版本)或19H(以上版本)处为下一DPB的长指针,DPB链的最后一项指针指 向FFFFH。
以下的函数搜索DPB链并在AL中返回最大逻辑驱动器符,如AL减去“a”再加1则为 系统的逻辑驱动器个数,可用于汇编或C语言中。
Drvtest proc near
Mov ah,30h
Int 21h
Mov cs:dos_level,al
Push es
Mov ah,52h
Int 21h
Les bx,dword ptr es:[bx]
Mov di,18h
Cmp cs:dos_level,4
Jl v3
Inc di
V3:cmp word ptr es:[bs+di],0ffffh
Jz v4
Les bx,dword ptr es:[bx+di]
Jmp v3
V4:xor ax,ax
Mov al,byte ptr es,[bx]
Add al,’a’
Pop es
Ret
Dos_level db 0
Drvtest endp
-- sigh,,曾经有一盆清蒸的甲鱼摆在我的面前,可是我却没有珍惜,
等到它被人瓜分的时候才追悔莫及,人世间最痛苦的事莫过于此。
如果上天能够给我一个再来一次的机会,我会对它说:“我吃你”
如果要给这份遗憾加上一个期限,我愿是---一分钟。
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 210.72.235.145]
|
|