MBR,全称为Master Boot Record,即硬盘的主引导记录。 

 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。  

硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic  number,占2个字节,固定为55AA。

 

我们来实现在VC++下面实现读取MBR。

C++内联汇编

在C++代码中插入__asm {}即可

 

 
 
 
;**************************************************
.386p
.model flat, stdcall      ;平坦内存模式
option casemap :none   ; 大小写敏感
;***************************************************
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
      
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

ShowError proto :DWORD
ShowBuffer proto 

.data                            ;数据段
	FileName db '\\.\PHYSICALDRIVE0',0  ;打开第一个物理硬盘
	align 4				;双字对齐
	readed	dd  0          ;实际读出的字节数
	Buffer    db  512 dup (0)  ;存放读出的数据的缓冲区
	hFile	     dd  0          ;句柄存放处
	
	Caption		db 'NT中读写物理磁盘',0      ;Caption的字符串
	ErrCreate	db   '建文件错,该程序不能在Win9X下执行!',0   ;出错信息
	ErrRead		db '读盘错误!',0                           ;出错信息
	
	ShowText	db   4096*3 dup (0)               ;转换后用于显示的字符串
	Number	db '0123456789ABCDEF'           ;16进制数转换为ACSII码要用到的数据

.code                                                ;代码段
main:
	;建立文件
	invoke CreateFile,offset FileName,\
GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,\
NULL,OPEN_EXISTING,NULL,NULL
	mov  [hFile],eax
	cmp  eax,INVALID_HANDLE_VALUE
	jnz  read
	invoke ShowError,offset ErrCreate            ;显示错误信息
read:                                           	;读数据
	invoke ReadFile,eax,offset Buffer,512,offset readed,NULL
	cmp  eax,0
	jnz  show
	invoke ShowError,offset ErrRead		    ;显示错误信息
show:                                           	
	invoke ShowBuffer                           ;显示读出的内容
	invoke CloseHandle ,[hFile] 	               ;关闭文件句柄
	invoke ExitProcess,0                        	;退出
ShowError  proc ,MESSAGE:DWORD		               ;显示出错信息并退出
	invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
	cmp  [hFile],0
	jz   ShowErrorEnd
	invoke CloseHandle ,[hFile]	;关闭句柄
ShowErrorEnd:
	invoke ExitProcess,0		;退出
ShowError  endp

ShowBuffer  proc				            ;显示所读出的信息
	                                        ;把16进制数据转换成ASCII码的形式
	mov  esi,offset Buffer		;数据
	mov  edi,offset ShowText 	;转换后的数据
	mov  ebx,offset Number
	mov  ecx,0
	xor  eax,eax
Again:
	cmp  [readed],0
	jz   ConversionEnd
	dec  [readed]
	mov  al,[esi]
	push eax
	         shr  eax,4			         ;高4位
	mov  al,[ebx+eax]
	mov  byte ptr[edi],al
	         inc  edi
	pop  eax
	and  eax,0FH			    ;低4位
	         mov  al,[ebx+eax]
	mov  byte ptr[edi],al
inc  edi
	         mov  byte ptr[edi],' '		;空格
	inc  edi
	         inc  esi
	         inc  ecx
	cmp  ecx,16
	jnz  Again
	xor  ecx,ecx
	mov  byte ptr[edi-1],13		;是回车
	jmp  Again
ConversionEnd:
;显示转换后的字符串
	invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
	ret
ShowBuffer  endp
	end main