; ************************************************** ; 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.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\advapi32.libShowError proto :DWORDShowBuffer 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 endpShowBuffer 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
转载于:https://www.cnblogs.com/yequan/archive/2009/12/24/1631717.html
相关资源:数据结构—成绩单生成器