
APC
文章平均质量分 88
My classmates
QQ349561280
展开
-
1.APC机制
线程是不能被“杀掉”、“挂起”、“恢复”的,线程在执行的时候自己占据着CPU,别人怎么可能控制它呢? 举个极端的例子:如果不调用API,屏蔽中断,并保证代码不出现异常,线程将永久占用CPU,何谈控制呢?所以说线程如果想“死",一定是自己执行代码把自己杀死,不存在“他杀”这种情况! 那如果想改变一个线程的行为该怎么办呢? 可以给他提供一个函数,让它自己去调用,这个函数就是APC (Asyncrone...原创 2018-10-22 22:51:50 · 464 阅读 · 0 评论 -
5.用户APC执行过程
当产生系统调用、中断或者异常,线程在返回用户空间前都会调用, _KiServiceExit函数,在_KiServiceExit会判断是否有要执行的用户APC,如果有则调用KiDeliverApc函数(第一个参数为1)进行处理。 执行用户APC时的堆栈操作 处理用户APC要比内核APC复杂的多,因为,用户APC函数要在用户空间执行的,这里涉及到大量换栈的操作: 当线程从用户层进入内核层时,要保留原来...原创 2018-10-25 09:55:58 · 1837 阅读 · 2 评论 -
2.备用APC队列
如果想让线程做什么事情,就给它的APC队列里面挂一个APC。 kd> dt _kthread nt!_KTHREAD ... +0x034 ApcState : _KAPC_STATE//APC ... +0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE//APC指针 ... +0x14c SavedApcState : _K...原创 2018-10-23 12:18:04 · 389 阅读 · 0 评论 -
3.APC的挂入过程
无论是正常状态还是挂靠状态,都有两个APC队列,一个内核队列,一个用户队列。 每当要挂入一个APC函数时,不管是内核APC还是用户APC,内核都要准备一个KAPC的数据结构,并且将这个KAPC结构挂到相应的APC队列中。 kd> dt _kapc nt!_KAPC +0x000 Type //类型APC类型为0x12 +0x002 Size //本结构体的大小0x30...原创 2018-10-23 22:01:09 · 711 阅读 · 0 评论 -
4.内核APC执行过程
APC函数的执行与插入并不是同一个线程: 在A线程中向B线程插入一个APC,插入的动作是在A线程中完成的,但什么时候执行则由B线程决定!,所以叫“异步过程调用" 内核APC函数与用户APC函数的执行时间和执行方式也有区别,我们本节课主要学习内核APC的执行过程。 执行点1:线程切换 SwapContext //判断是否有内核APC KiSwapThread KiDelicerApc /...原创 2018-10-24 16:16:11 · 1847 阅读 · 0 评论