禁用 APC

系统提供三种机制来禁用当前线程的 APC:

  • 关键区域。 当线程位于关键区域中时,不会执行其用户 APC 和普通内核 APC。 仍会执行特殊的内核 APC。 有关这些 APC 类型的详细信息,请参阅 APC 的类型

  • 受保护的区域。 当线程位于受保护的区域内时,不会执行其任何 APC。

  • 将当前 IRQL 提高到 APC_LEVEL 或更高版本。 在 IRQL >= APC_LEVEL 执行的线程在禁用所有 APC 的情况下执行。

请注意,这些设置适用于当前线程,不会影响任何其他线程的行为。

某些驱动程序支持例程必须在禁用特定类型的 APC 的情况下调用。 例如,必须调用获取执行资源 ((例如 ExAcquireResourceSharedLite) )的例程,并禁用正常的内核 APC。 必须在启用特定类型的 APC 的情况下调用其他例程。 例如,依赖于 I/O 完成例程 ((例如 IoVolumeDeviceToDosName) )的任何例程都必须在启用特殊内核 APC 的情况下调用。 每个例程的文档指定该例程是否对 APC 执行状态有任何特定限制。

驱动程序可以通过调用适当的例程显式进入关键或受保护的区域。 有关详细信息,请参阅 关键区域和受保护的区域。 驱动程序还可以通过调用 KeRaiseIrql 将当前 IRQL 显式提升为APC_LEVEL。 驱动程序随后必须通过调用 KeLowerIrql 将 IRQL 降低到其原始值。 使用受保护的区域比提高和降低当前 IRQL 更快,但受保护的区域仅在 Windows Server 2003 及更高版本的 Windows 中可用。

以下互斥操作的效果与进入或离开关键或受保护的区域或提高或降低当前 IRQL 的效果相同:

  • 持有互斥对象会隐式地将持有者置于关键区域内。

  • 持有受保护的互斥体会隐式地将持有者置于受保护的区域内。

  • 持有快速互斥体会将当前 IRQL 隐式提升为APC_LEVEL。

有关互斥对象的详细信息,请参阅 互斥对象。 有关快速互斥体和受保护的互斥体的详细信息,请参阅 快速互斥体和受保护的互斥体