Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 Dispatcher-Objekt warten, müssen darauf vorbereitet sein, dass dieses Warten entweder durch einen User-Mode-APC oder durch eine Beendigung des Threads 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 alarmierbare 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.
| Die Parameter | Warten unterbrochen? | Wurde der APC des Benutzers zugestellt? |
|---|---|---|
| Warnungsfähig = TRUEWartemodus = Benutzermodus | Ja | Ja |
| Alertable = TRUEWaitMode = KernelMode | Ja | Nein |
| Warnungsfähig = FALSEWaitMode = UserMode | Ja, für Thread-Beendigung. 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, sind sowohl die Übermittlung von Benutzer-APCs 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, 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.