Используйте 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
-петле к LMA, и это должно работать.
-PaulH