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 值,该值指示操作的结果:
返回值 | 说明 |
---|---|
|
操作已成功完成,驱动程序部分已成功保护 |
|
虚拟安全模式 (VSM) 当前处于禁用状态,因此函数无法保护驱动程序部分。 |
|
指定了无效标志位掩码 (或非零大小) 。 |
|
由其中包含的地址指定的驱动程序部分通过无效的保护映射, (不支持可执行部分) |
|
指定的部分属于此 API 不支持的驱动程序 (请参阅备注) 。 |
|
指定的节是可丢弃的,或包含不由任何物理内存支持的间隙。 当节对齐方式大于页面大小时,通常会发生这种情况。 |
|
指定的节已受到保护。 |
注解
例程使用 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 |