MmProtectDriverSection 函数 (wdm.h)

mmProtectDriverSection 只读,通过使用虚拟安全模式(VSM)提供的服务来保护加载的驱动程序的一部分。

语法

NTSTATUS MmProtectDriverSection(
  [in] PVOID  AddressWithinSection,
  [in] SIZE_T Size,
  [in] ULONG  Flags
);

参数

[in] AddressWithinSection

指向属于驱动程序映像的有效数据部分的指针。 数据部分不应已经可执行,否则 API 将失败并STATUS_INVALID_PAGE_PROTECTION。

[in] Size

此参数目前保留供将来使用,应设置为 0。

[in] Flags

指定控制作的标志:MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD – 用于指定在保护节后仍可卸载驱动程序。

返回值

mmProtectDriverSection 返回一个 NTSTATUS 值,该值指示作的结果:

返回值 描述
STATUS_SUCCESS
作已成功完成,驱动程序部分已成功保护
STATUS_INVALID_DEVICE_STATE
虚拟安全模式(VSM)当前处于禁用状态,因此该函数无法保护驱动程序部分。
STATUS_INVALID_PARAMETER
指定了无效标志位掩码(或非零大小)。
STATUS_INVALID_PAGE_PROTECTION
由包含的地址指定的驱动程序部分通过无效的保护进行映射(不支持可执行部分)
STATUS_NOT_SUPPORTED
指定的节属于此 API 不支持的驱动程序(请参阅备注)。
STATUS_ACCESS_VIOLATION
指定的节是可丢弃的,或包含不由任何物理内存支持的间隙。 当分区对齐大于页面大小时,通常会发生这种情况。
STATUS_ALREADY_COMMITTED
指定的节已被保护。

言论

该例程使用 VSM 管理的 SLAT 表(二级地址转换)保护驱动程序部分的物理内存。 将对整个作系统进行只读保护的内存。 

请注意,在节受保护后,无法删除保护。 这是设计:此规则的唯一例外是调用方指定MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD标志。 在这种情况下,当目标驱动程序卸载时,将释放受保护的节并释放。

mmProtectDriverSection API 不支持使用大型页面和会话驱动程序映射的驱动程序。 此外,此 API 的调用方无法请求保护可丢弃的部分或包含 IAT(导入地址表)的部分。

请注意,如果调用方指定不属于任何已加载驱动程序映像的地址,系统将崩溃并出现MEMORY_MANAGEMENT bug 检查(类型0x1100)。

mmProtectDriverSection API 的调用方应在 IRQL <= APC_LEVEL执行。

要求

要求 价值
最低支持的客户端 从 Windows 预览体验成员 19548 开始可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL