VEH(向量化异常处理)

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, 如果异常被成功处理就返回, 否则就一直遍历, 如果VEH无法处理异常, 那就交给SEH处理.

3. RtlAddVectoredExceptionHandler函数分析

VEH(向量化异常处理)

RtlAddVectoredExceptionHandler有两个参数:

  • 第一个参数(FirstHandler)决定新节点插入的位置
    • 如果第一个参数为0(False), 尾插
    • 如果第一个参数为1(True), 头插
  • 第二个参数(VectoredHandler)是VEH的处理函数

如果插入成功, 该函数将插入成功的VEH节点指针返回.

4. RtlRemoveVectoredExceptionHandler函数分析

VEH(向量化异常处理)

RtlRemoveVectoredExceptionHandler函数有一个参数, 该参数是一个VECTXCPT_CALLOUT_ENTRY结构体指针, 该函数首先遍历VEH, 找到要被删除的那个, 将其从链表中摘除, 然后释放VEH结构体的内存.

如果找到并成功删除了返回1, 如果没有找到则返回0.

5. VEH HOOK

后面补上

上一篇:SQL if 和 case when查询示例


下一篇:对哈希表(HashMap)的理解 哈希表的底层原理