-
-
[求助]问个暂停线程APC相关的问题
-
发表于:
2010-9-17 15:45
5975
-
SuspendThread过程:
KeInitializeApc(&Thread->SuspendApc,
Thread,
OriginalApcEnvironment,
(PKKERNEL_ROUTINE)KiSuspendNop,
(PKRUNDOWN_ROUTINE)KiSuspendRundown,
KiSuspendThread,
KernelMode,
NULL);
KiInsertQueueApc(&Thread->SuspendApc, RESUME_INCREMENT);
说明:
内核态的KiSuspendNop什么都没有做,因此暂停是由KiSuspendThread实现的,
而APC的执行是在内核返回用户层时KiDeliverApc调用的,且用户态例程调用必须满足条件,
PreviousMode == UserMode &&Thread->ApcState.UserApcPending != FALSE
第一个条件肯定不满足的,APC初始化的时候是KernelMode,(也可能是我理解错误,此PreviousMode非彼PreviousMode),
第二个不好说
第三如果线程不进内核,或者进了不出来,无法调用KiDeliverApc,那线程也暂停不了
===============
我差不多每次调用SuspendThread都是即时成功,但为什么自己插APC的时候还得等他Alertable的时候呢?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)