;**************************************************
;ReadMBROnDiskNT.asm
;功能:Windows NT、2K、XP中读MBR
;
;**************************************************
.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
;ReadMBROnDiskNT.asm
;功能:Windows NT、2K、XP中读MBR
;
;**************************************************
.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