硬盘分区信息显示(HDPV)

      技术 2004-12-27 23:27
硬盘分区信息显示(HDPV)

功能描述:
1.显示整个硬盘的分区参数、状态信息
2.参考显示格式如下:
Partition Boot System Start(c) End(c) Size(MB)
C 80 fat16 0001 0165 2000
D 00 fat32 0166 02ca 2048
E 00 none 02cc 03fe 2000
F 00 fat32 03ff 0455 2000
G …………………………………………………………
H …………………………………………………………

程序要点:
1.由于ah=2,int13h中断调用只能识别8G的硬盘,所以这里用扩展int13中断调用。格式为
DAP数据包:
BYTE PacketSize; // 数据包尺寸(16字节)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset)
QWORD BlockNum; // 磁盘起始绝对块地址
扩展读
入口:
AH = 42h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码
2.
80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00
00 00 41 FE 0F FE FF FF 7E 04 7D 00 1F 2C B4 00
C分区MBR起始相对扇区数为3F
下一条表项为D 分区,MBR起始绝对扇区数为x007d047e
00 01 41 FE 0B FE FF 7B 3F 00 00 00 BF A3 5D 00
00 00 C1 7C 05 FE FF FF FE A3 5D 00 21 88 56 00
D分区MBR起始相对扇区数为3F
E分区MBR起始绝对扇区数为x005da3fe
由此可知,每个分区表第一项0a—0d字节处都为3f,第二条表项0a—0d字节处为该分区所在的绝对扇区数。
由于c盘MBR起始为0磁头0扇区1柱面,所以很容易确定分区c的DPT所在位置。
分区d的起始绝对扇区数为扩展分区的起始地址,赋给常数Maincount,此后分区e、f、g等等的绝对起始分区数需要加上这个常数才是真正的起始地址。
所有分区的绝对起始地址赋给BlockNum,通过扩展int13h调用可将分区的MBR信息送入缓冲区mbr,这里BufferAddr与mbr的偏移地址是相同的。
3.MBR结构
0—445字节为引导区(若只有一个操作系统,分区d、e、f等前446字节内容为零。)
446-509为分区的DPT,可得到分区链表,显示信息全部由这里得出。
510-511位分区的结束标志55AA,每次readmbr后都要检验分区的有效性,通过子程序check55aa。


5. 输出分区大小时,将表项最后4个字节右移20位,等于除以1024*1024,即换算成MB,这里将最后两个字节赋给ax,再右移4位,由于1扇区为512字节,mul 512,可得到分区大小(MB)这里用16进制输出,子程序为ptrsize.
算法:
main proc far
初始化,对DAP数据包赋分区C的信息
call init
prthead(显示的头信息)
call readmbr
call check55aa
call setrec
取下一个分区的起始绝对分区数
赋给maincount
readext:
call readmbr
check55aa
call setrec
取下一个分区的起始绝对分区数加上maincount,赋给BlockNum
检测下一表项是否为空
空:exit
不空:jmp readext
main endp


check55aa proc near
if es:[DPT+64]=”55aa”
ret
else exit
check55aa endp

setrec prc naer
call prtpartion{}(输出盘符)
call prtboot{}(输出活动标志)
getsys
{
ptrfat16(输出文件系统标志”fat16”)
ptrfat32(输出文件系统标志”fat32”)
ptrntfs(输出文件系统标志”ntfs”)
}
ptrstartc{输出分区起始扇区}
ptrendc{输出分区中止扇区}
ptrsize{计算并输出分区大小}
(由分区总扇区数*512k得)
ret
setrec endp

辅助输出子程序
crlf:输出回车换行
spa:输出空格
rotate:输出bx中的数值

本程序为本人第一个汇编程序,有什么不清楚地地方请予我联系:ok_snail@yahoo.com.cn



以下是原程序:



Dseg SEGMENT
MBR DB 512 DUP(?)
DPT EQU 446
DPT2 EQU DPT+16
;------------------------------
PacketSize DB 16
Reserved DB 0
BlockCount DW 1
BufferAddr DD ?
BlockNum DQ 0
;------------------------------
MainCount DW ?,?
;------------------------------
TabHead DB 'Partition Boot System Start(c) End(c) Size(MB)
标签集:TAGS:
回复Comments() 点击Count()

QuitTip DB 'Press any key to exit . . .
标签集:TAGS:
回复Comments() 点击Count()

parti DW ?
Fat32 DB 'FAT32
标签集:TAGS:
回复Comments() 点击Count()

Fat16 DB 'FAT16
标签集:TAGS:
回复Comments() 点击Count()

NTFS DB 'NTFS
标签集:TAGS:
回复Comments() 点击Count()

;-----------------------------
ErrMsg DB 'Invalid Partition Table!
标签集:TAGS:
回复Comments() 点击Count()


DSeg ENDS
;********************************************
CSeg SEGMENT
    ASSUME CS:CSeg, DS:DSeg, ES:DSeg
Main PROC FAR
    PUSH    DS
    SUB    AX, AX
    PUSH    AX
    CALL    INIT

MOV AH,9
LEA DX,TabHead
    INT    21h
    CALL    crlf

    CALL    ReadMBR
CALL CHECK55AA
MOV DI,42H
    CALL    SetRec

    LEA    BX, MBR[DPT2+8]
    LEA    BP, BlockNum
    MOV    AX, [BX]
    MOV    MainCount, AX
    MOV    [BP], AX
    MOV    AX, [BX+2]
    MOV    MainCount+2, AX
    MOV    [BP+2], AX

ReadExt:
    CALL    ReadMBR
CALL CHECK55AA
CALL SetRec

LEA BX, MBR[DPT2+8]
LEA BP, BlockNum
MOV AX, [BX]
ADD AX, MainCount
MOV [BP], AX

MOV AX, [BX+2]
ADC AX, MainCount[2]
MOV [BP+2], AX
MOV AL,MBR[DPT2+4]
CMP AL,0
JNZ ReadExt
    CALL Exit
Main ENDP
;-----------------------------------
CHECK55AA PROC NEAR
lea bx,mbr
mov ax,[bx+dpt+40h]
cmp ax,0aa55h
jz s
mov ah,9
lea dx,ErrMsg
int 21h
CALL EXIT
s: ret
CHECK55AA ENDP
;-----------------------------------
SetRec PROC NEAR
call Prtparti

mov cx,11
s1: call spa
loop s1

call prtboot

mov cx,6
s2: call spa
loop s2

call getsys

mov cx,4
s3: call spa
loop s3

call prtstartc

mov cx,8
s4: call spa
loop s4

call prtendc

mov cx,8
s5: call spa
loop s5

call prtsize
call crlf
ret
SetRec ENDP
;-----------------------------------
ReadMBR PROC NEAR
    LEA    SI, PacketSize
    MOV    DL, 80h
    MOV    AH, 42h
    INT    13h
    RET
ReadMBR ENDP
;-----------------------------------
Init PROC NEAR
    MOV    AX, DSeg
    MOV    DS, AX
    MOV    ES, AX
push ax
push bx
    LEA    BX, BufferAddr
LEA AX, MBR
MOV [BX], AX
    MOV    [BX+2], DS
pop bx
pop ax
RET
Init ENDP
;-----------------------------------
Exit PROC NEAR
    CALL    crlf
    LEA    DX, QuitTip
    MOV    AH, 9
    INT    21h
    MOV    AH, 4ch
    INT    21H
Exit ENDP
;-----------------------------------
Prthead PROC NEAR
push ax
    push dx
    lea dx,TabHead
    mov ah,9h
int 21h
    pop dx
    pop ax
    ret
Prthead ENDP
;-----------------------------------
Prtparti PROC NEAR
    push ax
    push dx
    push bx
    lea bx,parti
    inc di
mov [bx],di
    mov dl,[bx]
    mov ah,2
    int 21h
    pop bx
    pop dx
    pop ax
    ret
Prtparti ENDP
;----------------------------------
Prtboot PROC NEAR
push bx
mov ch,2
mov bx,es:[dpt-1]
    call rotate
pop bx
    ret
Prtboot ENDP
;--------------------------------
Getsys PROC NEAR
push ax
mov al,es:[bx+dpt+4]
cmp al,04h
je prtfat16
cmp al,0bh
je prtfat32
cmp al,1bh
je prtfat32
cmp al,0ch
je prtfat32
cmp al,1ch
je prtfat32
cmp al,07h
je prtntfs
CALL EXIT ;cannt recognize
prtfat16:
push dx
lea dx,fat16
mov ah,9h
int 21h
pop dx
pop ax
ret
prtfat32:
push dx
lea dx,fat32
mov ah,9h
int 21h
pop dx
pop ax
ret
prtntfs:
push dx
lea dx,ntfs
mov ah,9h
int 21h
pop dx
pop ax
ret
Getsys ENDP
;------------------------------------
Prtstartc PROC NEAR
push ax
push bx
push cx
push di
add bx,dpt
mov di,bx
mov ch,4
mov cl,6
mov bh,es:[di+2]
shr bh,6
mov bl,es:[di+3]
call rotate
pop di
pop cx
pop bx
pop ax
ret
Prtstartc ENDP
;------------------------------------
Prtendc PROC NEAR
push ax
push bx
push cx
push di
add bx,dpt
mov di,bx
mov ch,4
mov cl,6
mov bh,es:[di+6]
shr bh,cl
mov bl,es:[di+7]    
call rotate
pop di
pop cx
pop bx
pop ax
ret
Prtendc ENDP
;------------------------------------
Prtsize PROC NEAR
    push ax
    push bx
    push cx
    push dx
mov ax,es:[bx+dpt+0eh]
    mov cl,4
    shr ax,cl
    mov dx,512
mul dx
    mov bx,ax
mov ch,4
call rotate
pop dx
pop cx
    pop bx
    pop ax
    ret
Prtsize ENDP
;-----------------------------
Crlf PROC NEAR
    push ax
    push dx
    mov dl,0dh
    mov ah,2
    int 21h
    mov dl,0ah
    mov ah,2
    int 21h
    pop dx
    pop ax
    ret
Crlf ENDP
;-----------------------------
Spa PROC NEAR
    push ax
    push dx
    mov dl,20h
    mov ah,2
    int 21h
    pop dx
    pop ax
    ret
Spa ENDP
;-----------------------------
Rotate PROC NEAR

mov cl,4
    rol bx,cl
    mov al,bl
    and al,0fh
    add al,30h
    cmp al,3ah
    jl printit
    add al,7h
printit:
    mov dl,al
    mov ah,2
    int 21h
    dec ch
    jnz rotate
    ret
Rotate ENDP
;------------------------------
CSeg ENDS
END Main


标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}