我们主要围绕这个主线展开:
异常记录异常分发异常处理这种属于CPU产生的异常
int main() { int a = 10; int b = 0; int val = a / b; }这种属于软件模拟的异常
void a() { throw 1; } int main() { a(); }下面跟一下除0异常处理执行过程,ida中Alt+T搜索_IDT
CommonDispatchException这个函数就是构建一个_EXCEPTION_RECORD结构体并赋值
typedef struct _EXCEPTION_RECORD//记录异常信息 { DWORD ExceptionCode; //异常码 DWORD ExceptionFlags; //异常标志 cpu 0 ,软件模拟 1,嵌套异常10h ... struct _EXCEPTION_RECORD* ExceptionRecord; //下一个异常 一般为NULL 除非出现嵌套异常 PVOID ExceptionAddress; //发生异常的指令地址 DWORD NumberParameters; //参数个数 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; //附加参数指针 };0xE06D7363就是异常码,软件模拟的异常码是固定的依赖与编译环境。
RaiseException
KiRaiseException行为
EXCEPTION_RECORD.ExceptionCode最高位清零用于区分CPU异常。调用 KiDispatchException 开始分发异常