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
指定的节已受到保护。

注解

例程使用 SLAT 表保护支持驱动程序部分的物理内存, (VSM 管理的二级地址转换) 。 对于整个操作系统,受保护的内存将设为只读。 

请注意,在保护节后,无法删除保护。 这是设计使然:此规则的唯一例外是调用方指定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)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL