2010-02-11 53 views
2

我有一個Windows Mobile 6.1應用程序,它不僅從32MB進程空間分配內存,還從大內存區域LMA(插槽60及以上)分配內存。使用大內存區域時在Windows Mobile上的總計和分配的堆

MEMORYSTATUS結構只給出了32MB進程槽的內存使用信息。有沒有辦法在使用LMA時計算系統中可用的堆總數和應用程序分配的堆數?

回答

0

使用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