堆栈崩溃自动恢复

#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;
}