2009-04-20 4 views
2

Привет,Есть ли способ определить, какой тип памяти сегментов, возвращаемых VirtualQuery()?

Я могу ходить карту памяти процессы, используя логику, как это:

MEMORY_BASIC_INFORMATION mbi; 
    void *lpAddress=(void*)0; 
    while (VirtualQuery(lpAddress,&mbi,sizeof(mbi))) { 
     fprintf(fptr,"Mem    base:%-10x start:%-10x Size:%-10x Type:%-10x State:%-10x\n", 
      mbi.AllocationBase, 
      mbi.BaseAddress, 
      mbi.RegionSize, 
      mbi.Type,mbi.State); 
     lpAddress=(void *)((unsigned int)mbi.BaseAddress + (unsigned int)mbi.RegionSize); 
    } 

Я хотел бы знать, если данный сегмент используется для статического распределения, стек, и/или кучу и/или другое?

Есть ли способ определить это?

ответ

0

Мне любопытно, что вы планируете делать с этой информацией?

Существует расширение windbg,! Address, которое может предоставить вам эту информацию, если для этого вам не нужен код. Сценарий отладчика, вероятно, будет намного более надежным, чтобы получить эту информацию.

VirtualQuery не может вернуть эту информацию самостоятельно, так как не имеет понятия, почему код режима пользователя запрашивает память. Вам нужно использовать его с другими источниками информации, чтобы получить эту информацию, и могут быть некоторые ошибки.

Во-первых, вы должны фильтровать только память MEM_PRIVATE. , , кучи, стек и статические распределения (при условии, что они были изменены) должны попадать в этот диапазон.

Статические распределения (глобалы и т. Д.) Должны быть по адресу с загруженным модулем. Вы можете использовать PSAPI, чтобы определить, находится ли адрес в загруженном модуле, например, вызывая EnumProcessModules, а затем GetModuleInformation.

Значения стека, вы можете использовать API инструментальной панели, чтобы определить, находится ли ячейка памяти в стеке. CreateToolhelp32Snapshot с TH32CS_SNAPSHOT, чтобы получить потоки в целевом процессе, затем GetThreadContext и проверить, находится ли полученный указатель стека в сегменте.

Я не знаю, как хорошо пройти кучи извне процесса. Toolhelp привязывает список кучи, но не дает вам хорошего набора ограничений для памяти кучи. Внутри процесса вы можете использовать GetProcessHeaps для просмотра списка кучек, а затем вызвать HeapValidate для dtermie, если ячейка памяти находится внутри кучи.

+0

Использование этой информации в составе пользовательского диспетчера памяти для приложения. – bdbaddog

+0

Страница стека/область памяти кажется MEM_IMAGE, а не MEM_PRIVATE? – bdbaddog

+0

Стеки определенно закрыты. Как вы получаете адрес стека, который вы проверяете? – Michael

Смежные вопросы