Поделиться через


Управление разделами памяти

Драйвер может создать объект section, вызвав ZwCreateSection, который возвращает дескриптор для объекта section. Используйте параметр FileHandle , чтобы указать файл резервной копии, или значение NULL , если раздел не поддерживается. Дополнительные дескрипторы объекта section можно открыть с помощью ZwOpenSection.

Чтобы сделать данные, принадлежащие объекту section, доступным в адресном пространстве текущего процесса, необходимо сопоставить представление раздела. Драйверы могут сопоставить представление раздела с адресным пространством текущего процесса с помощью подпрограммы ZwMapViewOfSection . Параметр SectionOffset указывает смещение в байтах, где начинается представление в разделе, а ViewSize — количество байтов для сопоставления.

Параметр Protect указывает разрешенные операции в представлении. Укажите PAGE_READONLY для представления только для чтения, PAGE_READWRITE для представления чтения и записи и PAGE_WRITECOPY для представления копирования при записи.

Физическая память не выделяется для представления, пока не будет предоставлен доступ к диапазону виртуальной памяти. Первый доступ к диапазону памяти приводит к сбою страницы; затем система выделяет страницу для хранения этого расположения в памяти. Если раздел поддерживается, система считывает содержимое файла, соответствующего этой странице, и копирует его в память. (Обратите внимание, что неиспользуемые объекты разделов и представления используют некоторые страничные и невыгружаемые пулы для бухгалтерского учета.)

После того как драйвер больше не использует представление, он отменяет его сопоставление путем вызова ZwUnmapViewOfSection. После того как драйвер больше не использует объект section, он закрывает дескриптор раздела с помощью ZwClose. Обратите внимание, что после сопоставления представления, а другие представления не будут сопоставлены, можно безопасенно вызвать ZwClose для дескриптора раздела. представление (и объект section) продолжает существовать до тех пор, пока представление не будет не сопоставлено. Это рекомендуемая методика, так как она снижает риск того, что драйвер не может закрыть дескриптор.