亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? crash.cpp

?? 一套DDR OL 游戲源碼.也就是所謂的SMO.內(nèi)置SQL 及其完善的源碼 可以用作2次開(kāi)發(fā)等
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//Crash.cpp
//
//Ported away from Glenn Maynard's Rage.
//Self contained crash reporting.

// DO NOT USE stdio.h!  printf() calls malloc()!
//#include <stdio.h>

 
#if defined(_MSC_VER) && (_MSC_VER > 1100)
	#pragma warning (push)
	#pragma warning (disable : 4018) // Ignore signing
#endif


#include <stdarg.h>
//#include <crtdbg.h>
#include <windows.h>
#include <tlhelp32.h>

#include "crash.h"
#include "RestartProgram.h"
#include "WindowsResources.h"

#include <iostream> //For this specific implementation
using namespace std;

static void DoSave();

bool g_bAutoRestart = false;

///////////////////////////////////////////////////////////////////////////

extern HINSTANCE g_hInstance;
#define version_num VERSION_NUM

extern HINSTANCE g_hInstance;
#define BACKTRACE_MAX_SIZE 100

// WARNING: This is called from crash-time conditions!  No malloc() or new!!!

#define malloc not_allowed_here
#define new not_allowed_here

unsigned long g_CallBack = NULL;
char ReasonForCrash[10000];
int PosInReason;

static void GetVDIPath( char *buf, int bufsiz )
{
	GetModuleFileName( NULL, buf, bufsiz );
	buf[bufsiz-5] = 0;
	char *p = strrchr( buf, '.' );
	if( p )
		strcpy( p, ".vdi" );
	else
		strcat( buf, ".vdi" );
}

static void SpliceProgramPath(char *buf, int bufsiz, const char *fn) {
	char tbuf[MAX_PATH];
	char *pszFile;

	GetModuleFileName(NULL, tbuf, sizeof tbuf);
	GetFullPathName(tbuf, bufsiz, buf, &pszFile);
	strcpy(pszFile, fn);
}

struct VDDebugInfoContext
{
	VDDebugInfoContext() { pRVAHeap=NULL; }
	bool Loaded() const { return pRVAHeap != NULL; }
	void *pRawBlock;

	int nBuildNumber;

	const unsigned char *pRVAHeap;
	unsigned	nFirstRVA;

	const char *pFuncNameHeap;
	const unsigned long (*pSegments)[2];
	int		nSegments;
	char	sFilename[1024];
};


static VDDebugInfoContext g_debugInfo;

BOOL APIENTRY CrashDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);


///////////////////////////////////////////////////////////////////////////

static const struct ExceptionLookup {
	DWORD	code;
	const char *name;
} exceptions[]={
	{	EXCEPTION_ACCESS_VIOLATION,			"Access Violation"		},
	{	EXCEPTION_BREAKPOINT,				"Breakpoint"			},
	{	EXCEPTION_FLT_DENORMAL_OPERAND,		"FP Denormal Operand"	},
	{	EXCEPTION_FLT_DIVIDE_BY_ZERO,		"FP Divide-by-Zero"		},
	{	EXCEPTION_FLT_INEXACT_RESULT,		"FP Inexact Result"		},
	{	EXCEPTION_FLT_INVALID_OPERATION,	"FP Invalid Operation"	},
	{	EXCEPTION_FLT_OVERFLOW,				"FP Overflow",			},
	{	EXCEPTION_FLT_STACK_CHECK,			"FP Stack Check",		},
	{	EXCEPTION_FLT_UNDERFLOW,			"FP Underflow",			},
	{	EXCEPTION_INT_DIVIDE_BY_ZERO,		"Integer Divide-by-Zero",	},
	{	EXCEPTION_INT_OVERFLOW,				"Integer Overflow",		},
	{	EXCEPTION_PRIV_INSTRUCTION,			"Privileged Instruction",	},
	{	EXCEPTION_ILLEGAL_INSTRUCTION,		"Illegal instruction"	},
	{	EXCEPTION_INVALID_HANDLE,			"Invalid handle"		},
	{	0xe06d7363,							"Unhandled Microsoft C++ Exception",	},
			// hmm... '_msc'... gee, who would have thought?
	{	DWORD(NULL)	},
};

static const char *LookupException( DWORD code )
{
	for( int i = 0; exceptions[i].code; ++i )
		if( exceptions[i].code == code )
			return exceptions[i].name;

	return NULL;
}

struct CrashInfo
{
	char m_CrashReason[1024*8];

	const void *m_BacktracePointers[BACKTRACE_MAX_SIZE];

	enum { MAX_BACKTRACE_THREADS = 32 };
	const void *m_AlternateThreadBacktrace[MAX_BACKTRACE_THREADS][BACKTRACE_MAX_SIZE];
	char m_AlternateThreadName[MAX_BACKTRACE_THREADS][128];

	CrashInfo()
	{
		m_CrashReason[0] = 0;
		memset( m_AlternateThreadBacktrace, 0, sizeof(m_AlternateThreadBacktrace) );
		memset( m_AlternateThreadName, 0, sizeof(m_AlternateThreadName) );
		m_BacktracePointers[0] = NULL;
	}
};

static CrashInfo g_CrashInfo;
static void GetReason( const EXCEPTION_RECORD *pRecord, CrashInfo *crash )
{
	// fill out bomb reason
	const char *reason = LookupException( pRecord->ExceptionCode );

	if( reason == NULL )
		wsprintf( crash->m_CrashReason, "Crash reason: unknown exception 0x%08lx", pRecord->ExceptionCode );
	else
	{
		strcpy( crash->m_CrashReason, "Crash reason: " );
		strcat( crash->m_CrashReason, reason );
	}
}

long VDDebugInfoLookupRVA(VDDebugInfoContext *pctx, unsigned rva, char *buf, int buflen);
bool VDDebugInfoInitFromMemory(VDDebugInfoContext *pctx, const void *_src);
bool VDDebugInfoInitFromFile( VDDebugInfoContext *pctx );
void VDDebugInfoDeinit(VDDebugInfoContext *pctx);


long __stdcall CrashHandler(EXCEPTION_POINTERS *pExc)
{
	PosInReason = 0;

	//Pfft.  Who cares about these? Let's just keep going
	switch( pExc->ExceptionRecord->ExceptionCode )
	{
	case EXCEPTION_FLT_INVALID_OPERATION:
	case EXCEPTION_FLT_DENORMAL_OPERAND:
	case EXCEPTION_FLT_DIVIDE_BY_ZERO:
	case EXCEPTION_FLT_OVERFLOW:
	case EXCEPTION_FLT_UNDERFLOW:
	case EXCEPTION_FLT_INEXACT_RESULT:
		pExc->ContextRecord->FloatSave.ControlWord |= 0x3F;
		return EXCEPTION_CONTINUE_EXECUTION;
	}

	//Make SURE we do not try executing multiple times
	static int InHere = 0;
	if( InHere > 0 )
	{
		SetUnhandledExceptionFilter(NULL);
		return EXCEPTION_EXECUTE_HANDLER;
	}
	++InHere;

	/* In case something goes amiss before the user can view the crash
	 * dump, save it now. */
	if( !g_CrashInfo.m_CrashReason[0] )
		GetReason( pExc->ExceptionRecord, &g_CrashInfo );

	do_backtrace( g_CrashInfo.m_BacktracePointers, BACKTRACE_MAX_SIZE, GetCurrentProcess(),  GetCurrentThread(), pExc->ContextRecord );

	DoSave();

	if ( g_CallBack == 1 )
	{
		InHere = 0;
		throw ( FatalCrashException() );
	}

	if( g_bAutoRestart )
		Win32RestartProgram();

	VDDebugInfoDeinit(&g_debugInfo);

	InHere = false;

	SetUnhandledExceptionFilter(NULL);

	/* Forcibly terminate; if we keep going, we'll try to shut down threads and do other
	 * things that may deadlock, which is confusing for users. */
	TerminateProcess( GetCurrentProcess(), 0 );

	return EXCEPTION_EXECUTE_HANDLER;
}

static void Report(HWND hwndList, HANDLE hFile, const char *format, ...) {
	char buf[10240];
	va_list val;
	int ch;
	int i;

	va_start(val, format);
	ch = wvsprintf(buf, format, val);

	//memcpy ( &(ReasonForCrash) + PosInReason, buf, strlen( buf ) );
	for ( i = 0; i< strlen(buf); i++)
		if (buf[i] != 0 )
			ReasonForCrash[PosInReason+i] = buf[i];

	PosInReason += strlen( buf ) + 2;
	ReasonForCrash[PosInReason-2] = '\r';
	ReasonForCrash[PosInReason-1] = '\n';

	va_end(val);

	if (hwndList)
		SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)buf);

	if (hFile) {
		DWORD dwActual;

		buf[ch] = '\r';
		buf[ch+1] = '\n';
		WriteFile(hFile, buf, ch+2, &dwActual, NULL);
	}
}



static void ReportReason( HWND hwndReason, HANDLE hFile, const CrashInfo *pCrash )
{
	if( hwndReason )
		SetWindowText( hwndReason, pCrash->m_CrashReason );

	if( hFile )
		Report( NULL, hFile, pCrash->m_CrashReason );
}

static const char *GetNameFromHeap(const char *heap, int idx)
{
	while(idx--)
		while(*heap++);

	return heap;
}

//////////////////////////////////////////////////////////////////////////////

static bool IsValidCall(char *buf, int len)
{
	// Permissible CALL sequences that we care about:
	//
	//	E8 xx xx xx xx			CALL near relative
	//	FF (group 2)			CALL near absolute indirect
	//
	// Minimum sequence is 2 bytes (call eax).
	// Maximum sequence is 7 bytes (call dword ptr [eax+disp32]).

	if (len >= 5 && buf[-5] == '\xe8')
		return true;

	// FF 14 xx					CALL [reg32+reg32*scale]

	if (len >= 3 && buf[-3] == '\xff' && buf[-2]=='\x14')
		return true;

	// FF 15 xx xx xx xx		CALL disp32

	if (len >= 6 && buf[-6] == '\xff' && buf[-5]=='\x15')
		return true;

	// FF 00-3F(!14/15)			CALL [reg32]

	if (len >= 2 && buf[-2] == '\xff' && (unsigned char)buf[-1] < '\x40')
		return true;

	// FF D0-D7					CALL reg32

	if (len >= 2 && buf[-2] == '\xff' && (buf[-1]&0xF8) == '\xd0')
		return true;

	// FF 50-57 xx				CALL [reg32+reg32*scale+disp8]

	if (len >= 3 && buf[-3] == '\xff' && (buf[-2]&0xF8) == '\x50')
		return true;

	// FF 90-97 xx xx xx xx xx	CALL [reg32+reg32*scale+disp32]

	if (len >= 7 && buf[-7] == '\xff' && (buf[-6]&0xF8) == '\x90')
		return true;

	return false;
}

///////////////////////////////////////////////////////////////////////////

static bool IsExecutableProtection(DWORD dwProtect) {
	MEMORY_BASIC_INFORMATION meminfo;

	// Windows NT/2000 allows Execute permissions, but Win9x seems to
	// rip it off.  So we query the permissions on our own code block,
	// and use it to determine if READONLY/READWRITE should be
	// considered 'executable.'

	VirtualQuery((void*)IsExecutableProtection, &meminfo, sizeof meminfo);

	switch((unsigned char)dwProtect) {
	case PAGE_READONLY:				// *sigh* Win9x...
	case PAGE_READWRITE:			// *sigh*
		return meminfo.Protect==PAGE_READONLY || meminfo.Protect==PAGE_READWRITE;

	case PAGE_EXECUTE:
	case PAGE_EXECUTE_READ:
	case PAGE_EXECUTE_READWRITE:
	case PAGE_EXECUTE_WRITECOPY:
		return true;
	}
	return false;
}

static const char *CrashGetModuleBaseName(HMODULE hmod, char *pszBaseName) {
	char szPath1[MAX_PATH];
	char szPath2[MAX_PATH];

#if defined( _MSC_VER )
	__try {
#endif
		DWORD dw;
		char *pszFile, *period = NULL;

		if (!GetModuleFileName(hmod, szPath1, sizeof szPath1))
			return NULL;

		dw = GetFullPathName(szPath1, sizeof szPath2, szPath2, &pszFile);

		if (!dw || dw>sizeof szPath2)
			return NULL;

		strcpy(pszBaseName, pszFile);

		pszFile = pszBaseName;

		while(*pszFile++)
			if (pszFile[-1]=='.')
				period = pszFile-1;

		if (period)
			*period = 0;
#if defined( _MSC_VER )
	} __except(1) {
		return ( NULL );
	}
#endif

	return pszBaseName;
}


///////////////////////////////////////////////////////////////////////////

bool VDDebugInfoInitFromMemory(VDDebugInfoContext *pctx, const void *_src) {
	const unsigned char *src = (const unsigned char *)_src;

	pctx->pRVAHeap = NULL;

	if (memcmp((char *)src, "StepMania symbolic debug information", 36))
		return false;

	// Extract fields

	src += 64;

	pctx->nBuildNumber		= *(int *)src;
	pctx->pRVAHeap			= (const unsigned char *)(src + 20);
	pctx->nFirstRVA			= *(const long *)(src + 16);
	pctx->pFuncNameHeap		= (const char *)pctx->pRVAHeap - 4 + *(const long *)(src + 4);
	pctx->pSegments			= (unsigned long (*)[2])(pctx->pFuncNameHeap + *(const long *)(src + 8));
	pctx->nSegments			= *(const long *)(src + 12);

	return true;
}

void VDDebugInfoDeinit(VDDebugInfoContext *pctx) {
	if (pctx->pRawBlock) {
		VirtualFree(pctx->pRawBlock, 0, MEM_RELEASE);
		pctx->pRawBlock = NULL;
	}
}

bool VDDebugInfoInitFromFile( VDDebugInfoContext *pctx )
{
	if( pctx->Loaded() )
		return true;

	GetVDIPath( pctx->sFilename, sizeof(pctx->sFilename) );

	pctx->pRawBlock = NULL;
	pctx->pRVAHeap = NULL;

	HANDLE h = CreateFile(pctx->sFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (INVALID_HANDLE_VALUE == h)
		return false;

	do {
		DWORD dwFileSize = GetFileSize(h, NULL);

		if (dwFileSize == 0xFFFFFFFF)
			break;

		pctx->pRawBlock = VirtualAlloc(NULL, dwFileSize, MEM_COMMIT, PAGE_READWRITE);
		if (!pctx->pRawBlock)
			break;

		DWORD dwActual;
		if (!ReadFile(h, pctx->pRawBlock, dwFileSize, &dwActual, NULL) || dwActual != dwFileSize)
			break;

		if (VDDebugInfoInitFromMemory(pctx, pctx->pRawBlock)) {
			CloseHandle(h);
			return true;
		}

		VirtualFree(pctx->pRawBlock, 0, MEM_RELEASE);

	} while(false);

	VDDebugInfoDeinit(pctx);
	CloseHandle(h);
	return false;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线观看欧美| 免费在线成人网| 日韩一级视频免费观看在线| 成人中文字幕合集| 美国精品在线观看| 一区二区三区四区五区视频在线观看 | 精品一区二区三区视频在线观看| 国产精品国产三级国产aⅴ原创| 日韩一区二区三区在线视频| 色哟哟一区二区在线观看| 国产成人综合视频| 日韩精品国产精品| 亚洲在线观看免费视频| 国产精品婷婷午夜在线观看| 欧美成人bangbros| 欧美二区在线观看| 欧美性猛交xxxx乱大交退制版| 国产成人精品综合在线观看 | 亚洲卡通欧美制服中文| 久久精品人人做| 日韩手机在线导航| 欧美精品乱码久久久久久| 色偷偷88欧美精品久久久| 丁香激情综合五月| 国产高清无密码一区二区三区| 美女视频网站久久| 丝袜脚交一区二区| 亚洲成人在线网站| 亚洲一区二区不卡免费| 亚洲精品成a人| 亚洲精品国产成人久久av盗摄| 欧美国产亚洲另类动漫| 国产日韩欧美制服另类| 久久免费电影网| 久久久久久久久久电影| 久久久久久一二三区| 久久久精品日韩欧美| 久久精品一区二区三区四区| 26uuu国产一区二区三区| 精品成人在线观看| 精品久久久久久久人人人人传媒 | 精品久久久久久亚洲综合网| 精品三级在线观看| 久久免费午夜影院| 国产午夜精品一区二区三区嫩草 | 蜜臀久久久久久久| 精东粉嫩av免费一区二区三区| 免费看欧美女人艹b| 奇米精品一区二区三区在线观看一| 日本午夜一区二区| 精品在线免费视频| 国产精品77777| 99免费精品视频| 日本高清成人免费播放| 欧美日韩国产综合一区二区三区| 欧美精品在线一区二区三区| 日韩欧美中文字幕精品| 久久久久久亚洲综合影院红桃| 国产人久久人人人人爽| 综合在线观看色| 亚洲高清免费视频| 日本不卡一区二区| 国产精品一区二区三区乱码 | 精品国产乱码久久久久久牛牛| 久久精品亚洲麻豆av一区二区| 中文字幕不卡在线| 亚洲一区二区三区四区五区黄| 蜜臀久久99精品久久久久久9| 大胆亚洲人体视频| 91精品办公室少妇高潮对白| 69久久夜色精品国产69蝌蚪网| 精品99一区二区| 最新高清无码专区| 日韩不卡一区二区三区| 国产乱国产乱300精品| 91蝌蚪porny九色| 日韩欧美在线1卡| 国产精品成人一区二区艾草 | 国产传媒日韩欧美成人| 在线免费精品视频| 欧美sm美女调教| 亚洲视频一区二区在线| 久久精品国产免费| 91视频免费播放| 日韩精品一区在线| 亚洲精品视频观看| 国产精品自拍网站| 欧美日韩精品免费观看视频| 国产亚洲视频系列| 婷婷夜色潮精品综合在线| 粉嫩13p一区二区三区| 91精品久久久久久久久99蜜臂 | 男人的天堂久久精品| 99国产精品99久久久久久| 日韩欧美一级特黄在线播放| 中文字幕在线一区二区三区| 久久99这里只有精品| 在线观看日韩av先锋影音电影院| 久久久久久久性| 日本不卡一区二区三区高清视频| 不卡一区二区在线| 久久久精品黄色| 六月丁香婷婷色狠狠久久| 欧洲另类一二三四区| 中文字幕一区二区三区av| 狠狠色伊人亚洲综合成人| 777午夜精品免费视频| 亚洲天堂久久久久久久| 国产毛片精品一区| 精品久久久久一区| 日本中文字幕一区二区视频| 色一情一乱一乱一91av| 国产精品久久久久久久久快鸭| 狠狠色丁香婷综合久久| 日韩视频在线永久播放| 日韩和欧美一区二区三区| 在线亚洲人成电影网站色www| 中文字幕精品一区二区精品绿巨人| 精品一区二区三区视频在线观看 | 欧美国产视频在线| 国产一区二区三区在线观看免费| 3751色影院一区二区三区| 亚洲二区在线观看| 在线看国产一区二区| 亚洲天堂av一区| av亚洲精华国产精华精华| 国产精品福利一区二区三区| 成人亚洲精品久久久久软件| 国产日韩精品一区二区三区| 国产河南妇女毛片精品久久久| 久久久国产精品麻豆| 国产成人免费在线| 国产亚洲综合在线| 国产99久久久国产精品 | 久久精品99国产精品日本| 91精品一区二区三区在线观看| 亚洲va国产天堂va久久en| 欧美色爱综合网| 天使萌一区二区三区免费观看| 欧美日韩国产综合视频在线观看| 日韩高清一级片| 精品少妇一区二区三区视频免付费| 久久精品国产亚洲高清剧情介绍 | 欧美色网站导航| 婷婷成人综合网| 日韩手机在线导航| 国内精品免费在线观看| 国产欧美日韩精品在线| 91碰在线视频| 五月激情综合色| 日韩精品一区二| 岛国av在线一区| 亚洲综合色噜噜狠狠| 日韩一区二区三区高清免费看看| 久久99精品久久久久久国产越南| 久久先锋影音av| 91影视在线播放| 奇米777欧美一区二区| 久久久另类综合| 色久综合一二码| 另类综合日韩欧美亚洲| 国产精品女主播av| 欧美午夜宅男影院| 国产在线精品一区在线观看麻豆| 欧美极品另类videosde| 欧美性一区二区| 国产精品原创巨作av| 亚洲欧美区自拍先锋| 日韩欧美一区在线| 91丝袜美腿高跟国产极品老师 | 91啪九色porn原创视频在线观看| 亚洲成人黄色影院| 久久精品日产第一区二区三区高清版 | 色婷婷亚洲精品| 日本网站在线观看一区二区三区 | 亚洲日本青草视频在线怡红院| 欧美日韩国产一级| 高清在线观看日韩| 五月婷婷激情综合| 国产女人18毛片水真多成人如厕 | 国产午夜一区二区三区| 欧美午夜精品久久久久久超碰| 久久99九九99精品| 亚洲免费高清视频在线| 精品国精品自拍自在线| 色婷婷精品久久二区二区蜜臀av| 久久福利资源站| 亚洲成a人片综合在线| 国产欧美精品国产国产专区| 在线电影一区二区三区| www.在线成人| 九色综合狠狠综合久久| 亚洲综合在线视频| 国产精品嫩草99a| 日韩亚洲欧美在线| 欧美三级日本三级少妇99| 成人精品一区二区三区四区| 捆绑紧缚一区二区三区视频| 亚洲国产精品久久久久秋霞影院| 中文字幕乱码亚洲精品一区|