Frage

In nativen API exportiert Microsoft zwei Versionen jeder API -Aufruf, die mit ZW und einer mit NT für z. Zwcreatethread und ntcreatThead.

Meine Frage ist, was ist der Unterschied zwischen diesen beiden Versionen der Anrufe und wann und warum sollte man ZW oder NT ausschließlich verwenden? Nach meinem Verständnis stellt die ZW -Version sicher, dass der Anrufer im Kernel -Modus lebt, während NT nicht.

Ich wundere mich auch über die spezifische Bedeutung für ZW- und NT -Präfixe/-abkürzungen? Man kann NT wahrscheinlich auf NT (New Technology) Windows -Familie oder native (wahrscheinlich nicht) beziehen? ZW steht es für etwas?

War es hilfreich?

Lösung

Aktualisieren:

Abgesehen von Larry Ostermans Antwort (die Sie sollten bestimmt Lesen), es sollte eine andere Sache erwähnen:

Da die NTXXX-Varianten Schecks ausführen, als ob der Anruf vom Benutzermodus stammt, bedeutet dies, dass dies bedeutet Alle an die NTXXS-Funktion übergebenen Puffer müssen sich in Benutzermodus-Adressräumen befinden, nicht in Kernel-Mode. Also, wenn Sie eine Funktion wie nennen NtCreateFile In Ihrem Fahrer und geben Sie es an Kernel-Mode-Puffer weiter, Sie erhalten zurück eine STATUS_ACCESS_VIOLATION aus diesem Grund.


Sehen Verwendung von NT- und ZW -Versionen der nativen Systemdiensteroutinen.

Ein Kernel-Mode-Treiber ruft die ZW-Version einer nativen Systemdienste auf, um die Routine darüber zu informieren, dass die Parameter aus einer vertrauenswürdigen Kernel-Mode-Quelle 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 Benutzer-Mode-Quelle oder einer Kernel-Mode-Quelle stammen, ruft der Treiber stattdessen die NT-Version der Routine auf, die auf der Grundlage des Verlaufs des aufrufenden Threads festgelegt wird, unabhängig davon, ob die Parameter aus dem Benutzer stammen Modus oder Kernel -Modus.

Native System Services -Routinen treffen zusätzliche Annahmen zu den von ihnen erhaltenen Parametern. Wenn eine Routine einen Zeiger auf einen Puffer empfängt, der von einem Kernel-Mode-Treiber zugewiesen wurde, geht die Routine davon aus, dass der Puffer im Systemspeicher zugewiesen wurde, nicht im Benutzer-Modus-Speicher. Wenn die Routine ein Handle empfängt, das von einer Benutzermodusanwendung geöffnet wurde, sucht die Routine nach dem Handle in der Benutzer-Mode-Handle-Tabelle, nicht in der Kernel-Mode-Handle-Tabelle.

Ebenfalls, Zw steht für nichts. Sehen Was bedeutet das ZW -Präfix?:

Die Routinen für Windows Native System Services haben Namen, die mit den Präfixen NT und ZW beginnen. Das NT -Präfix ist eine Abkürzung von Windows NT, das ZW -Präfix hat jedoch keine Bedeutung. ZW wurde teilweise ausgewählt, um potenzielle Namenskonflikte mit anderen APIs zu vermeiden und teilweise zu vermeiden, um potenziell nützliche Präfixe mit zwei Buchstaben zu verwenden, die möglicherweise in Zukunft benötigt werden.

Andere Tipps

Ich wollte dies als Kommentar zu Merhdads Antwort verlassen, aber es wurde zu lang ...

Mehrdads Antwort ist 100% genau. Es ist auch leicht irreführend. Das "VorherigerMode"Artikel, der mit der" Verwendung von NT und ZW ... "verknüpft ist Für Fahrer, NT -Anrufe sind direkte Anrufe bei der API.

Wenn ein Treiber eine ZW -API aufruft, ist der einzige wirkliche Effekt, wenn er den System -Call -Dispatcher durchführt, darin, dass er KegetPreviousMode () auf Kernelmode anstelle von Usmode festlegt (offensichtlich für den User -Modus -Code sind die ZW- und NT -Formulare identisch). Wenn die verschiedenen Systemaufrufe sehen, dass EXGETPREVIOUSMODE KernelMode ist, umgehen sie die Zugriffskontrolle (da die Treiber alles tun können).

Wenn ein Treiber die NT -Form der APIs aufruft, ist es möglich, dass er aufgrund der Zugriffsprüfungen fehlschlägt.

Ein konkretes Beispiel: Wenn ein Fahrer NtCreateFile anruft, ruft die NTCreateFile Seaccesscheck () an, um festzustellen, ob die in den Fahrer angerufene Anwendung Berechtigungen zum Erstellen der Datei enthält. Wenn derselbe Fahrer zwcreatefile nannte, wird der NtCreateFile -API -Anruf Seacescesscheck nicht angerufen, da EXGETPREVIOUSMODE KernelMode zurückgegeben hat und der Treiber so Zugriff auf die Datei hat.

Für Fahrerautoren ist es wichtig, den Unterschied zwischen beiden zu verstehen, da es tiefgreifende Auswirkungen auf die Sicherheit haben kann ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top