首页
社区
课程
招聘
[原创]读取MBR产生异常
发表于: 2009-3-29 00:27 3516

[原创]读取MBR产生异常

2009-3-29 00:27
3516
.386
                .model flat,stdcall
                option casemap:none
;********************************************************************
include     \masm32\include\windows.inc
include     \masm32\include\user32.inc
include     \masm32\include\kernel32.inc
includelib  \masm32\lib\user32.lib
includelib  \masm32\lib\kernel32.lib
;********************************************************************
                .data
szTitle         db  'ReadMBR',0               
szDrivePath     db  '\\.\PHYSICALDRIVE0',0
;********************************************************************           
                .data?
buffer          db 513 dup(0)
hFile           dd  ?
numOfRead       dd  ?
;********************************************************************
                .code
start:
                invoke CreateFile,addr szDrivePath,\
                GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL
                .if    eax != INVALID_HANDLE_VALUE
                       mov  hFile,eax
                       invoke SetFilePointer,hFile,0,NULL,FILE_BEGIN
                       .if    eax
                              invoke ReadFile,hFile,addr buffer,\
                              512,addr numOfRead,NULL
                              .if   eax
                                    invoke MessageBox,NULL,offset buffer,\
                                    offset szTitle,MB_OK
                                    invoke ExitProcess,NULL
                               .endif
                        .endif
                  .endif
                  invoke CloseHandle,hFile
                  end start              
我想用以上代码读取MBR的信息,为什么一运行就产生异常被终止。。。望高人指点。。。。
(以管理员身份登陆)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
怎没人回答答,都不明白这个问题,都是菜鸟级别。。。。?
2009-3-29 10:27
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
调试了一下,异常,是因为int3指令导致的。

这条int3指令应该是汇编器自动插入的,为了调试用。

你把ExitProcess放到CloseHandle后面就可以了。

程序运行时,SetFilePointer返回0,所以直接转到CloseHandle处执行,结果后面没有代码,汇编器在这里插入了一条int3指令,结果就触发了异常。

也就是说,你的程序流程不正确。用伪C描述一下,应该是这样

if ( SetFilePointer() )
{
    ReadFile();
}

CloseHandle();
ExitProcess();

Assert(false);

你的程序是这样的:

if ( SetFilePointer() )
{
    ReadFile();
    ExitProcess();
}

CloseHandle();
Assert(false);


其中的Assert(false)就会触发异常。

如果系统没有JIT调试器,或者程序不是在调试器中运行,或者程序没有自己捕获异常,int3指令只好使程序退出。
2009-3-29 14:28
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
虽然不很满意,但仍非常感谢3楼的解答~~~
2009-3-29 19:07
0
雪    币: 236
活跃值: (16)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
那你想要什么样的答案..
2009-3-29 20:23
0
游客
登录 | 注册 方可回帖
返回
//