NTKERNELAPI
VOID
KeInitializeApc (
IN PRKAPC Apc,
IN PKTHREAD Thread,
IN KAPC_ENVIRONMENT Environment,
IN PKKERNEL_ROUTINE KernelRoutine,
IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,
IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,
IN KPROCESSOR_MODE ApcMode,
IN PVOID NormalContext
);
简单的说下这个函数的使用(参考KiDeliverApc<Apc执行函数>)
如果插内核apc
要把apcmode设置成kernelmode
然后设置kernelroutine和normalroutine这2个参数是关键
1.在这种情况下如果normalroutine设置成null,而kernelroutine设置成非null
那么这种情况是一个特殊的内核apc
2.在这种情况下如果normalroutine和kernelroutine都为非null
那么这种情况下先执行kernelroutine,之后再检查normalroutine是否为null,不为null的话,在执行normalroutine
不可能出现其他情况
如果是用户apc
要把apcmode设置成usermode
在这种情况下kernelroutine和normalroutine都不能为null
那么这种情况下先执行kernelroutine,之后再检查normalroutine是否为null,不为null的话,在把normalroutine当成参数执行KiInitializeUserApc函数
根据KiDeliverApc函数的流程 系统在执行用户Apc之前 都会检查一遍内核Apc的队列 如果存在Apc 就将其执行 然后才检查用户Apc队列还有UserApcPending这个标志 满足才执行用户Apc