
#include <Windows.h>
void StackOverflow(int depth,bool bprintf = true)
{
TCHAR blockdata[10000] = {0};
if(bprintf)
_tprintf(_T("Overflow: %dn"), 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;
}
近期评论