Как получить адрес указателя базового стека

Я нахожусь в процессе портирования приложения с x86 на x64. Я использую Visual Studio 2009; большая часть кода написана на C ++, а некоторые части - на простом C. Ключевое слово __asm не поддерживается при компиляции в x64, и наше приложение содержит несколько частей встроенного ассемблера. Я не писал этот код, поэтому я не знаю точно, что должен делать et:

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

EBP - это базовый указатель на стек текущей функции. Есть ли способ получить указатель стека без использования встроенного asm? Я искал особенности, которые Microsoft предлагает в качестве замены встроенного ассемблера, но я не смог найти ничего, что дало бы мне что-то полезное. Есть идеи?

Андреас спросил, что делается с pFrame. Вот полная функция:

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

Переменная pc не используется. Похоже, что эта функция идет вниз по стеку, пока не потерпит неудачу Предполагается, что он не может читать вне стека приложений, поэтому при сбое он измеряет глубину стека вызовов. Этот код не нужно компилировать на компиляторе _EVERY_SINGLE. Просто VS2009. Приложение не должно запускаться на компьютере EVERY_SINGLE. У нас есть полный контроль над развертыванием, так как мы сами устанавливаем / настраиваем и доставляем все это нашим клиентам.

Ответы на вопрос(6)

Ваш ответ на вопрос