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