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.
Wenn eine Anwendung im Benutzermodus die Nt - oder Zw-Version einer systemeigenen Systemdienstroutine aufruft, fängt der Systemaufrufmechanismus den aufrufenden Thread in den Kernelmodus auf. Um anzugeben, dass die Parameterwerte im Benutzermodus stammen, legt der Traphandler für den Systemaufruf das PreviousMode-Feld im Threadobjekt des Aufrufers auf UserMode fest. Die Routine der systemeigenen Systemdienste überprüft das PreviousMode-Feld des aufrufenden Threads, um zu bestimmen, ob die Parameter aus einer Benutzermodusquelle stammen.
Wenn ein Kernelmodustreiber eine systemeigene Systemdienstroutine aufruft und Parameterwerte an die Routine übergibt, die aus einer Kernelmodusquelle stammt, muss der Treiber sicherstellen, dass das PreviousMode-Feld im aktuellen Threadobjekt auf KernelMode festgelegt ist.
Ein Kernelmodustreiber kann im Kontext eines beliebigen Threads ausgeführt werden, und das Feld "PreviousMode " dieses Threads kann auf "UserMode" festgelegt werden. In diesem Fall kann ein Kernelmodustreiber die Zw-Version einer systemeigenen Systemdienstroutine aufrufen, um die Routine darüber zu informieren, dass die Parameterwerte aus einer vertrauenswürdigen Kernelmodusquelle stammen. Der Zw-Aufruf führt zu einer schlanken Wrapperfunktion, die den PreviousMode-Wert im aktuellen Threadobjekt überschreibt. Die Wrapperfunktion legt PreviousMode auf KernelMode fest und ruft die NT-Version der Routine auf. Bei der Rückkehr von der Nt-Version der Routine stellt die Wrapperfunktion den ursprünglichen PreviousMode-Wert des Threadobjekts wieder her und kehrt zurück.
Ein Kernelmodustreiber kann die Nt-Version einer systemeigenen Systemdienstroutine direkt aufrufen. Wenn ein Kernelmodustreiber eine E/A-Anforderung verarbeitet, die entweder im Benutzermodus oder im Kernelmodus stammen kann, kann der Treiber die Nt-Version der Routine aufrufen, sodass der PreviousMode-Wert des aktuellen Threads während des Aufrufs unverändert bleibt. Die NtXxx-Routine überprüft den PreviousMode-Wert des aufrufenden Threads, um zu bestimmen, ob die Parameterwerte aus einer Benutzermodusanwendung oder einer Kernelmoduskomponente stammen, und behandelt sie entsprechend.
Ein Fehler kann auftreten, wenn ein Kernelmodustreiber eine NtXxx-Routine aufruft und der PreviousMode-Wert im aktuellen Threadobjekt nicht genau angibt, ob die Parameterwerte aus einem Benutzermodus oder einer Kernelmodusquelle stammen.
Gehen Sie beispielsweise davon aus, dass ein Kernelmodustreiber im Kontext eines beliebigen Threads ausgeführt wird und dass der PreviousMode-Wert für diesen Thread auf "UserMode" festgelegt ist. Wenn der Treiber ein Kernelmodusdateihandle an die NtClose-Routine übergibt, überprüft diese Routine den PreviousMode-Wert und entscheidet, dass das Handle ein Benutzermodushandle sein muss. Wenn NtClose das Handle in der Benutzermodushandle-Tabelle nicht findet, wird der STATUS_INVALID_HANDLE Fehlercode zurückgegeben. Unterdessen "leckt" der Treiber das Kernel-Mode-Handle, das nie geschlossen wurde.
Wenn beispielsweise die Parameter für eine NtXxx-Routine einen Eingabe- oder Ausgabepuffer enthalten und wenn PreviousMode UserMode = , ruft die Routine die ProbeForRead- oderProbeForWrite-Routine auf, um den Puffer zu überprüfen. Wenn der Puffer im Systemspeicher anstelle des Arbeitsspeichers im Benutzermodus zugewiesen wurde, löst die ProbeForXxx-Routine eine Ausnahme aus, und die NtXxx-Routine gibt den STATUS_ACCESS_VIOLATION Fehlercode zurück.
Wenn dies erforderlich ist, kann ein Treiber die ExGetPreviousMode-Routine aufrufen, um den PreviousMode-Wert aus dem aktuellen Threadobjekt abzurufen. Oder der Treiber kann das RequestorMode-Feld aus der IRP-Struktur lesen, die den angeforderten E/A-Vorgang beschreibt. Das RequestorMode-Feld enthält eine Kopie des PreviousMode-Werts aus dem Thread, der den Vorgang angefordert hat.