堆栈崩溃自动恢复

来源:互联网 发布:淘宝女装店铺标签 编辑:程序博客网 时间:2024/05/21 14:52
#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;}