Wartezeiten und APCs

Hinweis

Das auf dieser Seite beschriebene Verhalten für einen Benutzer-APC gilt für reguläre Benutzermodus-APCs sowie für spezielle Benutzermodus-APCs.

Threads, die im Namen eines Benutzermodusaufrufers auf ein Verteilerobjekt warten, müssen darauf vorbereitet sein, dass diese Wartezeit unterbrochen wird, entweder durch einen Benutzer-APC oder durch Die Threadbeendigung. Wenn ein Thread KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject oder KeDelayExecutionThread aufruft, kann das Betriebssystem den Thread in einen Wartezustand versetzen. In der Regel verbleibt der Thread im Wartezustand, bis das Betriebssystem den vom Aufrufer angeforderten Vorgang abschließen kann. Wenn der Aufrufer jedoch WaitMode = UserMode angibt, kann das Betriebssystem die Wartezeit unterbrechen. In diesem Fall wird die Routine mit dem NTSTATUS-Wert STATUS_USER_APC beendet.

Jeder Treiber, der eine der vorherigen vier Routinen mit WaitMode = UserMode aufruft, muss darauf vorbereitet sein, den Rückgabewert STATUS_USER_APC zu erhalten. Der Treiber muss seinen aktuellen Vorgang mit STATUS_USER_APC abschließen und die Steuerung in den Benutzermodus zurückkehren.

Die genauen Situationen, in denen das Betriebssystem die Wartezeit unterbricht, hängt vom Wert des Alertable-Parameters der Routine ab. Wenn warnungsfähig = TRUE ist, handelt es sich bei der Wartezeit um eine warnbare Wartezeit. Andernfalls handelt es sich bei der Wartezeit um eine nicht warnbare Wartezeit. Das Betriebssystem unterbricht warnungsfähige Wartezeiten nur, um einen Benutzer-APC zu übermitteln. Das Betriebssystem unterbricht beide Arten von Wartezeiten, um den Thread zu beenden.

In der folgenden Tabelle wird die Beziehung zwischen verschiedenen Parametereinstellungen, Wartevorgängen und der Benutzer-APC-Übermittlung erläutert.

Parameter Warten Sie unterbrochen? Benutzer-APC übermittelt?
Warnungsfähig = TRUEWaitMode = UserMode Ja Ja
Warnungsfähig = TRUEWaitMode = KernelMode Ja Nein
Warnungsfähig = FALSEWaitMode = UserMode Ja, für die Threadbeendigung. Nein, für Benutzer-APCs. Nein
Warnungsfähig = FALSEWaitMode = KernelMode Nein Nein

Sie können Kernel-APCs für einen Thread deaktivieren. Wenn Sie Kernel-APCs für einen Thread deaktivieren, werden sowohl die APC-Bereitstellung des Benutzers als auch die Threadbeendigung für diesen Thread deaktiviert. Weitere Informationen zum Deaktivieren von APCs finden Sie unter Deaktivieren von APCs.

Warnungen, ein selten verwendeter Mechanismus, der für das Betriebssystem intern ist, können auch warnbare Wartezustände unterbrechen. Eine Warnung kann eine Wartezeit unterbrechen, wenn warnungsfähig = TRUE ist, unabhängig vom Wert des WaitMode-Parameters . Die Warteroutine gibt den Wert STATUS_ALERTED zurück.

Beachten Sie, dass Kernel-APCs präemptiv ausgeführt werden und nicht dazu führen, dass KeWaitForXxx oder KeDelayExecutionThread zurückgegeben wird. Das System unterbricht und setzt die Wartezeit intern fort. Treiber sind normalerweise von diesem Prozess nicht betroffen, aber es ist möglich, dass der Treiber ein Dispatcherobjektsignal für eine vorübergehende Bedingung wie einen Aufruf von KePulseEvent verpasst.