Есть ли способ определить, какой тип памяти сегменты, возвращаемые VirtualQuery ()? - PullRequest
2 голосов
/ 21 апреля 2009

Привет,

Я могу обходить карту памяти процессов, используя логику, подобную этой:

    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);
    }

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

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

1 Ответ

0 голосов
/ 21 апреля 2009

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...