将整个驱动程序分页

使用 MmLockPagableXxx 支持例程并指定分页和可丢弃部分的驱动程序由非分页部分、分页部分和在驱动程序初始化后丢弃的 INIT 节组成。

设备驱动程序为其管理的设备连接中断后,驱动程序的中断处理路径必须驻留在系统空间中。 中断处理代码必须是无法分页的驱动程序部分的一部分,以防发生中断。

另外两个内存管理器例程 MmPageEntireDriverMmResetDriverPaging 可用于替代构成驱动程序映像的所有节的可分页或不可分页属性。 当驱动程序管理的设备未使用且无法生成中断时,这些例程使驱动程序能够全部分页。

完全可分页的系统驱动程序示例包括win32k.sys驱动程序、串行驱动程序、mailslot 驱动程序、beep 驱动程序和 null 驱动程序。

串行驱动程序通常间歇性使用。 在打开它管理的端口之前,串行驱动程序可以完全分页。 打开端口后,必须以内存形式驻留的串行驱动程序部分进入非分页系统空间。 驱动程序的其他部分可以保持可分页。

可以完全分页的驱动程序应在驱动程序初始化期间调用 MmPageEntireDriver ,然后再连接中断。

当分页的驱动程序管理的设备收到打开的请求时,该驱动程序将分页。 然后,驱动程序必须先调用 MmResetDriverPaging ,然后才能连接到中断。 调用 MmResetDriverPaging 会导致内存管理器根据编译和链接期间获取的属性处理驱动程序的节。 任何非分页的节(如文本部分)都将分页到非分页系统内存中;可分页分区将在引用时分页。

此类驱动程序必须对其设备保留打开句柄的引用计数。 驱动程序在针对任何设备的每次打开请求时递增计数,并在每个关闭请求时递减计数。 当计数达到零时,驱动程序应断开中断,然后调用 MmPageEntireDriver。 如果驱动程序管理多个设备,则所有此类设备的计数必须为零,然后驱动程序才能调用 MmPageEntireDriver

驱动程序负责在更改引用计数时执行所需的任何同步,并防止在驱动程序的可分页状态更改时更改引用计数。 也就是说,在 SMP 计算机中,驱动程序必须确保 MmPageEntireDriver 不能在一个处理器上进行,而在另一个处理器上,打开的调用会导致中断连接并增加引用计数。