等待和 APC
注意
此页上为用户 APC 描述的行为适用于常规用户模式 APC 以及特殊的用户模式 APC。
代表用户模式调用方等待调度程序对象的线程必须准备好,以便用户 APC 或线程终止中断该等待。 当线程调用 KeWaitForSingleObject、KeWaitForMultipleObjects、KeWaitForMutexObject 或 KeDelayExecutionThread 时,操作系统可以将线程置于等待状态。 通常,线程保持等待状态,直到操作系统可以完成调用方请求的操作。 但是,如果调用方指定 WaitMode = UserMode,则操作系统可能会中断等待。 在这种情况下,例程会退出,其 NTSTATUS 值为 STATUS_USER_APC。
使用 WaitMode = UserMode 调用上述四个例程之一的任何驱动程序都必须准备好接收返回值STATUS_USER_APC。 驱动程序必须使用STATUS_USER_APC完成其当前操作,并将控制权返回到用户模式。
操作系统中断等待的确切情况取决于例程的 Alertable 参数的值。 如果警报 = 为 TRUE,则等待是可警报的等待。 否则,等待是不可警报的等待。 操作系统中断可警报的等待仅传送用户 APC。 操作系统会中断两种类型的等待以终止线程。
下表说明了不同参数设置、等待和用户 APC 传递之间的关系。
参数 | 等待中断? | 用户 APC 已交付? |
---|---|---|
警报 TRUE = WaitMode = UserMode | 是 | 是 |
警报 TRUE = WaitMode = KernelMode | 是 | 否 |
警报 FALSE = WaitMode = UserMode | 是的,对于线程终止。 否,对于用户 APC。 | 否 |
警报 FALSE = WaitMode = KernelMode | 否 | 否 |
可以为线程禁用内核 APC。 如果为线程禁用内核 APC,则也会禁用该线程的用户 APC 传递和线程终止。 有关如何禁用 APC 的详细信息,请参阅 禁用 APC。
警报是操作系统内部很少使用的机制,也可以中断可警报的等待状态。 无论 WaitMode 参数的值如何,警报都可以在警报 = TRUE 时中断等待。 等待例程返回一个值STATUS_ALERTED。
请注意,内核 APC 先发制人地运行,不会导致 KeWaitForXxx 或 KeDelayExecutionThread 返回。 系统在内部中断并恢复等待。 驱动程序通常不受此过程的影响,但驱动程序可能会错过暂时性条件的调度程序对象信号,例如调用 KePulseEvent。