[cpp] view plaincopy
- 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 {}即可
[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
- ;**************************************************
- .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
|