基于元神操作系统实现NTFS文件操作(二)

1. 背景

本文主要介绍MBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析MBR的目的是定位到NTFS磁盘分区进行文件操作,所以只解析了MBR的分区表部分,至于MBR的其它部分,可以参考相关文档进行理解。

2. 方法

(1)调用元神操作系统的API读取MBR

使用API_READ_DISK_SECTOR来调用元神操作系统的API,代码如下所示:

use32

START:
	pusha
	
	call read_disk_mbr
	
	popa
	iret

include 'api_def.inc'

OS_API equ 0x00030C16
API_PARAM equ 0x03000000
SEG_BASE equ 0x00040000
cursor_x equ 0x02004B10
cursor_y equ 0x02004B12
	
sector_buff: times 512 db 0
read_disk_mbr:
	pusha
	mov edi, API_PARAM
	mov dword [fs:edi], API_READ_DISK_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	mov dword [fs:edi+8], 0		;parameter_1: sector no.
	
	xor eax, eax
	mov ax, ds
	add eax, SEG_BASE
	mov bh,byte [fs:eax+7]
    mov bl,byte [fs:eax+4]
    shl ebx,16
    mov bx,word [fs:eax+2]
	add ebx, sector_buff
	mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer

	call pword [fs:OS_API]
	
	mov eax, 512
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	mov esi, [fs:edi+12]
	call print_bytes_hex
	
	add word [fs:cursor_y], 20

	popa
	ret

;print hex bytes
;input:
;	eax: byte count to print
;	ebx: y coordinate to print (from 0)
;	ecx: x coordinate to print (from 0)
;	esi: buffer storing data to print
print_bytes_hex:
	pusha
	imul edi,ebx,80*2	;calculate coordinate
	add edi,ecx
	add edi,ecx
	
	mov ecx,eax
	mov ah,0x0F
 .next_char:
	mov bl,byte [fs:esi]
 .hex_char:
	mov al,bl
	and al,0x0F
	add al,0x30
	cmp al,0x39
	jbe .num_char
	add al,'A'-0x30-10
 .num_char:
	mov [gs:edi+2],ax
	shr ebx,4
	mov al,bl
	and al,0x0F
	add al,0x30
	cmp al,0x39
	jbe .num_char2
	add al,'A'-0x30-10
 .num_char2:
	mov [gs:edi],ax
	mov al,' '
	mov [gs:edi+4],ax
	add edi,6
	inc esi
	loop .next_char
	
	popa
	ret

上述代码将磁盘的第一个扇区(0号扇区)的内容读取到sector_buff缓冲区中,并以十六进制形式进行显示,结果如下图所示:

该图中显示的内容就是磁盘第一个扇区的内容,即MBR的内容。

注意:此处打印MBR内容的操作仅为讲解需要,后续操作追加之前应当注释掉read_disk_mbr函数中对于print_bytes_hex调用相关的部分,即注释掉call pword [fs:OS_API]之后的部分。另外,该例所示代码的详细解释可参考前面的博文。

(2)解析MBR

MBR的内容共有512字节,前446个字节为引导代码,之后的64字节为磁盘分区表,最后2个字节为标记字节(固定为55 AA)。

本文主要解析中间64字节的分区表。该表包含4个项,每个项为16字节,所以通过该分区表可以表示4个磁盘分区,即一个磁盘最多可以分4个区。更多的分区需要扩展分区的支持,不在本文介绍的范围之内,需要的可以参考相关文档自行实现。

每个分区表项占16个字节。第一个字节为启动标志,值为80H时表示该分区包含操作系统,即操作系统安装在该分区中,值为00H时表示该分区不包含操作系统;第2-4字节表示该分区开始的磁头号、扇区号、柱面号;第5字节表示该分区的文件系统类型,值为0BH时表示FAT32文件系统,值为07H时表示NTFS文件系统;第6-8字节表示该分区结束的磁头号、扇区号、柱面号;第9-12字节表示该分区首扇区的相对扇区号;第13-16字节表示该分区的总扇区数。

在分区表项中,提供了两种方式对分区进行定位:第一种是使用磁头号、扇区号、柱面号进行定位;第二种是使用分区首扇区的相对扇区号进行定位。对于大容量的磁盘,目前主要使用的是第二种方式。

结合上面的截图,4个分区表项中只有前两个有内容,后两个表项全是0,所以测试磁盘中有两个分区(常见的为C盘和D盘)。第一个表项的内容为“80 01 01 00 07 EF FF FF 3F 00 00 00 C1 CE D4 01”,第一个字节为80H,表示操作系统安装在该分区中;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为3F 00 00 00,表示该分区首扇区的相对扇区号为0x0000003F,即该分区的第一个扇区为0x3F号扇区(即63号扇区);第13-16字节为C1 CE D4 01,表示该分区的总扇区数为0x01D4CEC1,即该分区包含30,723,777个扇区,合计为15,730,573,824个字节,约为15GB。

类似的,第二个表项的内容为“00 00 C1 FF 07 EF FF FF 00 CF D4 01 F0 48 D3 02”,第一个字节为00H,表示该分区不包含操作系统;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为00 CF D4 01,表示该分区的首扇区的相对扇区号为0x01D4CF00,即该分区的第一个扇区为0x01D4CF00扇区;第13-16字节为F0 48 D3 02,表示该分区的总扇区数为0x02D348F0,即该分区包含47,401,200个扇区,合计为24,269,414,400个字节,约为24GB。

3. 总结

本文介绍了NTFS文件操作的第一步,即解析MBR。通过解析MBR可以获知磁盘的分区信息,并定位到目标分区,以供后续读取DBR使用。

安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

De-Chang Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值