编译器扩展SEH(1)

编译器支持的SEH

	__try{
    
    			--------------------------------------->1.挂入链表

	}__except(过滤表达式)--------------------------------->2.异常过滤
	{
    
    

异常处理程序      ------------------------------------>异常处理程序

	}

过滤表达式规则:

  1. EXCEPTION_EXECUTE_HANDLER(1)执行except代码
  2. EXCEPTION_CONTINUE_SEARCH(0)寻找下一个异常处理函数
  3. EXCEPTION_CONTINUE_EXECUTION(-1)返回出错位置重新执行

过滤表达式的3种情况

常量值:

__except (1)

情况:去执行except内部代码
表达式:

__except (GetExceptionCode()==0xC0000094?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH) 

异常错误是除零异常的话,返回EXCEPTION_EXECUTE_HANDLER(去执行except内部代码),不是除零异常的话就返回EXCEPTION_CONTINUE_SEARCH(寻找下一个异常处理函数)

调用函数

__except (ExceptFilter(GetExceptionInformation()))

这需要看函数内部所进行的操作,这和前面所述SEH和VEH那些执行流程都一样,结构体和参数属性都一样

直接写常量值

代码:

#include<Windows.h>
#include<iostream>




void  TestException(){
    
    

	__try{
    
    
		__asm {
    
    
			xor edx,edx
			xor ecx,ecx
			mov eax,0x10
			idiv ecx//EDX:EAX除以ECX
		}
	}
		__except (1) {
    
    
	printf("如果出现异常,我来处理");
	}

}

int main() {
    
    
	TestException();
}

在这里插入图片描述

表达式

代码:

#include<Windows.h>
#include<iostream>


void  TestException(){
    
    

	__try{
    
    
		__asm {
    
    
			xor edx,edx
			xor ecx,ecx
			mov eax,0x10
			idiv ecx//EDX:EAX除以ECX
		}
	}
__except (GetExceptionCode()==0xC0000094?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH)
 {
    
    
	printf("如果出现异常,我来处理");
	}

}

int main() {
    
    
	TestException();
}

在这里插入图片描述

调用函数

代码

#include<Windows.h>
#include<iostream>

int ExceptFilter(LPEXCEPTION_POINTERS pExceptionInfo) {
    
    
	pExceptionInfo->ContextRecord->Ecx = 1;
	return EXCEPTION_CONTINUE_EXECUTION;
}


void  TestException(){
    
    

	__try{
    
    
		__asm {
    
    
			xor edx,edx
			xor ecx,ecx
			mov eax,0x10
			idiv ecx//EDX:EAX除以ECX
		}
	}
	__except (ExceptFilter(GetExceptionInformation())) {
    
    
	printf("如果出现异常,我来处理");
	}


}
int main() {
    
    
	TestException();
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/113845067