zoukankan      html  css  js  c++  java
  • SEH结构化异常处理02

    进程上的异常处理

    使用这个API注册一个函数为进程上的异常处理程序,当有异常发生,且根据上一篇异常处理流程轮到进程异常处理程序处理异常时,OS(系统)就会调用这个函数,类似与消息机制的回调。

    1 //一个进程只能有一个进程异常处理函数
    2 LPTOP_LEVEL_EXCEPTION_FILTER //上一个注册函数的地址
    3 WINAPI SetUnhandledExceptionFilter(
    4 __in  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter //要注册的函数
    5 );

    贴上代码

     1 ;******************************************
     2 ;coded by Rrouned
     3 ;******************************************
     4 ;例子1.演示Final型异常处理及参数获取
     5 ;******************************************
     6 
     7         .386
     8         .model flat,stdcall
     9         option casemap:none            
    10 
    11         
    12 ;编译所必需的头文件
    13 include        windows.inc
    14 include        user32.inc
    15 includelib    user32.lib
    16 include        kernel32.inc
    17 includelib    kernel32.lib
    18 
    19         
    20     .DATA
    21 szTitle         db "SEH例子-Final",0
    22 mes000          db "We are in the Exception handler,Kill Prog",0dh,0ah    ;0dh,0ah换行
    23                 db "in silence(Y)、noisily(N) or Continue(cancel)?",0
    24 messuc          db "Hello,We manage to return after exception!",0
    25 impossible      db "It's impossible...",0
    26     .DATA?
    27 var       dd ?
    28 ;;-----------------------------------------
    29     .CODE
    30 
    31 ;Final 型异常处理回调函数
    32 myFinalHandler proc     uses esi edi ebx lpExceptionPointers    ;说明程序当中会使用到esi等寄存器,保存一下寄存器的值
    33                                                                 ;lpExceptionPointers是myFinalHandler函数的参数
    34         invoke    MessageBox,0,addr mes000,addr szTitle,MB_ICONINFORMATION or MB_YESNOCANCEL
    35        
    36         .if     eax==IDYES
    37                 mov     eax,EXCEPTION_EXECUTE_HANDLER           ;处理完毕,不会显示对话框
    38         .elseif eax==IDNO
    39           orCannotHanle:                                        ;这是标号
    40                 mov     eax,EXCEPTION_CONTINUE_SEARCH           ;继续查找,显示对话框
    41         .elseif eax==IDCANCEL                                   ;处理完毕,修改CONTEXT上下文
    42                 mov     ebx,[lpExceptionPointers]               ;继续执行程序
    43                          ASSUME ebx:ptr EXCEPTION_POINTERS
    44                          ASSUME esi:ptr EXCEPTION_RECORD
    45                          ASSUME edi:ptr CONTEXT
    46                 mov     esi,[ebx].pExceptionRecord
    47                 mov     edi,[ebx].ContextRecord
    48                 test    [esi].ExceptionFlags,3
    49                 jnz     orCannotHanle                           
    50                 cmp     [esi].ExceptionCode,STATUS_ACCESS_VIOLATION
    51                 jne     orCannotHanle                           ;是内存读写异常吗
    52                 mov     [edi].regEip,offset suc_ret             ;改变返回地址
    53                 
    54                 mov     eax,EXCEPTION_CONTINUE_EXECUTION
    55         .endif
    56                 ret       
    57 myFinalHandler endp
    58 
    59 ;程序入口点
    60 _StArT:
    61         invoke    SetErrorMode,0          
    62     invoke    SetUnhandledExceptionFilter,offset myFinalHandler
    63         mov     [var],eax
    64         
    65         xor     eax,eax
    66         mov     [eax],eax               ;向地址0处写数据!产生异常
    67         nop                             ;永不可能执行下面的语句
    68         invoke    MessageBox,0,addr impossible,addr szTitle,MB_ICONINFORMATION
    69         nop
    70     suc_ret:                            ;返回后执行到这里
    71         invoke    MessageBox,0,addr messuc,addr szTitle,MB_ICONINFORMATION
    72     invoke  ExitProcess,0  
    73 
    74 END    _StArT
    View Code

    关于汇编程序的编译问题:

    masm32+nmake,makefile

    文件打包上传,每次在CMD下进入masm32的目录,运行var.bat,再进入code目录,修改nmake文件的name为要编译的文件名,nmake即可编译程序。

    MASM32.rar

  • 相关阅读:
    c# 时间戳转换为Datetime类型的时间
    WCF小白初试 错误之一:“有零个应用程序终结点”的解决办法
    对html制作新手的一些建议,大牛可以忽略
    Aspose.Words导出dt到word的问题
    获取checkboxlist选中的值以及绑定来自之前选中的来自数据库的值
    excel导入mssql数据库,支持excel2003--2010文件格式
    vscode调试angular
    asp.net web api 跨域问题
    WPF 完美截图 <二>
    EF错误
  • 原文地址:https://www.cnblogs.com/Rrouned/p/3362606.html
Copyright © 2011-2022 走看看