का पता कैसे प्राप्त करें मैं x86 से x64 तक किसी एप्लिकेशन को पोर्ट करने की प्रक्रिया में हूं। मैं विजुअल स्टूडियो 200 का उपयोग कर रहा हूं; अधिकांश कोड सी ++ है और कुछ भाग सादे सी हैं। x64 की ओर संकलन करते समय __asm कीवर्ड समर्थित नहीं है और हमारे एप्लिकेशन में इनलाइन असेंबलर के कुछ भाग शामिल हैं। मैं इस कोड तो मैं नहीं जानता कि वास्तव में क्या एट करने के लिए माना जाता है नहीं लिखा था:बेस स्टैक पॉइंटर
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
ईबीपी वर्तमान समारोह के ढेर को आधार सूचक है। क्या इनलाइन एएसएम का उपयोग किए बिना स्टैक पॉइंटर प्राप्त करने का कोई तरीका है? मैं उन इंट्रिनिक्स को देख रहा हूं जो माइक्रोसॉफ्ट इनलाइन एएसएम के लिए एक विकल्प के रूप में प्रदान करता है लेकिन मुझे कुछ भी नहीं मिला जो मुझे कुछ उपयोगी बना देता है। कोई विचार?
एंड्रियास ने पूछा कि पीएफआरएएम के साथ क्या सामान किया जाता है। यहां पूरा कार्य है:
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;
}
परिवर्तनीय पीसी का उपयोग नहीं किया जाता है। ऐसा लगता है कि यह फ़ंक्शन स्टैक तक चलता है जब तक कि यह विफल न हो जाए। यह मानता है कि यह अनुप्रयोगों के ढेर के बाहर नहीं पढ़ सकता है, इसलिए जब यह विफल हो जाता है तो यह कॉल स्टैक की गहराई को मापता है। इस कोड को _EVERY_SINGLE कंपाइलर पर संकलन करने की आवश्यकता नहीं है। बस वीएस 200 9। एप्लिकेशन को EVERY_SINGLE कंप्यूटर पर चलाने की आवश्यकता नहीं है। हमारे पास तैनाती का पूरा नियंत्रण है क्योंकि हम इसे स्वयं स्थापित/कॉन्फ़िगर करते हैं और पूरी चीजें अपने ग्राहकों को देते हैं।
क्या सामान pFrame साथ किया जाता है:
CodeProject एक लेख जो बताते हैं कि यह कैसे उपयोग करने के लिए है? –