mmLockPagableDataSection 函数 (wdm.h)

MmLockPagableDataSection 例程将驱动程序数据的整个部分锁定到系统空间中。

语法

PVOID MmLockPagableDataSection(
  [in] PVOID AddressWithinSection
);

参数

[in] AddressWithinSection

指定可分页节中一项数据的符号地址。

返回值

MmLockPagableDataSection 返回标识节的不透明值。 此值必须随后传递给 MmLockPagableSectionByHandleMmUnlockPagableImageSection

注解

驱动程序可以使用此例程 MmLockPagableSectionByHandleMmUnlockPagableImageSection 将其通常可分页的专用数据锁定到内存中。

在以下的情况下,可以锁定数据:

  • 通常以 = APC_LEVEL 访问 <数据,但可能需要在短时间内以较高的 IRQL 级别访问这些数据。

  • 驱动程序不经常和可预测的使用数据。

例如,mixer 设备的驱动程序使用可分页数据部分。 由于驱动程序使用足够的数据来创建可分页数据节,并且驱动程序知道何时需要数据,因此,此类驱动程序使用 MmLockPagableDataSectionMmLockPagableSectionByHandleMmUnlockPagableImageSection 将数据部分引入系统空间,并在不需要时将其分页。

MmLockPagableDataSection 的 一次调用会导致包含引用数据的整个部分被锁定到系统空间中。

锁定分区是一项代价高昂的操作。 如果驱动程序在多个位置锁定了可分页数据部分,请对第一个请求使用 MmLockPagableDataSection 。 通过调用 MmLockPagableSectionByHandle,传递 MmLockPagableDataSection 返回的句柄,发出后续锁定请求。 句柄锁定可显著提高驱动程序性能。 通过调用 MmUnlockPagableImageSection 解锁锁定的分区。

内存管理器维护节上的引用计数。 仅当引用计数为零时,可分页数据节才可用于分页。 每个锁请求都会递增计数;每个解锁请求都会减少计数。 驱动程序必须像锁定分区一样多次解锁分区,以确保在不需要分区时,此类分区可供分页。 无论计数如何,句柄始终有效。 如果句柄上的计数为零,并且调用 了 MmLockPagableSectionByHandle,则计数设置为 1,如果分区已分页,则将分页。

可分页数据节中的数据由编译器指令标记。 若要创建可分页的数据部分,请在数据模块的开头使用 #pragma data_seg (“PAGE”) ,并在模块末尾 使用 #pragma data_seg () 。 关键字 (keyword) PAGE 区分大小写,即 PAGE 必须大写。

请注意,还有一个 #pragma data_seg (“INIT”) ,用于在系统初始化后使数据可丢弃。 除了使用 INIT 而不是 PAGE 外,语法是相同的。 但结果不是:使用 PAGE 指令使数据节可分页。 使用 INIT 指令时,一旦驱动程序从其驱动程序入口例程或其重新初始化例程返回(如果驱动程序有该例程),就会丢弃节中的数据。

有关分页数据的详细信息,请参阅 使驱动程序可分页

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlMmApcLte (wdm)

另请参阅

MmLockPagableCodeSection

MmLockPagableSectionByHandle

MmPageEntireDriver

MmResetDriverPaging

MmUnlockPagableImageSection