使用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
相关产品推荐
相关产品推荐

