/*函数实现*/ BOOL WINAPI CrashProc(PEXCEPTION_POINTERS Exception) { // 获取当前进程所在路径 wchar_t *pFindPath = NULL; wchar_t wsModeleBaseName[256] = L""; wchar_t wsCrashXmlFileName[256] = L""; wchar_t wsCrashDumpFileName[256] = L""; wchar_t wsModeleReverseName[256] = L""; GetModuleFileNameEx(GetCurrentProcess(), NULL, wsModeleBaseName, sizeof(wsModeleBaseName)); wcscpy(wsModeleReverseName, wcsrev(wsModeleBaseName)); for (INT16 _i = 0; _i < 256; _i++) { if (wsModeleReverseName[_i] == 0) break; if (wsModeleReverseName[_i] == L'/') wsModeleReverseName[_i] = L'\\'; } pFindPath = wcsstr(wsModeleReverseName, L"\\"); wcscpy(wsModeleBaseName, wcsrev(pFindPath)); wcscat(wsModeleBaseName, L"CrashRpt\\"); // 创建对应文件目录 SYSTEMTIME st; wchar_t wsDatePath[256]; memset(&st, 0, sizeof(SYSTEMTIME)); GetLocalTime(&st); wsprintf(wsDatePath, L"%s%04d-%02d-%02d\\", wsModeleBaseName, st.wYear, st.wMonth, st.wDay); CreateDirectory(wsModeleBaseName, NULL); CreateDirectory(wsDatePath, NULL); // 生成文件路径 wsprintf(wsCrashXmlFileName, L"%sCrashRpt_%02d%02d%02d.xml", wsDatePath, st.wHour, st.wMinute, st.wSecond); wsprintf(wsCrashDumpFileName, L"%sCrashRpt_%02d%02d%02d.dmp", wsDatePath, st.wHour, st.wMinute, st.wSecond); //生成错误时系统快照 GenerateCrashRpt(Exception, wsCrashXmlFileName, CRASHRPT_ERROR|CRASHRPT_SYSTEM|CRASHRPT_PROCESS|CRASHRPT_SOFTWARE|CRASHRPT_HARDWARE); //生成minidump.dmp,这个可以用vc或者windbg打开分析 GenerateMiniDump(Exception, wsCrashDumpFileName); return EXCEPTION_EXECUTE_HANDLER; }
/* Converts a long number to string. then prints it in the given position using PrintXY function. */ VOID NPrintXY(ULONG64 Num,INT x,INT y){ INT i; WCHAR Text[LONGEST_64BIT_NUM]; for(i=0;Num>0;++i,Num/=10) Text[i] = Num%10 + '0'; if(i==0) Text[i++]='0'; Text[i]='\0'; wcsrev(Text); PrintXY(Text,x,y); }
void CUnicodeString::MakeReverse() { wcsrev(m_Buffer); }
/* * Quotes command line arguments * Returns a pointer to the end (next char to be written) of the buffer */ WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target) { int len = wcslen(source), i, quote_hit; WCHAR* start; /* * Check if the string must be quoted; * if unnecessary, don't do it, it may only confuse older programs. */ if (len == 0) { return target; } if (NULL == wcspbrk(source, L" \t\"")) { /* No quotation needed */ wcsncpy(target, source, len); target += len; return target; } if (NULL == wcspbrk(source, L"\"\\")) { /* * No embedded double quotes or backlashes, so I can just wrap * quote marks around the whole thing. */ *(target++) = L'"'; wcsncpy(target, source, len); target += len; *(target++) = L'"'; return target; } /* * Expected input/output: * input : hello"world * output: "hello\"world" * input : hello""world * output: "hello\"\"world" * input : hello\world * output: hello\world * input : hello\\world * output: hello\\world * input : hello\"world * output: "hello\\\"world" * input : hello\\"world * output: "hello\\\\\"world" * input : hello world\ * output: "hello world\" */ *(target++) = L'"'; start = target; quote_hit = 1; for (i = len; i > 0; --i) { *(target++) = source[i - 1]; if (quote_hit && source[i - 1] == L'\\') { *(target++) = L'\\'; } else if(source[i - 1] == L'"') { quote_hit = 1; *(target++) = L'\\'; } else { quote_hit = 0; } } target[0] = L'\0'; wcsrev(start); *(target++) = L'"'; return target; }
/* * Quotes command line arguments * Returns a pointer to the end (next char to be written) of the buffer */ WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target) { size_t len = wcslen(source); size_t i; int quote_hit; WCHAR* start; if (len == 0) { /* Need double quotation for empty argument */ *(target++) = L'"'; *(target++) = L'"'; return target; } if (NULL == wcspbrk(source, L" \t\"")) { /* No quotation needed */ wcsncpy(target, source, len); target += len; return target; } if (NULL == wcspbrk(source, L"\"\\")) { /* * No embedded double quotes or backlashes, so I can just wrap * quote marks around the whole thing. */ *(target++) = L'"'; wcsncpy(target, source, len); target += len; *(target++) = L'"'; return target; } /* * Expected input/output: * input : hello"world * output: "hello\"world" * input : hello""world * output: "hello\"\"world" * input : hello\world * output: hello\world * input : hello\\world * output: hello\\world * input : hello\"world * output: "hello\\\"world" * input : hello\\"world * output: "hello\\\\\"world" * input : hello world\ * output: "hello world\" */ *(target++) = L'"'; start = target; quote_hit = 1; for (i = len; i > 0; --i) { *(target++) = source[i - 1]; if (quote_hit && source[i - 1] == L'\\') { *(target++) = L'\\'; } else if(source[i - 1] == L'"') { quote_hit = 1; *(target++) = L'\\'; } else { quote_hit = 0; } } target[0] = L'\0'; wcsrev(start); *(target++) = L'"'; return target; }