VEH
1. VEH链表结构
typedef struct _VECTXCPT_CALLOUT_ENTRY {
LIST_ENTRY Links;
PVECTORED_EXCEPTION_HANDLER VectoredHandler;
} VECTXCPT_CALLOUT_ENTRY, *PVECTXCPT_CALLOUT_ENTRY;
VEH链表是一个双向循环链表
2. RtlCallVectoredExceptionHandler函数分析
KiDispatchException流程图中分析了KiDispathcException函数处理异常并重新返回零环的过程, KiDispathcException首先调用RtlDispatchException, 在RtlDispatchException中首先调用RtlCallVectoredExceptionHandler来遍历VEH来处理异常.
首先遍历VEH链表, 依次执行VEH, 如果异常被成功处理就返回, 否则就一直遍历, 如果VEH无法处理异常, 那就交给SEH处理.
3. RtlAddVectoredExceptionHandler函数分析
RtlAddVectoredExceptionHandler有两个参数:
- 第一个参数(FirstHandler)决定新节点插入的位置
- 如果第一个参数为0(False), 尾插
- 如果第一个参数为1(True), 头插
- 第二个参数(VectoredHandler)是VEH的处理函数
如果插入成功, 该函数将插入成功的VEH节点指针返回.
4. RtlRemoveVectoredExceptionHandler函数分析
RtlRemoveVectoredExceptionHandler函数有一个参数, 该参数是一个VECTXCPT_CALLOUT_ENTRY结构体指针, 该函数首先遍历VEH, 找到要被删除的那个, 将其从链表中摘除, 然后释放VEH结构体的内存.
如果找到并成功删除了返回1, 如果没有找到则返回0.
5. VEH HOOK
后面补上