等待和 APC

注意

此页上为用户 APC 描述的行为适用于常规用户模式 APC 以及特殊的用户模式 APC。

代表用户模式调用方等待调度程序对象的线程必须准备好,以便用户 APC 或线程终止中断该等待。 当线程调用 KeWaitForSingleObjectKeWaitForMultipleObjectsKeWaitForMutexObject 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 先发制人地运行,不会导致 KeWaitForXxxKeDelayExecutionThread 返回。 系统在内部中断并恢复等待。 驱动程序通常不受此过程的影响,但驱动程序可能会错过暂时性条件的调度程序对象信号,例如调用 KePulseEvent