APC队列
kd> dt _KAPC
nt!_KAPC
+0x000 Type : Int2B //APC类型为0x12
+0x002 Size : Int2B //大小为0x30
+0x004 Spare0 : Uint4B
+0x008 Thread : Ptr32 _KTHREAD//目标进程
+0x00c ApcListEntry : _LIST_ENTRY //APC队列挂的位置
+0x014 KernelRoutine : Ptr32 void //执行完毕后,用来释放APC
+0x018 RundownRoutine : Ptr32 void
+0x01c NormalRoutine : Ptr32 void //用户APC总入口 |真正的内核APC函数
+0x020 NormalContext : Ptr32 Void//内核APC:NULL;用户APC:真正用户APC函数
+0x024 SystemArgument1 : Ptr32 Void//参数
+0x028 SystemArgument2 : Ptr32 Void//参数
+0x02c ApcStateIndex : Char//挂那个队列,有4个值
+0x02d ApcMode : Char//用户APC函数内核APC
+0x02e Inserted : UChar//表示本APC是否已经挂入APC队列
插入流程
QueueUserApc->NtQueueApcThread->KeInitializeApc(初始化KAPC结构体)->KeInsertQueueApc->KiInsertQueueApc(将KAPC插入指定APC队列)
KeInitializeApc(内核函数)
VOID KeInitializeApc
(
IN PKAPC Apc,//指针
IN PKTHREAD Thread,//目标进程
IN KAPC_ENVIRONMENT TargrtEnvironment,//0.1.2.3四种状态
IN PKKERNEL_ROUTINE KernelRiutine,//销毁KAPC的函数地址
IN PKRUNDOWN_ROUTINE RundownRoution OPTIONAL,
IN PKNORMAL_ROUTINE NormalRoutine,//APC总入口
IN KPROCESSOR_MODE Mode,//选择插入那个队列
IN PVOID Context//内核APC:NULL。用户APC:真正的内核APC函数
KiInsertQueueApc函数说明
ApcStateInder
与KTHREAD(+0X165)的属性同名,但含义不同
有4个值:0 原始环境 1挂靠环境
2当前环境 3插入APC时的当前环境
KiServiceExit函数
这个函数是系统调用,异常,中断返回用户空间的必经之路;
KiDeliverApc函数
负责执行APC函数