Como obter o endereço do ponteiro da pilha base

Eu estou no processo de portar um aplicativo de x86 para x64. Eu estou usando o Visual Studio 2009; a maior parte do código é C ++ e algumas partes são simples C. A palavra-chave __asm ​​não é suportada ao compilar para x64 e nosso aplicativo contém algumas partes do montador embutido. Eu não escrevi esse código, então não sei exatamente o que é suposto fazer:

int CallStackSize() {
    DWORD Frame;
    PDWORD pFrame;
    __asm
        {
            mov EAX, EBP
            mov Frame, EAX
        }
    pFrame = (PDWORD)Frame;
    /*... do stuff with pFrame here*/
}

EBP é o ponteiro base para a pilha da função atual. Existe alguma maneira de obter o ponteiro da pilha sem usar asm inline? Eu tenho olhado para os intrínsecos que a Microsoft oferece como um substituto para o inline asm, mas não consegui encontrar nada que me desse algo útil. Alguma ideia?

Andreas perguntou o que é feito com o pFrame. Aqui está a função completa:

int CallStackSize(DWORD frameEBP = 0)
{
    DWORD pc;
    int tmpint = 0;
    DWORD Frame;
    PDWORD pFrame, pPrevFrame;

    if(!frameEBP) // No frame supplied. Use current.
    {
        __asm
        {
            mov EAX, EBP
            mov Frame, EAX
        }
    }
    else Frame = frameEBP;

    pFrame = (PDWORD)Frame;
    do
    {
        pc = pFrame[1];
        pPrevFrame = pFrame;
        pFrame = (PDWORD)pFrame[0]; // precede to next higher frame on stack

        if ((DWORD)pFrame & 3) // Frame pointer must be aligned on a DWORD boundary. Bail if not so.
        break;

        if (pFrame <= pPrevFrame)
        break;

        // Can two DWORDs be read from the supposed frame address?
        if(IsBadWritePtr(pFrame, sizeof(PVOID)*2))
        break;

        tmpint++;
    } while (true);
    return tmpint;
}

A variável pc não é usada. Parece que esta função desce a pilha até falhar. Ele assume que não pode ler fora da pilha de aplicativos, portanto, quando falhar, mediu a profundidade da pilha de chamadas. Este código não precisa compilar no compilador _EVERY_SINGLE por aí. Apenas VS2009. O aplicativo não precisa ser executado no computador EVERY_SINGLE lá fora. Temos controle total de implantação, já que instalamos / configuramos e entregamos tudo para nossos clientes.

questionAnswers(6)

yourAnswerToTheQuestion