硬盘分区信息显示(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)
功能描述:
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)
回复Comments
作者:
{commentrecontent}