注释
此页中描述的用户 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 已交付了吗? |
|---|---|---|
| Alertable = TRUEWaitMode = UserMode | 是的 | 是的 |
| Alertable = TRUEWaitMode = KernelMode | 是的 | 否 |
| 可被警示 = FALSE等待模式 = 用户模式 | 是的,是用于线程终止。 否,对于用户 APC。 | 否 |
| Alertable = FALSEWaitMode = KernelMode | 否 | 否 |
可以为线程禁用内核异步过程调用 (APC)。 如果为某个线程禁用内核 APC,则也会禁用该线程的用户 APC 传递和该线程的终止。 有关如何禁用 APC 的详细信息,请参阅 禁用 APC。
警报机制是操作系统内部很少使用的机制,同样可以中断可中断的等待状态。 无论WaitMode参数的值如何,当Alertable为TRUE时,警报都可以中断等待。 等待例程返回一个值“STATUS_ALERTED”。
请注意,内核 APC 先发制人地运行,不会导致 KeWaitForXxx 或 KeDelayExecutionThread 返回。 系统会在内部中断和恢复等待的操作。 驱动程序通常不会受到此过程的影响,但在某些情况下(如调用 KePulseEvent 时),驱动程序可能会错过调度器对象信号。