Deaktivieren von APCs

Das System bietet drei Mechanismen zum Deaktivieren von APCs für den aktuellen Thread:

  • Kritische Regionen. Wenn sich ein Thread in einer kritischen Region befindet, werden seine Benutzer-APCs und normale Kernel-APCs nicht ausgeführt. Spezielle Kernel-APCs werden weiterhin ausgeführt. Weitere Informationen zu diesen APC-Typen finden Sie unter Typen von APCs.

  • Geschützte Regionen. Wenn sich ein Thread in einer geschützten Region befindet, wird keiner seiner APCs ausgeführt.

  • Erhöhen des aktuellen IRQL auf APC_LEVEL oder höher. Ein Thread, der unter IRQL >= APC_LEVEL ausgeführt wird, wird mit deaktivierten APCs ausgeführt.

Beachten Sie, dass diese Einstellungen für den aktuellen Thread gelten und sich nicht auf das Verhalten eines anderen Threads auswirken.

Einige Treiberunterstützungsroutinen müssen aufgerufen werden, wenn bestimmte Arten von APCs deaktiviert sind. Beispielsweise müssen Routinen, die eine Executive-Ressource (z. B. ExAcquireResourceSharedLite) abrufen, mit deaktivierten normalen Kernel-APCs aufgerufen werden. Andere Routinen müssen aufgerufen werden, wobei bestimmte Arten von APCs aktiviert sind. Beispielsweise muss jede Routine, die auf einer E/A-Vervollständigungsroutine (z. B . IoVolumeDeviceToDosName) basiert, mit aktivierten speziellen Kernel-APCs aufgerufen werden. Die Dokumentation für jede Routine gibt an, ob die Routine bestimmte Einschränkungen für den Status der APC-Ausführung aufweist.

Ein Treiber kann explizit in eine kritische oder überwachte Region gelangen, indem er die entsprechende Routine aufruft. Weitere Informationen finden Sie unter Kritische Regionen und geschützte Regionen. Ein Treiber kann die aktuelle IRQL auch explizit auf APC_LEVEL erhöhen, indem Er KeRaiseIrql aufruft. Der Treiber muss den IRQL anschließend auf seinen ursprünglichen Wert senken, indem Er KeLowerIrql aufruft. Die Verwendung einer geschützten Region ist schneller als das Auslösen und Senken des aktuellen IRQL, aber geschützte Regionen sind nur in Windows Server 2003 und höheren Versionen von Windows verfügbar.

Die folgenden Mutex-Vorgänge haben die gleiche Auswirkung wie das Betreten oder Verlassen einer kritischen oder geschützten Region oder das Auslösen oder Senken der aktuellen IRQL:

  • Durch das Halten eines Mutex-Objekts wird der Halter implizit in einen kritischen Bereich versetzt.

  • Durch das Halten eines bewachten Mutex wird der Halter implizit in eine bewachte Region versetzt.

  • Durch das Halten eines schnellen Mutex wird der aktuelle IRQL implizit zu APC_LEVEL.

Weitere Informationen zu Mutex-Objekten finden Sie unter Mutex-Objekte. Weitere Informationen zu schnellen und geschützten Mutexes finden Sie unter Fast Mutexes und Guarded Mutexes.