Je suis en train de porter une application de x86 à x64. J'utilise Visual Studio 2009; la majeure partie du code est en C++ et certaines parties sont en langage C. Le mot-clé __asm n'est pas supporté lors de la compilation vers x64 et notre application contient quelques parties de l'assembleur en ligne. Je n'ai pas écrit ce code, donc je ne sais pas exactement ce que et est censé faire:Comment obtenir l'adresse du pointeur de pile de base
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
est le pointeur RASE de base à la pile de la fonction en cours. Est-il possible d'obtenir le pointeur de la pile sans utiliser inline asm? J'ai regardé l'intrinsèque que Microsoft propose comme un substitut à l'asm inline mais je n'ai pas trouvé quelque chose qui m'a donné quelque chose d'utile. Des idées? Andreas a demandé ce qui était fait avec pFrame. Voici la fonction complète:
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;
}
La variable pc n'est pas utilisée. Il semble que cette fonction descende la pile jusqu'à ce qu'elle échoue. Il suppose qu'il ne peut pas lire en dehors de la pile des applications, donc quand il échoue, il a mesuré la profondeur de la pile d'appels. Ce code n'a pas besoin de compiler sur le compilateur _EVERY_SINGLE là-bas. Juste VS2009. L'application n'a pas besoin de fonctionner sur EVERY_SINGLE ordinateur là-bas. Nous avons un contrôle complet du déploiement puisque nous l'installons/le configurons nous-mêmes et livrons le tout à nos clients.
Que des choses se fait avec pFrame? –