异步 过程调用 (APC) 是在特定线程的上下文中异步执行的函数。当 APC 排队到线程时,系统会发出软件中断。下次计划线程时,它将运行 APC 函数。每个线程都有自己的 APC 队列。应用程序通过调用 QueueUserAPC 函数将 APC 排队到线程。调用线程在对 QueueUserAPC 的调用中指定 APC 函数的地址。APC 的队列是线程调用 APC 函数的请求。
APC分类
系统生成的 APC 称为 内核模式 APC。
应用程序生成的 APC 称为 用户模式 APC。
注意:线程必须处于可警报状态才能运行用户模式 APC。
用户模式APC报警状态
当用户模式 APC 排队时,它排队的线程不会定向到调用 APC 函数,除非它处于可警报状态。线程在调用 SleepEx、 SignalObjectAndWait、 MsgWaitForMultipleObjectsEx、 WaitForMultipleObjectsEx 或 WaitForSingleObjectEx 函数时进入可警报状态:
-
Sleep
-
SleepEx
-
MsgWaitForMultipleObjects
-
MsgWaitForMultipleObjectsEx
-
WaitForSingleObject
-
WaitForSingleObjectEx
-
WaitForSingleObjects
-
WaitForSingleObjectsEx
-
SignalObjectAndWait
线程挂起
如果在 APC 排队之前满足等待,则线程不再处于可警报等待状态,因此不会执行 APC 函数。但是,APC 仍处于排队状态,因此当线程调用另一个可警报等待函数时,将执行 APC 函数。也就是说要使用APC函数需要存在一个挂起的线程。
参考
-
https://learn.microsoft.com/zh-cn/windows/win32/sync/asynchronous-procedure-calls
原文始发于微信公众号(蟹堡安全团队):异步过程调用
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论