Freigeben über


Verwenden von Nt- und Zw-Versionen der Systemdienstroutinen

Die API für native Windows-Betriebssystemdienste 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 leicht unterschiedliche Versionen mit ähnlichen Namen, aber unterschiedlichen Präfixen. Beispielsweise führen Aufrufe von NtCreateFile und ZwCreateFile ähnliche Vorgänge aus und werden tatsächlich von derselben Systemroutine im Kernelmodus verwaltet. Bei Systemaufrufen aus dem Benutzermodus verhalten sich die Nt - und Zw-Versionen einer Routine identisch. Bei Aufrufen 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 aus einer vertrauenswürdigen Kernelmodusquelle stammen. In diesem Fall geht die Routine davon aus, dass sie die Parameter sicher verwenden kann, ohne sie zuvor zu überprüfen. Wenn die Parameter jedoch entweder aus einer Quelle im Benutzermodus 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 im Benutzer- oder Kernelmodus stammen. Weitere Informationen dazu, wie die Routine Benutzermodusparameter von Kernelmodusparametern unterscheidet, finden Sie unter PreviousMode.

Wenn eine Anwendung im Benutzermodus die Nt - oder Zw-Version einer systemeigenen Systemdienstroutine aufruft, behandelt die Routine die empfangenen Parameter immer als Werte, die von einer nicht vertrauenswürdigen Quelle für den Benutzermodus stammen. Die Routine überprüft die Parameterwerte gründlich, bevor die Parameter verwendet werden. 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.

Systemdienstroutinen treffen zusätzliche Annahmen zu den Empfangenen Parametern. Wenn eine Routine einen Zeiger auf einen Puffer empfängt, der von einem Kernelmodustreiber zugeordnet wurde, geht die Routine davon aus, dass der Puffer im Systemspeicher und nicht im Arbeitsspeicher des Benutzermodus zugeordnet wurde. Wenn die Routine ein Handle empfängt, das von einer Anwendung im Benutzermodus geöffnet wurde, sucht die Routine nach dem Handle in der Handletabelle des Benutzermodus, nicht in der Handletabelle im Kernelmodus.

In einigen Fällen unterscheidet sich die Bedeutung eines Parameterwerts erheblicher zwischen Aufrufen aus dem Benutzermodus und dem Kernelmodus. Beispielsweise verfügt die ZwNotifyChangeKey-Routine (oder ihre NtNotifyChangeKey-Entsprechung ) über ein Paar von Eingabeparametern, ApcRoutine und ApcContext, die unterschiedliche Dinge bedeuten, je nachdem, ob die Parameter aus einer Benutzermodus- oder Kernelmodusquelle stammen. Bei einem Aufruf aus dem Benutzermodus zeigt ApcRoutine auf eine APC-Routine und ApcContext auf einen Kontextwert, den das Betriebssystem beim Aufrufen der APC-Routine bereitstellt. Bei einem Aufruf aus dem Kernelmodus zeigt ApcRoutine auf eine WORK_QUEUE_ITEM-Struktur , und ApcContext gibt den Typ des Arbeitswarteschlangenelements an, das von der WORK_QUEUE_ITEM-Struktur beschrieben wird.

Dieser Abschnitt schließt folgende Themen ein:

PreviousMode

Bibliotheken und Header

Was bedeutet das Präfix Zw?

Angeben von Zugriffsrechten

NtXxx-Routinen