#include <Windows.h>
void StackOverflow(int depth,bool bprintf = true)
{
TCHAR blockdata[10000] = {0};
if(bprintf)
_tprintf(_T("Overflow: %d\n"), depth);
StackOverflow(depth,false);
}
LONG WINAPI StackOverFlowFilter(PEXCEPTION_POINTERS ExceptionInfo)
{
if(ExceptionInfo->ExceptionRecord->ExceptionCode == 0xC00000FD)
{
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
return EXCEPTION_CONTINUE_SEARCH;
}
}
#define STACK_OVERFLOW_BEGAIN \
__try{\
#define STACK_OVERFLOW_END \
}\
__except(StackOverFlowFilter(GetExceptionInformation()))\
{\
static LPBYTE lpPage = NULL;\
static SYSTEM_INFO sysinfo = {0};\
static MEMORY_BASIC_INFORMATION meminfo = {0};\
static DWORD dwOldProtect = 0;\
::GetSystemInfo(&sysinfo);\
_asm {mov lpPage ,esp}\
::VirtualQuery(lpPage , &meminfo, sizeof(meminfo));\
lpPage = (LPBYTE)(meminfo.BaseAddress)-sysinfo.dwPageSize;\
if (!VirtualFree(meminfo.AllocationBase,(LPBYTE)lpPage - (LPBYTE)meminfo.AllocationBase, MEM_DECOMMIT))\
{\
::ExitProcess(0);\
}\
if (!VirtualProtect(lpPage, sysinfo.dwPageSize, PAGE_GUARD|PAGE_READWRITE, &dwOldProtect))\
{\
::ExitProcess(0);\
}\
}\
int _tmain(int argc, _TCHAR* argv[])
{
for(;;)
{
STACK_OVERFLOW_B
StackOverflow(5,true);
STACK_OVERFLOW_END
}
return 0;
}
堆栈崩溃自动恢复
最新推荐文章于 2022-05-10 15:23:39 发布