Это стандартная проблема в коде перехвата функции. У нас была похожая проблема с библиотекой журналов, которая использовала разделяемую память для хранения информации уровня журнала, в то время как библиотека разделяемой памяти должна была регистрировать информацию.
Думаю, способ, которым мы это исправили, может быть применен к вашей ситуации.
В вашем коде перехвата поддерживайте статический флаг, который указывает, находится ли вы в середине перехвата. Когда ваш перехват вызывается, а флаг не установлен, установите флаг, затем сделайте то, что вы в настоящее время делаете, включая вызов DbgHelp, затем снимите флаг.
Если ваш перехват вызывается при установленном флаге, вызывайте только внутренний код HeapAlloc без выполнения каких-либо других действий (включая вызов DbgHelp, который вызывает вашу бесконечную рекурсию).
Нечто подобное (псевдокод):
function MyHookCode:
static flag inInterceptMode = false
if inInterceptMode:
call HeapAlloc
return
inInterceptMode = true
call DbgHelp stuff
call HeapAlloc
inInterceptMode = false
return
function main:
hook HeapAlloc with MyHookCode
: : :
return