📄 761.html
字号:
0x10 协处理器出错 CR0的EM位置位时执行WAIT或ESCape指令<br />
0x11 对齐检查错误 对齐检查开启时(EFLAG对齐位置位)访问未对齐数据<br />
<br />
其它异常还包括获取系统启动时间服务int 0x2a、用户回调int 0x2b、系统服务int 0x2e、调试服务int 0x2d等系统用来实现自己功能的部分,都是通过异常的机制,触发方式就是执行相应的int指令。<br />
<br />
这里给出几个异常处理中重要的结构:<br />
<br />
陷阱帧TrapFrame结构(后面提到的异常帧ExceptionFrame结构其实也是一个KTRAP_FRAME结构):<br />
<br />
typedef struct _KTRAP_FRAME {<br />
ULONG DbgEbp; <br />
ULONG DbgEip; <br />
ULONG DbgArgMark; <br />
ULONG DbgArgPointer; <br />
ULONG TempSegCs;<br />
ULONG TempEsp;<br />
ULONG Dr0;<br />
ULONG Dr1;<br />
ULONG Dr2;<br />
ULONG Dr3;<br />
ULONG Dr6;<br />
ULONG Dr7;<br />
ULONG SegGs;<br />
ULONG SegEs;<br />
ULONG SegDs;<br />
ULONG Edx;<br />
ULONG Ecx;<br />
ULONG Eax;<br />
ULONG PreviousPreviousMode;<br />
PEXCEPTION_REGISTRATION_RECORD ExceptionList;<br />
ULONG SegFs;<br />
ULONG Edi;<br />
ULONG Esi;<br />
ULONG Ebx;<br />
ULONG Ebp;<br />
ULONG ErrCode;<br />
ULONG Eip;<br />
ULONG SegCs;<br />
ULONG EFlags;<br />
ULONG HardwareEsp; <br />
ULONG HardwareSegSs; <br />
ULONG V86Es; <br />
ULONG V86Ds; <br />
ULONG V86Fs;<br />
ULONG V86Gs; <br />
} KTRAP_FRAME;<br />
<br />
环境Context结构:<br />
<br />
typedef struct _CONTEXT {<br />
ULONG ContextFlags;<br />
ULONG Dr0;<br />
ULONG Dr1;<br />
ULONG Dr2;<br />
ULONG Dr3;<br />
ULONG Dr6;<br />
ULONG Dr7;<br />
FLOATING_SAVE_AREA FloatSave;<br />
ULONG SegGs;<br />
ULONG SegFs;<br />
ULONG SegEs;<br />
ULONG SegDs;<br />
ULONG Edi;<br />
ULONG Esi;<br />
ULONG Ebx;<br />
ULONG Edx;<br />
ULONG Ecx;<br />
ULONG Eax;<br />
ULONG Ebp;<br />
ULONG Eip;<br />
ULONG SegCs; <br />
ULONG EFlags; <br />
ULONG Esp;<br />
ULONG SegSs;<br />
UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];<br />
} CONTEXT;<br />
<br />
异常记录ExceptionRecord结构:<br />
<br />
typedef struct _EXCEPTION_RECORD {<br />
NTSTATUS ExceptionCode;<br />
ULONG ExceptionFlags;<br />
struct _EXCEPTION_RECORD *ExceptionRecord;<br />
PVOID ExceptionAddress;<br />
ULONG NumberParameters;<br />
ULONG_PTR ExceptionInformatio[EXCEPTION_MAXIMUM_PARAMETERS];<br />
} EXCEPTION_RECORD;<br />
<br />
当发生异常后,CPU记录当前各寄存器状态并在内核堆栈中建立陷阱帧TrapFrame,然后将控制交给对应异常的陷阱处理程序。当陷阱处理程序能处理异常时,比如缺页时通过调页程序MmAccessFault将页换入物理内存后通过iret返回发生异常的地方。但大多数无法处理异常,这时先是调用CommonDispatchException在内核堆栈中建立异常记录ExceptionRecord和异常帧ExceptionFrame。ExceptionRecord很重要,它记录了异常代码、异常地址以及一些其它附加的参数。然后调用KiDispatchException进行异常的分派。这个函数是WINDOWS下异常处理的核心函数,负责异常的分派处理。<br />
<br />
KiDispatchException的处理流程(每当异常被某个例程处理时处理的例程将返回TRUE到上一个例程,未处理则返回FALSE。当任何一个例程处理了异常返回TRUE时,则KiDispatchException正常返回):<br />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -