Verwalten von Arbeitsspeicherabschnitten
Ein Treiber kann ein Abschnittsobjekt durch Aufrufen von ZwCreateSection erstellen, das ein Handle an das Section-Objekt zurückgibt. Verwenden Sie den FileHandle-Parameter , um die Sicherungsdatei anzugeben, oder NULL , wenn der Abschnitt nicht dateigeschützt ist. Weitere Handles für das Abschnittsobjekt können mithilfe von ZwOpenSection geöffnet werden.
Um die Daten, die zu einem Abschnittsobjekt gehören, innerhalb des Adressraums des aktuellen Prozesses zugänglich zu machen, muss eine Ansicht des Abschnitts zugeordnet werden. Treiber können mithilfe der ZwMapViewOfSection-Routine eine Ansicht eines Abschnitts dem Adressraum des aktuellen Prozesses zuordnen. Der Parameter SectionOffset gibt den Byteoffset an, an dem die Ansicht innerhalb des Abschnitts beginnt, und viewSize gibt die Anzahl der zu zuordnenden Bytes an.
Der Parameter Protect gibt die zulässigen Vorgänge für die Ansicht an. Geben Sie PAGE_READONLY für eine schreibgeschützte Ansicht an, PAGE_READWRITE für eine Lese-/Schreibansicht und PAGE_WRITECOPY für eine Schreibzugriffsansicht.
Für eine Ansicht wird kein physischer Arbeitsspeicher zugewiesen, bis auf den virtuellen Speicherbereich zugegriffen wird. Der erste Zugriff auf den Speicherbereich verursacht einen Seitenfehler. Das System ordnet dann eine Seite zu, die diesen Speicherspeicherort enthält. Wenn der Abschnitt dateigeschützt ist, liest das System den Inhalt der Datei, die dieser Seite entspricht, und kopiert ihn in den Arbeitsspeicher. (Beachten Sie, dass nicht verwendete Abschnittsobjekte und Sichten zu Buchhaltungszwecken einen ausgelagerten und nicht ausgelagerten Pool verwenden.)
Nachdem ein Treiber keine Ansicht mehr verwendet, hebt er die Zuordnung auf, indem er ZwUnmapViewOfSection aufruft. Nachdem der Treiber das Section-Objekt nicht mehr verwendet, schließt er das Abschnittshandle mit ZwClose. Beachten Sie, dass nach der Zuordnung der Ansicht und keine anderen Ansichten zugeordnet werden, es sicher ist, sofort ZwClose für das Abschnittshandle aufzurufen. Die Ansicht (und das Abschnittsobjekt) sind weiterhin vorhanden, bis die Ansicht nicht zugeordnet ist. Dies wird empfohlen, da dadurch das Risiko verringert wird, dass der Treiber den Handle nicht schließt.