堆栈崩溃自动恢复
来源:互联网 发布:淘宝女装店铺标签 编辑:程序博客网 时间: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;}