Udostępnij przez


Zarządzanie sekcjami pamięci

Sterownik może utworzyć obiekt sekcji, wywołując ZwCreateSection, który zwraca uchwyt do obiektu sekcji. Użyj parametru FileHandle, aby określić plik wspierający lub NULL, jeśli sekcja nie jest oparta na pliku. Dodatkowe dojścia do obiektu sekcji można otworzyć przy użyciu ZwOpenSection.

Aby dane należące do obiektu sekcji były dostępne w przestrzeni adresowej bieżącego procesu, należy zamapować widok sekcji. Sterowniki mogą mapować widok sekcji na przestrzeń adresową bieżącego procesu przy użyciu procedury ZwMapViewOfSection. Parametr SectionOffset określa przesunięcie bajtowe, od którego rozpoczyna się widok w sekcji, a ViewSize określa liczbę bajtów do zmapowania.

Parametr Protect określa dozwolone operacje w widoku. Określ PAGE_READONLY dla widoku tylko do odczytu, PAGE_READWRITE dla widoku odczytu/zapisu i PAGE_WRITECOPY dla widoku kopiowania na zapis.

Do momentu uzyskania dostępu do zakresu pamięci wirtualnej nie zostanie przydzielona żadna pamięć fizyczna dla widoku. Pierwszy dostęp do zakresu pamięci powoduje błąd strony; system przydziela następnie stronę do przechowywania tej lokalizacji pamięci. Jeśli sekcja jest tworzona na podstawie plików, system odczytuje zawartość pliku, który odpowiada tej stronie i kopiuje ją do pamięci. (Należy pamiętać, że nieużywane obiekty sekcji i widoki faktycznie korzystają z części stronicowanych i niestronicowanych pul pamięci do celów związanych z prowadzeniem rejestrów).

Gdy sterownik nie korzysta już z widoku, nie mapuje go, wywołując polecenie ZwUnmapViewOfSection. Gdy sterownik przestaje używać obiektu sekcji, zamyka uchwyt tej sekcji za pomocą ZwClose. Należy pamiętać, że po tym gdy widok zostanie zamapowany i nie będą zamapowane żadne inne widoki, można bezpiecznie natychmiast wywołać ZwClose na dojściu sekcji; widok (i obiekt sekcji) nadal istnieje, dopóki widok nie zostanie odmapowany. Jest to zalecana praktyka, ponieważ zmniejsza ryzyko, że kierowca nie zamknie uchwytu.