线程结构异常处理

易语言 2020-06-05 13:29:18

' ExceptionContinueSearch(1) -> 回调函数拒绝处理这个异常,系统将通过EXCEPTION_REGISTRATION结构的prev字段得到前一个回调函数的地址并调用它.
' ExceptionNestedException(2) -> 回调函数在执行中又发生了新的异常,即发生了嵌套的异常
' ExceptionCollidedUnwind(3) -> 发生了嵌套的展开操作.
指针到EXCEPTION_RECORD结构 (_exRecord, _lpExceptionRecord, 24)
指针到CONTEXT结构 (_context, _lpContextRecord, 716)
寄存器信息 = “EAX 0x” + 十到十六 (_context.Eax) + #换行符 + “ECX 0x” + 十到十六 (_context.Ecx) + #换行符 + “EDX 0x” + 十到十六 (_context.Edx) + #换行符 + “EBX 0x” + 十到十六 (_context.Ebx) + #换行符 + “ESP 0x” + 十到十六 (_context.Esp) + #换行符 + “EBP 0x” + 十到十六 (_context.Ebp) + #换行符 + “ESI 0x” + 十到十六 (_context.Esi) + #换行符 + “EDI 0x” + 十到十六 (_context.Edi) + #换行符 + “EIP 0x” + 十到十六 (_context.Eip) + #换行符 + #换行符 + “ES 0x” + 十到十六 (_context.SegEs) + #换行符 + “CS 0x” + 十到十六 (_context.SegCs) + #换行符 + “SS 0x” + 十到十六 (_context.SegSs) + #换行符 + “DS 0x” + 十到十六 (_context.SegDs) + #换行符 + “FS 0x” + 十到十六 (_context.SegFs) + #换行符 + “GS 0x” + 十到十六 (_context.SegGs)
.如果真 (_exRecord.ExceptionCode = #STATUS_ACCESS_VIOLATION)
.判断开始 (_exRecord.ExceptionInfomation [1] = 0)
信息框 (“捕获到一个非法访问异常” + #换行符 + “异常地址:0x” + 十到十六 (_context.Eip) + #换行符 + #换行符 + 寄存器信息, #信息图标, “错误信息”)
.判断 (_exRecord.ExceptionInfomation [1] = 1)
信息框 (“捕获到一个非法写入异常” + #换行符 + “异常地址:0x” + 十到十六 (_context.Eip) + #换行符 + #换行符 + 寄存器信息, #信息图标, “错误信息”)
.默认
信息框 (“捕获到一个未知的ACCESS_VIOLATION异常” + #换行符 + “异常地址:” + 十到十六 (_context.Eip) + #换行符 + #换行符 + 寄存器信息, #信息图标, “错误信息”)
.判断结束
汇编_写到内存 (_lpContextRecord + 184, 到整数 (_context.Eip + 5))
返回 (0)
.如果真结束
.如果真 (_exRecord.ExceptionCode = #STATUS_INTEGER_DIVIDE_BY_ZERO)
信息框 (“捕获到一个除0异常” + #换行符 + “异常地址:” + 十到十六 (_context.Eip) + #换行符 + #换行符 + 寄存器信息, #信息图标, “错误信息”)
汇编_写到内存 (_lpContextRecord + 184, 到整数 (_context.Eip + 6))
返回 (0)
.如果真结束
返回 (1)