Freigeben über


Verwenden von Nt- und Zw-Versionen der systemeigenen Systemdienste-Routinen

Die Windows Native Operating System Services-API wird als Eine Reihe von Routinen implementiert, die im Kernelmodus ausgeführt werden. Diese Routinen haben Namen, die mit dem Präfix Nt oder Zw beginnen. Kernelmodustreiber können diese Routinen direkt aufrufen. Benutzermodusanwendungen können mithilfe von Systemaufrufen auf diese Routinen zugreifen.

Mit wenigen Ausnahmen verfügt jede systemeigene Systemdienstroutine über zwei geringfügig unterschiedliche Versionen, die ähnliche Namen, aber unterschiedliche Präfixe aufweisen. Beispielsweise führen Aufrufe von NtCreateFile und ZwCreateFile ähnliche Vorgänge aus und werden tatsächlich von derselben Kernelmodus-Systemroutine gewartet. Bei Systemaufrufen aus dem Benutzermodus verhalten sich die Nt - und Zw-Versionen einer Routine identisch. Für Aufrufe von einem Kernelmodustreiber unterscheiden sich die Nt - und Zw-Versionen einer Routine darin, wie sie die Parameterwerte behandeln, die der Aufrufer an die Routine übergibt.

Ein Kernelmodustreiber ruft die Zw-Version einer systemeigenen Systemdienstroutine auf, um die Routine darüber zu informieren, dass die Parameter von einer vertrauenswürdigen Kernelmodusquelle stammen. In diesem Fall geht die Routine davon aus, dass sie die Parameter sicher verwenden kann, ohne sie zuerst zu validieren. Wenn die Parameter jedoch entweder aus einer Benutzermodusquelle oder einer Kernelmodusquelle stammen, ruft der Treiber stattdessen die NT-Version der Routine auf, die basierend auf dem Verlauf des aufrufenden Threads bestimmt, ob die Parameter aus dem Benutzermodus oder kernelmodus stammen. Weitere Informationen dazu, wie die Routine Benutzermodusparameter von Kernelmodusparametern unterscheidet, finden Sie unter PreviousMode.

Wenn eine Benutzermodusanwendung die Nt - oder Zw-Version einer systemeigenen Systemdienstroutine aufruft, behandelt die Routine immer die Parameter, die sie als Werte empfängt, die von einer nicht vertrauenswürdigen Benutzermodusquelle stammen. Die Routine überprüft die Parameterwerte gründlich, bevor sie die Parameter verwendet. Insbesondere überprüft die Routine alle vom Aufrufer bereitgestellten Puffer, um zu überprüfen, ob sich die Puffer im gültigen Benutzermodusspeicher befinden und ordnungsgemäß ausgerichtet sind.

Native Systemdienstroutinen machen andere Annahmen zu den empfangenen Parametern. Wenn eine Routine einen Zeiger auf einen Puffer empfängt, der von einem Kernelmodustreiber zugewiesen wird, geht die Routine davon aus, dass der Puffer im Systemspeicher und nicht im Benutzermodusspeicher zugeordnet ist. Wenn die Routine ein Handle empfängt, das von einer Benutzermodusanwendung geöffnet wird, sucht die Routine nach dem Handle in der Benutzermodushandle-Tabelle, nicht in der Kernelmodus-Handle-Tabelle.

In einigen Fällen unterscheidet sich die Bedeutung eines Parameterwerts erheblich zwischen Aufrufen vom Benutzermodus und vom Kernelmodus. Beispielsweise verfügt die ZwNotifyChangeKey-Routine (oder das zugehörige NtNotifyChangeKey-Gegenstück ) über ein Eingabeparameterpaar, ApcRoutine und ApcContext, das verschiedene Dinge bedeutet, je nachdem, ob die Parameter aus einer Benutzermodus- oder Kernelmodusquelle stammen. Bei einem Aufruf aus dem Benutzermodus verweist ApcRoutine auf eine APC-Routine und ApcContext verweist auf einen Kontextwert, den das Betriebssystem bereitstellt, wenn es die APC-Routine aufruft. Für einen Aufruf aus dem Kernelmodus verweist ApcRoutine auf eine WORK_QUEUE_ITEM-Struktur , und ApcContext gibt den Typ der Arbeitswarteschlangenaufgabe an, die von der WORK_QUEUE_ITEM-Struktur beschrieben wird.

Dieser Abschnitt enthält die folgenden Artikel:

PreviousMode

Bibliotheken und Kopfzeilen

Was bedeutet das Präfix Zw?

Angeben von Zugriffsrechten

NtXxx-Routinen