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.
Treiber, die Abschnitte und Ansichten erstellen, die nicht für den Benutzermodus freigegeben werden sollen, müssen das folgende Protokoll verwenden, wenn sie mit Abschnitten und Ansichten arbeiten:
Der Treiber muss ein Kernelhandle verwenden, wenn er ein Handle für das Abschnittsobjekt öffnet. Treiber können sicherstellen, dass ein Handle ein Kernelhandle ist, indem er entweder im Systemprozess erstellt wird, oder das OBJ_KERNEL_HANDLE-Attribut für das Handle angeben. Weitere Informationen finden Sie unter Object Handles.
Die Ansicht muss nur aus einem Systemthread zugeordnet werden. (Andernfalls kann auf die Ansicht über den Prozess zugegriffen werden, in dessen Kontext sie erstellt wurde.) Ein Treiber kann sicherstellen, dass die Ansicht vom Systemprozess zugeordnet wird, indem ein Systemarbeitsthread zum Ausführen des Zuordnungsvorgangs verwendet wird. Weitere Informationen finden Sie unter System Worker Threads und Treiberthreadkontext.
Treiber, die eine Ansicht für einen Benutzermodusprozess freigeben, müssen das folgende Protokoll verwenden, wenn sie mit Abschnitten und Ansichten arbeiten:
Der Treiber, nicht der Benutzermodusprozess, muss das Abschnittsobjekt erstellen und die Ansichten zuordnen.
Wie bereits erwähnt, muss der Treiber ein Kernelhandle verwenden, wenn er ein Handle für das Abschnittsobjekt öffnet. Treiber können sicherstellen, dass ein Handle ein Kernelhandle ist, indem er entweder im Systemprozess erstellt wird, oder das OBJ_KERNEL_HANDLE-Attribut für das Handle angeben. Weitere Informationen finden Sie unter Object Handles.
Die Ansicht wird im Prozesskontext des Threads abgebildet, der die Ansicht teilt. Ein Treiber auf höchster Ebene kann garantieren, dass die Ansicht im aktuellen Prozesskontext zugeordnet wird, indem der Zuordnungsvorgang in einer Dispatch-Routine ausgeführt wird, z. B. DispatchDeviceControl. Verteilerroutinen von Treibern auf niedrigerer Ebene werden in einem beliebigen Threadkontext ausgeführt und können daher eine Ansicht in einer Verteilerroutine nicht sicher zuordnen. Weitere Informationen finden Sie im Treiberthreadkontext.
Alle Speicherzugriffe auf die Ansicht innerhalb des Treibers müssen durch try-except-Blöcke geschützt werden. Eine böswillige Anwendung im Benutzermodus könnte die Zuordnung der Ansicht aufheben oder die Schutzstufe der Ansicht ändern. Beides würde einen Systemabsturz verursachen, es sei denn, es wird durch einen Try-Except-Block geschützt. Weitere Informationen finden Sie unter Behandeln von Ausnahmen.
Der Fahrer muss auch bei Bedarf den Inhalt der Ansicht überprüfen. Der Treiberentwickler kann nicht davon ausgehen, dass ausschließlich eine vertrauenswürdige Benutzermoduskomponente Zugriff auf die Ansicht hat.
Ein Treiber, der ein Abschnittsobjekt für eine Benutzermodusanwendung freigeben muss (die eigene Ansichten erstellen kann), muss das folgende Protokoll verwenden:
Der Treiber, nicht der Benutzermodusprozess, muss das Abschnittsobjekt erstellen. Treiber dürfen niemals ein Handle verwenden, das aus dem Benutzermodus übergeben wurde.
Bevor Sie das Handle an den Benutzermodus übergeben, muss der Treiber ObReferenceObjectByHandle aufrufen, um einen Verweis auf das Abschnittsobjekt abzurufen. Dadurch wird verhindert, dass eine schädliche Anwendung das Abschnittobjekt durch Schließen des Handles löscht. Der Objektverweis sollte in der Geräteerweiterung des Treibers gespeichert werden.
Nachdem der Treiber das Abschnittsobjekt nicht mehr verwendet hat, muss er ObDereferenceObject aufrufen, um den Objektverweis freizugeben.
Auf Systemen, die Microsoft Windows Server 2003 mit Service Pack 1 (SP1) und höheren Versionen ausführen, können nur Kernelmodustreiber \Device\PhysicalMemory öffnen. Treiber können jedoch entscheiden, einer Benutzeranwendung ein Handle zu geben. Um Sicherheitsprobleme zu vermeiden, sollten nur Benutzeranwendungen, denen der Treiber vertraut, zugriff auf \Device\PhysicalMemory gewährt werden.