mmLockPagableDataSection 例程将驱动程序数据的整个部分锁定到系统空间中。
语法
PVOID MmLockPagableDataSection(
[in] PVOID AddressWithinSection
);
参数
[in] AddressWithinSection
指定可分页节中一项数据的符号地址。
返回值
mmLockPagableDataSection 返回标识节的不透明值。 此值随后必须传递给 mmLockPagableSectionByHandle 或 mmUnlockPagableImageSection。
言论
驱动程序可以使用此例程,MmLockPagableSectionByHandle,MmUnlockPagableImageSection 使其专用数据通常可分页锁定到内存中。
如果:
数据通常在 <= APC_LEVEL 访问,但可能需要在短时间内在更高的 IRQL 级别访问数据。
驱动程序不常且可预测地使用数据。
例如,混音器设备的驱动程序使用可分页数据部分。 由于驱动程序使用足够的数据来创建值得分页的数据部分,驱动程序知道何时需要数据,因此驱动程序使用 MmLockPagableDataSection、mmLockPagableSectionByHandle 和 MmUnlockPagableImageSection,以便在需要时将数据分区引入系统空间,并在需要时使其可供分页。
对 MmLockPagableDataSection 的单个调用 会导致整个部分(包含引用的数据)锁定到系统空间中。
锁定分区是一项昂贵的作。 如果驱动程序在多个位置锁定了可分页数据部分,请对第一个请求使用 MmLockPagableDataSection。 通过调用 MmLockPagableSectionByHandle发出后续锁定请求,传递 mmLockPagableDataSection返回的句柄。 通过句柄锁定可显著提高驱动程序性能。 通过调用 MmUnlockPagableImageSection来解锁锁定分区。
内存管理器维护节上的引用计数。 仅当引用计数为零时,才可使用可分页数据部分进行分页。 每个锁请求递增计数;每个解锁请求都会递减计数。 驱动程序必须解锁分区的次数,因为它锁定分区,以确保当不需要分区时,此类分区可供分页。 无论计数如何,句柄始终有效。 如果句柄上的计数为零,并且调用 MmLockPagableSectionByHandle,则计数设置为 1,如果分区已分页,则会将其分页。
可分页数据部分中的数据由编译器指令标记。 若要创建可分页的数据部分,请在数据模块的开头使用 #pragma data_seg(“PAGE”),并在模块末尾 #pragma data_seg()。 PAGE 关键字区分大小写,即必须大写 PAGE。
请注意,还有一个 #pragma data_seg(“INIT”),用于在系统初始化后丢弃数据。 除了使用 INIT,而不是 PAGE,语法相同。 但是,结果不是;使用 PAGE 指令使数据节可分页。 使用 INIT 指令时,驱动程序从驱动程序入口例程返回或重新初始化例程(如果驱动程序有)后,就会丢弃节中的数据。
有关分页数据的详细信息,请参阅 使驱动程序可分页。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIs(storport),IrqlMmApcLte(wdm) |