You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NtMapViewOfSection时遭遇STATUS_MAPPED_ALIGNMENT(0xC0000220)错误求助

解决NtMapViewOfSection返回STATUS_MAPPED_ALIGNMENT的问题

错误原因分析

*STATUS_MAPPED_ALIGNMENT(0xC0000220)*的本质是你手动指定的viewBase地址不符合Windows内存映射的对齐要求:

  • Windows要求映射视图的基地址必须是*系统分配粒度(Allocation Granularity)*的整数倍,这个值默认是64KB(0x10000),可以通过GetSystemInfo函数获取验证。
  • 你的代码中address变量大概率不是64KB对齐的,而当你将viewBase设为nullptr时,系统会自动选择一个符合对齐要求的地址,所以调用成功。

代码修正方案

方案1:确保address是分配粒度对齐的

在使用address作为viewBase前,先将其对齐到系统分配粒度的边界:

SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
DWORD allocationGranularity = sysInfo.dwAllocationGranularity;

// 将address对齐到分配粒度的整数倍
PVOID alignedAddress = (PVOID)(((ULONG_PTR)address + allocationGranularity - 1) & ~(ULONG_PTR)(allocationGranularity - 1));

// 使用对齐后的地址作为viewBase
PVOID viewBase = alignedAddress;

方案2:让系统自动选择基地址(推荐)

如果不需要强制映射到指定地址,直接将viewBase设为nullptr,由系统自动分配符合要求的地址:

PVOID viewBase = nullptr;
status = NtMapViewOfSection(hSection, hProc, &viewBase, 0, 0x1000, &SectionOffset, &ViewSize, ViewUnmap, 0, PAGE_EXECUTE_READWRITE);
// 映射成功后,viewBase会被设置为实际的映射地址

关于NtUnmapViewOfSection的说明

你调用NtUnmapViewOfSection只是解除了原地址的映射,并不会导致地址对齐问题。错误的根源还是手动指定的viewBase未满足对齐要求,和这个函数无关。

内容的提问来源于stack exchange,提问作者user24684540

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:12:44