Win32汇编_异常_筛选器

本文提供了一个使用SetUnhandledExceptionFilter进行异常处理的示例代码。通过设置异常回调函数,当程序中发生未处理的异常时,可以捕获异常并采取相应措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.386
.model flat, stdcall
option casemap:none

include    windows.inc
include    user32.inc
include    kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
lpOldHandler    dd      ?

.const
szMsg            db      '
异常发生位置: %08X, 异常代码: %08X, 标志: %08X', 0
szSafe           db      '
回到安全地方!!!', 0
szCaption       db      '
筛选器异常处理的例子!!!', 0

.code

_Handler        proc        _lpExceptionPoint
    LOCAL @szBuffer[256]:byte
   
    pushad
    mov      esi, _lpExceptionPoint
    assume  esi: ptr EXCEPTION_POINTERS
    mov      edi, [esi].ContextRecord
    mov      esi, [esi].pExceptionRecord
    assume  esi: ptr EXCEPTION_RECORD, edi: ptr CONTEXT
    invoke   wsprintf, addr @szBuffer, addr szMsg, [edi].regEip, [esi].ExceptionCode, [esi].ExceptionFlags
    invoke   MessageBox, NULL, addr @szBuffer, NULL, MB_OK
    ;
设置跳到哪行代码去继续执行,
    mov      [edi].regEip, offset _SafePlace
    assume  esi: nothing, edi: nothing   
    popad
    ;
返回值设置为继续执行代码
    mov      eax, EXCEPTION_CONTINUE_EXECUTION
    ret
_Handler endp

start:
    ;
设置异常回调函数
    invoke  SetUnhandledExceptionFilter, addr _Handler
    ;
保存原先的异常回调函数
    mov     lpOldHandler, eax
    xor      eax, eax
    ;
产生异常,就会跳到上边设置的异常回调函数去执行
    mov     dword ptr [eax], 0
  
_SafePlace:
    invoke  MessageBox, NULL, addr szSafe, addr szCaption, MB_OK
    ;
设置回原先的异常回调函数
    invoke  SetUnhandledExceptionFilter, lpOldHandler
    invoke  ExitProcess, NULL
   
    end     start

转载于:https://www.cnblogs.com/w413133157/archive/2010/08/20/1804517.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值