2
我有一个Windows Mobile 6.1应用程序,它不仅从32MB进程空间分配内存,还从大内存区域LMA(插槽60及以上)分配内存。使用大内存区域时在Windows Mobile上的总计和分配的堆
MEMORYSTATUS结构只给出了32MB进程槽的内存使用信息。有没有办法在使用LMA时计算系统中可用的堆总数和应用程序分配的堆数?
我有一个Windows Mobile 6.1应用程序,它不仅从32MB进程空间分配内存,还从大内存区域LMA(插槽60及以上)分配内存。使用大内存区域时在Windows Mobile上的总计和分配的堆
MEMORYSTATUS结构只给出了32MB进程槽的内存使用信息。有没有办法在使用LMA时计算系统中可用的堆总数和应用程序分配的堆数?
使用VirtualQuery来遍历LMA中的每个块。如果块没有标记为MEM_FREE,则将其大小添加到使用的总数中。
用于计数特定进程使用的内存我做这样的事:
MEMORY_BASIC_INFORMATION mbi = { 0 };
/// total free memory available to the process
DWORD free = 0;
/// base memory address for the given process index (2-33).
DWORD slot_base_addr = process_index * 0x02000000;
/// look at each memory region for the process.
for(DWORD offset = 0x10000;
offset < 0x02000000;
offset += mbi.RegionSize)
{
::VirtualQuery((void*)(slot_base_addr + offset),
&mbi,
sizeof(MEMORY_BASIC_INFORMATION));
if(mbi.State == MEM_FREE)
{
free += (mbi.RegionSize - ((~(DWORD)mbi.BaseAddress + 1) & 0xffff)) & 0xffff0000;
}
}
就适应了地址在for
-loop到LMA,它应该工作。
-PaulH