管理内存节

驱动程序可以通过调用 ZwCreateSection 来创建 section 对象,这会返回 section 对象的句柄。 使用 FileHandle 参数指定后备文件;如果节不是文件支持,则为 NULL 。 可以使用 ZwOpenSection 打开 section 对象的其他句柄。

若要使属于节对象的数据在当前进程的地址空间中可访问,必须映射节的视图。 驱动程序可以使用 ZwMapViewOfSection 例程将节的视图映射到当前进程的地址空间。 SectionOffset 参数指定视图在 节内开始的字节偏移量,ViewSize 指定要映射的字节数。

Protect 参数指定对视图允许的操作。 为只读视图指定PAGE_READONLY,为读/写视图指定PAGE_READWRITE,并为写入时复制视图指定PAGE_WRITECOPY。

在访问虚拟内存范围之前,不会为视图分配物理内存。 首次访问内存范围会导致页面错误;然后,系统会分配一个页来保存该内存位置。 如果节是文件支持的,则系统会读取与该页对应的文件内容,并将其复制到内存中。 (请注意,未使用的节对象和视图确实使用某些分页和非分页池进行记账。)

驱动程序不再使用视图后,它会通过调用 ZwUnmapViewOfSection 来取消映射该视图。 驱动程序不再使用 section 对象后,它会使用 ZwClose 关闭节句柄。 请注意,在映射视图且不会映射其他视图之后,可以安全地立即对节句柄调用 ZwClose ;视图 (和 section 对象) 继续存在,直到视图取消映射。 这是建议的做法,因为它可降低驱动程序无法关闭句柄的风险。