Freigeben über


Wartezeiten und APCs

Hinweis

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

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

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

Die genauen Situationen, in denen das Betriebssystem die Wartezeit unterbricht, hängt vom Wert des Alertable-Parameters der Routine ab. Wenn Alertable = 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 warnbare Wartezeiten nur, um einen Benutzer-APC zu liefern. Das Betriebssystem unterbricht beide Arten von Wartezeiten, um den Thread zu beenden.

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

Parameter Warten Sie unterbrochen? Benutzer-APC zugestellt?
Alertable = TRUE WaitMode UserMode = Ja Ja
Alertable = TRUE WaitMode KernelMode = Ja No
Alertable = FALSE WaitMode UserMode = Ja, für threadende. Nein, für Benutzer-APCs. No
Alertable = FALSE WaitMode KernelMode = No No

Sie können Kernel-APCs für einen Thread deaktivieren. Wenn Sie Kernel-APCs für einen Thread deaktivieren, sind sowohl die APC-Übermittlung des Benutzers als auch die Threadendung 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, kann auch warnbare Wartezustände unterbrechen. Eine Warnung kann eine Wartezeit unterbrechen, wenn alertable = TRUE unabhängig vom Wert des WaitMode-Parameters zutrifft. Die Warteroutine gibt einen Wert von STATUS_ALERTED zurück.

Beachten Sie, dass Kernel-APCs vorab 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 Dispatcher-Objektsignal für eine vorübergehende Bedingung, z. B. einen Aufruf von KePulseEvent, verpassen kann.