Нет API (который я знаю) для этого. Но если у вас есть DLL в процессе, вы получите уведомления DLL_PROCESS_ATTACH / DLL_THREAD_ATTACH в DllMain при создании каждого потока. Когда вы получите эти уведомления, вы можете записать идентификатор потока и адрес стекового объекта для этого потока, потому что вас вызовут в новом потоке. Поэтому сохраните идентификатор потока и адрес стека в некоторой таблице, которую вы создаете в то время. Не пытайтесь проделать большую работу в DllMain, просто запишите расположение стека и вернитесь.
Затем можно использовать VirtualQuery , чтобы превратить адрес переменной в каждом стеке потоков в виртуальный диапазон выделения, который должен дать вам базовый адрес стека (помните, что стеки растут из старших адресов на низкие адреса). Размер выделения по умолчанию для стека составляет 1 МБ, но он может быть переопределен переключателем компоновщика или создателем потока, но стек должен быть смежным. Так что вы получите от VirtualQuery
полный стек на тот момент времени
Что касается местоположения кучи - для кучи может быть несколько расположений, но в целом, если вы хотите указать одно непрерывное местоположение кучи, используйте HeapAlloc , чтобы получить адрес объекта кучи, а затем VirtualQuery
, чтобы определить диапазон страниц для этого раздела кучи.
В качестве альтернативы Вы можете использовать VirtualQuery
в hModule для EXE и для каждой DLL. и тогда вы можете предположить, что все, что является чтением-записью, а не стеком или модулем, является частью кучи. Обратите внимание, что это будет верно в большинстве процессов, но может не быть истинным в некоторых процессах, поскольку приложение может напрямую вызывать VirtualAlloc
или CreateFileMapping
, что приводит к действительным указателям данных, которые не принадлежат ни стеку, ни куче.
Используйте EnumProcessModules , чтобы получить список модулей, загруженных в процесс.
VirtualQuery в основном берет случайный адрес и возвращает базовый адрес коллекции страниц, которой принадлежит этот адрес, а также защиту страниц. Так что это хорошо для перехода от определенного указателя, который «тип» распределения.