void x86EnumStackFrames(void){ MEMORY_BASIC_INFORMATION minfo; DWORD stackbase; DWORD stacktop; DWORD framebase; __asm { mov stacktop, esp mov framebase, ebp } VirtualQuery((LPCVOID)stacktop, &minfo, sizeof(minfo)); stackbase = (DWORD)minfo.AllocationBase; int framenum = 0; while(framebase => stackbase && framebase <= stacktop){ DWORD oldframebase = framebase; framebase = * (DWORD *)(framebase + 4); if(framebase <= oldframebase){ printf("Invalid stack frame found: %i", framebase); break; } else { printf("Frame %i:\n\tTop:\t%i\n\tBottom:\t%i\n", framenum, oldframebase, framebase); } } }