Я переношу приложение с x86 на x64. Я использую Visual Studio 2009; большая часть кода - С++, а некоторые части - это просто 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 предлагает в качестве замены inline asm, но я не мог найти ничего, что дало бы мне что-то полезное. Любые идеи?
Андреас спросил, что делать с 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. Мы полностью контролируем развертывание, так как мы сами устанавливаем и настраиваем его и доставляем все это нашим клиентам.