mirror of https://github.com/procxx/kepka.git
moved minizip to ThirdParty, added google breakpad to ThirdParty for windows (mac, linux broken)
This commit is contained in:
parent
17a319fdb3
commit
a0d171bb49
|
@ -126,7 +126,7 @@ void AboutBox::dragEnterEvent(QDragEnterEvent *e) {
|
||||||
void AboutBox::dropEvent(QDropEvent *e) {
|
void AboutBox::dropEvent(QDropEvent *e) {
|
||||||
if (!_getCrashReportFile(e->mimeData()).isEmpty()) {
|
if (!_getCrashReportFile(e->mimeData()).isEmpty()) {
|
||||||
e->acceptProposedAction();
|
e->acceptProposedAction();
|
||||||
psShowCrash(_getCrashReportFile(e->mimeData()));
|
showCrashReportWindow(_getCrashReportFile(e->mimeData()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,15 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "pspecific.h"
|
#include "pspecific.h"
|
||||||
|
|
||||||
|
// see https://blog.inventic.eu/2012/08/qt-and-google-breakpad/
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include "client/windows/handler/exception_handler.h"
|
||||||
|
#elif defined Q_OS_MAC
|
||||||
|
#include "client/mac/handler/exception_handler.h"
|
||||||
|
#elif defined Q_OS_LINUX64 || defined Q_OS_LINUX32
|
||||||
|
#include "client/linux/handler/exception_handler.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum LogDataType {
|
enum LogDataType {
|
||||||
LogDataMain,
|
LogDataMain,
|
||||||
LogDataDebug,
|
LogDataDebug,
|
||||||
|
@ -257,6 +266,11 @@ void _logsWrite(LogDataType type, const QString &msg) {
|
||||||
|
|
||||||
void _moveOldDataFiles(const QString &from);
|
void _moveOldDataFiles(const QString &from);
|
||||||
|
|
||||||
|
namespace SignalHandlers {
|
||||||
|
void StartBreakpad();
|
||||||
|
void FinishBreakpad();
|
||||||
|
}
|
||||||
|
|
||||||
namespace Logs {
|
namespace Logs {
|
||||||
|
|
||||||
Initializer::Initializer() {
|
Initializer::Initializer() {
|
||||||
|
@ -304,6 +318,7 @@ namespace Logs {
|
||||||
QDir().mkpath(cWorkingDir() + qstr("tdata"));
|
QDir().mkpath(cWorkingDir() + qstr("tdata"));
|
||||||
|
|
||||||
Global::WorkingDirReady();
|
Global::WorkingDirReady();
|
||||||
|
SignalHandlers::StartBreakpad();
|
||||||
|
|
||||||
if (!LogsData->openMain()) {
|
if (!LogsData->openMain()) {
|
||||||
delete LogsData;
|
delete LogsData;
|
||||||
|
@ -354,6 +369,8 @@ namespace Logs {
|
||||||
LogsInMemory = DeletedLogsInMemory;
|
LogsInMemory = DeletedLogsInMemory;
|
||||||
|
|
||||||
_logsMutex(LogDataMain, true);
|
_logsMutex(LogDataMain, true);
|
||||||
|
|
||||||
|
SignalHandlers::FinishBreakpad();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool started() {
|
bool started() {
|
||||||
|
@ -640,6 +657,60 @@ namespace SignalHandlers {
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
google_breakpad::ExceptionHandler* BreakpadExceptionHandler = 0;
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
bool DumpCallback(const wchar_t* _dump_dir, const wchar_t* _minidump_id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool success)
|
||||||
|
#elif defined Q_OS_MAC
|
||||||
|
bool DumpCallback(const char* _dump_dir, const char* _minidump_id, void *context, bool success)
|
||||||
|
#elif defined Q_OS_LINUX64 || defined Q_OS_LINUX32
|
||||||
|
bool DumpCallback(const google_breakpad::MinidumpDescriptor &md, void *context, bool success)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartBreakpad() {
|
||||||
|
QString dumpPath = cWorkingDir() + qsl("tdumps");
|
||||||
|
QDir().mkpath(dumpPath);
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
BreakpadExceptionHandler = new google_breakpad::ExceptionHandler(
|
||||||
|
dumpPath.toStdWString(),
|
||||||
|
/*FilterCallback*/ 0,
|
||||||
|
DumpCallback,
|
||||||
|
/*context*/ 0,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
#elif defined Q_OS_MAC
|
||||||
|
pHandler = new google_breakpad::ExceptionHandler(
|
||||||
|
dumpPath.toStdString(),
|
||||||
|
/*FilterCallback*/ 0,
|
||||||
|
DumpCallback,
|
||||||
|
/*context*/ 0,
|
||||||
|
true,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
#elif defined Q_OS_LINUX64 || defined Q_OS_LINUX32
|
||||||
|
pHandler = new google_breakpad::ExceptionHandler(
|
||||||
|
google_breakpad::MinidumpDescriptor(dumpPath.toStdString()),
|
||||||
|
/*FilterCallback*/ 0,
|
||||||
|
DumpCallback,
|
||||||
|
/*context*/ 0,
|
||||||
|
true,
|
||||||
|
-1
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishBreakpad() {
|
||||||
|
if (BreakpadExceptionHandler) {
|
||||||
|
google_breakpad::ExceptionHandler *h = BreakpadExceptionHandler;
|
||||||
|
BreakpadExceptionHandler = 0;
|
||||||
|
delete h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Qt::HANDLE LoggingCrashThreadId = 0;
|
Qt::HANDLE LoggingCrashThreadId = 0;
|
||||||
bool LoggingCrashHeaderWritten = false;
|
bool LoggingCrashHeaderWritten = false;
|
||||||
QMutex LoggingCrashMutex;
|
QMutex LoggingCrashMutex;
|
||||||
|
@ -769,6 +840,8 @@ namespace SignalHandlers {
|
||||||
backtrace_symbols_fd(addresses, size, CrashDumpFileNo);
|
backtrace_symbols_fd(addresses, size, CrashDumpFileNo);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
dump() << "\nBacktrace:\n";
|
||||||
|
|
||||||
psWriteStackTrace();
|
psWriteStackTrace();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -842,6 +915,10 @@ namespace SignalHandlers {
|
||||||
}
|
}
|
||||||
|
|
||||||
void finish() {
|
void finish() {
|
||||||
|
if (BreakpadExceptionHandler) {
|
||||||
|
delete BreakpadExceptionHandler;
|
||||||
|
BreakpadExceptionHandler = 0;
|
||||||
|
}
|
||||||
if (CrashDumpFile) {
|
if (CrashDumpFile) {
|
||||||
fclose(CrashDumpFile);
|
fclose(CrashDumpFile);
|
||||||
unlink(CrashDumpPath.constData());
|
unlink(CrashDumpPath.constData());
|
||||||
|
|
|
@ -27,18 +27,13 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
_oldWndExceptionFilter = SetUnhandledExceptionFilter(_exceptionFilter);
|
|
||||||
// CAPIHook apiHook("kernel32.dll", "SetUnhandledExceptionFilter", (PROC)RedirectedSetUnhandledExceptionFilter);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
settingsParseArgs(argc, argv);
|
settingsParseArgs(argc, argv);
|
||||||
if (cLaunchMode() == LaunchModeFixPrevious) {
|
if (cLaunchMode() == LaunchModeFixPrevious) {
|
||||||
return psFixPrevious();
|
return psFixPrevious();
|
||||||
} else if (cLaunchMode() == LaunchModeCleanup) {
|
} else if (cLaunchMode() == LaunchModeCleanup) {
|
||||||
return psCleanup();
|
return psCleanup();
|
||||||
} else if (cLaunchMode() == LaunchModeShowCrash) {
|
} else if (cLaunchMode() == LaunchModeShowCrash) {
|
||||||
return psShowCrash(QFileInfo(cStartUrl()).absoluteFilePath());
|
return showCrashReportWindow(QFileInfo(cStartUrl()).absoluteFilePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
Logs::Initializer _logs;
|
Logs::Initializer _logs;
|
||||||
|
|
|
@ -1041,7 +1041,7 @@ QStringList addr2linestr(uint64 *addresses, int count) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
QString initial = QString::fromUtf8(crashdump), result;
|
QString initial = QString::fromUtf8(crashdump), result;
|
||||||
QStringList lines = initial.split('\n');
|
QStringList lines = initial.split('\n');
|
||||||
result.reserve(initial.size());
|
result.reserve(initial.size());
|
||||||
|
@ -1116,31 +1116,6 @@ QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int psShowCrash(const QString &crashdump) {
|
|
||||||
QString text;
|
|
||||||
|
|
||||||
QFile dump(crashdump);
|
|
||||||
if (dump.open(QIODevice::ReadOnly)) {
|
|
||||||
text = qsl("Crash dump file '%1':\n\n").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
text += _showCrashDump(dump.readAll(), crashdump);
|
|
||||||
} else {
|
|
||||||
text = qsl("ERROR: could not read crash dump file '%1'").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Sandbox::started()) {
|
|
||||||
ShowCrashReportWindow *wnd = new ShowCrashReportWindow(text);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray args[] = { "" };
|
|
||||||
int a_argc = 1;
|
|
||||||
char *a_argv[1] = { args[0].data() };
|
|
||||||
QApplication app(a_argc, a_argv);
|
|
||||||
|
|
||||||
ShowCrashReportWindow *wnd = new ShowCrashReportWindow(text);
|
|
||||||
return app.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _removeDirectory(const QString &path) { // from http://stackoverflow.com/questions/2256945/removing-a-non-empty-directory-programmatically-in-c-or-c
|
bool _removeDirectory(const QString &path) { // from http://stackoverflow.com/questions/2256945/removing-a-non-empty-directory-programmatically-in-c-or-c
|
||||||
QByteArray pathRaw = QFile::encodeName(path);
|
QByteArray pathRaw = QFile::encodeName(path);
|
||||||
DIR *d = opendir(pathRaw.constData());
|
DIR *d = opendir(pathRaw.constData());
|
||||||
|
|
|
@ -114,7 +114,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
void psWriteDump();
|
void psWriteDump();
|
||||||
int psShowCrash(const QString &crashdump);
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile);
|
||||||
|
|
||||||
void psDeleteDir(const QString &dir);
|
void psDeleteDir(const QString &dir);
|
||||||
|
|
||||||
|
|
|
@ -608,7 +608,7 @@ QStringList atosstr(uint64 *addresses, int count, uint64 base) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
QString initial = QString::fromUtf8(crashdump), result;
|
QString initial = QString::fromUtf8(crashdump), result;
|
||||||
QStringList lines = initial.split('\n');
|
QStringList lines = initial.split('\n');
|
||||||
result.reserve(initial.size());
|
result.reserve(initial.size());
|
||||||
|
@ -725,26 +725,6 @@ QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int psShowCrash(const QString &crashdump) {
|
|
||||||
QString text;
|
|
||||||
|
|
||||||
QFile dump(crashdump);
|
|
||||||
if (dump.open(QIODevice::ReadOnly)) {
|
|
||||||
text = qsl("Crash dump file '%1':\n\n").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
text += _showCrashDump(dump.readAll(), crashdump);
|
|
||||||
} else {
|
|
||||||
text = qsl("ERROR: could not read crash dump file '%1'").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray args[] = { "" };
|
|
||||||
int a_argc = 1;
|
|
||||||
char *a_argv[1] = { args[0].data() };
|
|
||||||
QApplication app(a_argc, a_argv);
|
|
||||||
|
|
||||||
ShowCrashReportWindow wnd(text);
|
|
||||||
return app.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void psDeleteDir(const QString &dir) {
|
void psDeleteDir(const QString &dir) {
|
||||||
objc_deleteDir(dir);
|
objc_deleteDir(dir);
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
void psWriteDump();
|
void psWriteDump();
|
||||||
int psShowCrash(const QString &crashdump);
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile);
|
||||||
|
|
||||||
void psDeleteDir(const QString &dir);
|
void psDeleteDir(const QString &dir);
|
||||||
|
|
||||||
|
|
|
@ -2356,19 +2356,6 @@ void psUpdateOverlayed(TWidget *widget) {
|
||||||
static const WCHAR *_programName = AppName; // folder in APPDATA, if current path is unavailable for writing
|
static const WCHAR *_programName = AppName; // folder in APPDATA, if current path is unavailable for writing
|
||||||
static const WCHAR *_exeName = L"Telegram.exe";
|
static const WCHAR *_exeName = L"Telegram.exe";
|
||||||
|
|
||||||
LPTOP_LEVEL_EXCEPTION_FILTER _oldWndExceptionFilter = 0;
|
|
||||||
|
|
||||||
typedef BOOL (FAR STDAPICALLTYPE *t_miniDumpWriteDump)(
|
|
||||||
_In_ HANDLE hProcess,
|
|
||||||
_In_ DWORD ProcessId,
|
|
||||||
_In_ HANDLE hFile,
|
|
||||||
_In_ MINIDUMP_TYPE DumpType,
|
|
||||||
_In_opt_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
|
|
||||||
_In_opt_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
|
|
||||||
_In_opt_ PMINIDUMP_CALLBACK_INFORMATION CallbackParam
|
|
||||||
);
|
|
||||||
t_miniDumpWriteDump miniDumpWriteDump = 0;
|
|
||||||
|
|
||||||
// Stack walk code is inspired by http://www.codeproject.com/Articles/11132/Walking-the-callstack
|
// Stack walk code is inspired by http://www.codeproject.com/Articles/11132/Walking-the-callstack
|
||||||
|
|
||||||
static const int StackEntryMaxNameLength = MAX_SYM_NAME + 1;
|
static const int StackEntryMaxNameLength = MAX_SYM_NAME + 1;
|
||||||
|
@ -2555,7 +2542,7 @@ typedef BOOL (FAR STDAPICALLTYPE *t_Module32Next)(HANDLE hSnapshot, LPMODULEENTR
|
||||||
t_Module32Next module32Next = 0;
|
t_Module32Next module32Next = 0;
|
||||||
|
|
||||||
bool LoadDbgHelp(bool extended = false) {
|
bool LoadDbgHelp(bool extended = false) {
|
||||||
if (miniDumpWriteDump && (!extended || symInitialize)) return true;
|
if (stackWalk64 && (!extended || symInitialize)) return true;
|
||||||
|
|
||||||
HMODULE hDll = 0;
|
HMODULE hDll = 0;
|
||||||
|
|
||||||
|
@ -2586,17 +2573,14 @@ bool LoadDbgHelp(bool extended = false) {
|
||||||
|
|
||||||
if (!hDll) return false;
|
if (!hDll) return false;
|
||||||
|
|
||||||
miniDumpWriteDump = (t_miniDumpWriteDump)GetProcAddress(hDll, "MiniDumpWriteDump");
|
|
||||||
|
|
||||||
stackWalk64 = (t_StackWalk64)GetProcAddress(hDll, "StackWalk64");
|
stackWalk64 = (t_StackWalk64)GetProcAddress(hDll, "StackWalk64");
|
||||||
symFunctionTableAccess64 = (t_SymFunctionTableAccess64)GetProcAddress(hDll, "SymFunctionTableAccess64");
|
symFunctionTableAccess64 = (t_SymFunctionTableAccess64)GetProcAddress(hDll, "SymFunctionTableAccess64");
|
||||||
symGetModuleBase64 = (t_SymGetModuleBase64)GetProcAddress(hDll, "SymGetModuleBase64");
|
symGetModuleBase64 = (t_SymGetModuleBase64)GetProcAddress(hDll, "SymGetModuleBase64");
|
||||||
|
|
||||||
if (!miniDumpWriteDump ||
|
if (!stackWalk64 ||
|
||||||
!stackWalk64 ||
|
|
||||||
!symFunctionTableAccess64 ||
|
!symFunctionTableAccess64 ||
|
||||||
!symGetModuleBase64) {
|
!symGetModuleBase64) {
|
||||||
miniDumpWriteDump = 0;
|
stackWalk64 = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2686,17 +2670,6 @@ bool LoadDbgHelp(bool extended = false) {
|
||||||
symOptions |= SYMOPT_FAIL_CRITICAL_ERRORS;
|
symOptions |= SYMOPT_FAIL_CRITICAL_ERRORS;
|
||||||
symOptions = symSetOptions(symOptions);
|
symOptions = symSetOptions(symOptions);
|
||||||
|
|
||||||
//WCHAR buf[StackEntryMaxNameLength] = { 0 };
|
|
||||||
//if (symGetSearchPath) {
|
|
||||||
// if (symGetSearchPath(hProcess, buf, StackEntryMaxNameLength) == FALSE) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//WCHAR szUserName[1024] = { 0 };
|
|
||||||
//DWORD dwSize = 1024;
|
|
||||||
//GetUserName(szUserName, &dwSize);
|
|
||||||
|
|
||||||
const WCHAR *dllname[] = { L"kernel32.dll", L"tlhelp32.dll" };
|
const WCHAR *dllname[] = { L"kernel32.dll", L"tlhelp32.dll" };
|
||||||
HINSTANCE hToolhelp = NULL;
|
HINSTANCE hToolhelp = NULL;
|
||||||
|
|
||||||
|
@ -2744,57 +2717,6 @@ bool LoadDbgHelp(bool extended = false) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _generateDump(EXCEPTION_POINTERS* pExceptionPointers) {
|
|
||||||
static const int maxFileLen = MAX_PATH * 10;
|
|
||||||
|
|
||||||
if (!LoadDbgHelp()) return;
|
|
||||||
|
|
||||||
HANDLE hDumpFile = 0;
|
|
||||||
|
|
||||||
WCHAR szPath[maxFileLen];
|
|
||||||
DWORD len = GetModuleFileName(GetModuleHandle(0), szPath, maxFileLen);
|
|
||||||
if (!len) return;
|
|
||||||
|
|
||||||
WCHAR *pathEnd = szPath + len;
|
|
||||||
|
|
||||||
if (!_wcsicmp(pathEnd - wcslen(_exeName), _exeName)) {
|
|
||||||
wsprintf(pathEnd - wcslen(_exeName), L"");
|
|
||||||
hDumpFile = _generateDumpFileAtPath(szPath);
|
|
||||||
}
|
|
||||||
if (!hDumpFile || hDumpFile == INVALID_HANDLE_VALUE) {
|
|
||||||
WCHAR wstrPath[maxFileLen];
|
|
||||||
DWORD wstrPathLen;
|
|
||||||
if (wstrPathLen = GetEnvironmentVariable(L"APPDATA", wstrPath, maxFileLen)) {
|
|
||||||
wsprintf(wstrPath + wstrPathLen, L"\\%s\\", _programName);
|
|
||||||
hDumpFile = _generateDumpFileAtPath(wstrPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hDumpFile || hDumpFile == INVALID_HANDLE_VALUE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MINIDUMP_EXCEPTION_INFORMATION ExpParam = {0};
|
|
||||||
ExpParam.ThreadId = GetCurrentThreadId();
|
|
||||||
ExpParam.ExceptionPointers = pExceptionPointers;
|
|
||||||
ExpParam.ClientPointers = TRUE;
|
|
||||||
|
|
||||||
miniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG CALLBACK _exceptionFilter(EXCEPTION_POINTERS* pExceptionPointers) {
|
|
||||||
_generateDump(pExceptionPointers);
|
|
||||||
return _oldWndExceptionFilter ? (*_oldWndExceptionFilter)(pExceptionPointers) : EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
// see http://www.codeproject.com/Articles/154686/SetUnhandledExceptionFilter-and-the-C-C-Runtime-Li
|
|
||||||
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI RedirectedSetUnhandledExceptionFilter(_In_opt_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) {
|
|
||||||
// When the CRT calls SetUnhandledExceptionFilter with NULL parameter
|
|
||||||
// our handler will not get removed.
|
|
||||||
_oldWndExceptionFilter = lpTopLevelExceptionFilter;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct StackEntry {
|
struct StackEntry {
|
||||||
DWORD64 offset; // if 0, we have no valid entry
|
DWORD64 offset; // if 0, we have no valid entry
|
||||||
CHAR name[StackEntryMaxNameLength];
|
CHAR name[StackEntryMaxNameLength];
|
||||||
|
@ -2841,7 +2763,11 @@ void psWriteDump() {
|
||||||
}
|
}
|
||||||
|
|
||||||
char ImageHlpSymbol64[sizeof(IMAGEHLP_SYMBOL64) + StackEntryMaxNameLength];
|
char ImageHlpSymbol64[sizeof(IMAGEHLP_SYMBOL64) + StackEntryMaxNameLength];
|
||||||
QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
|
if (!LoadDbgHelp(true)) {
|
||||||
|
return qsl("ERROR: could not init dbghelp.dll!");
|
||||||
|
}
|
||||||
|
|
||||||
HANDLE hProcess = GetCurrentProcess();
|
HANDLE hProcess = GetCurrentProcess();
|
||||||
|
|
||||||
QString initial = QString::fromUtf8(crashdump), result;
|
QString initial = QString::fromUtf8(crashdump), result;
|
||||||
|
@ -2889,17 +2815,7 @@ QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tolaunch.isEmpty()) {
|
if (!tolaunch.isEmpty()) {
|
||||||
if (QFile(tolaunch).exists()) {
|
result.append(qsl("ERROR: for this crashdump executable '%1' should be used!").arg(tolaunch));
|
||||||
QString targs = qsl("-crash \"%1\"").arg(dumpfile.replace('"', qsl("\"\"")));
|
|
||||||
HINSTANCE r = ShellExecute(0, 0, QDir::toNativeSeparators(tolaunch).toStdWString().c_str(), targs.toStdWString().c_str(), 0, SW_SHOWNORMAL);
|
|
||||||
if (long(r) < 32) {
|
|
||||||
result.append(qsl("ERROR: executable '%1' with args '%2' for this crashdump could not be launched! Result: %3").arg(tolaunch).arg(targs).arg(long(r)));
|
|
||||||
} else {
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.append(qsl("ERROR: executable '%1' for this crashdump was not found!").arg(tolaunch));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (i < l) {
|
while (i < l) {
|
||||||
|
@ -3005,6 +2921,8 @@ QString _showCrashDump(const QByteArray &crashdump, QString dumpfile) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
symCleanup(hProcess);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3086,34 +3004,6 @@ void psWriteStackTrace() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int psShowCrash(const QString &crashdump) {
|
|
||||||
QString text;
|
|
||||||
|
|
||||||
QFile dump(crashdump);
|
|
||||||
if (dump.open(QIODevice::ReadOnly)) {
|
|
||||||
text = qsl("Crash dump file '%1':\n\n").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
if (!LoadDbgHelp(true)) {
|
|
||||||
text += qsl("ERROR: could not init dbghelp.dll!");
|
|
||||||
} else {
|
|
||||||
text += _showCrashDump(dump.readAll(), crashdump);
|
|
||||||
symCleanup(GetCurrentProcess());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
text = qsl("ERROR: could not read crash dump file '%1'").arg(QFileInfo(crashdump).absoluteFilePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
WCHAR szTemp[MAX_PATH + 1] = { 0 };
|
|
||||||
GetModuleFileName(NULL, szTemp, MAX_PATH);
|
|
||||||
|
|
||||||
QByteArray args[] = { QString::fromWCharArray(szTemp).toUtf8() };
|
|
||||||
int a_argc = 1;
|
|
||||||
char *a_argv[1] = { args[0].data() };
|
|
||||||
QApplication app(a_argc, a_argv);
|
|
||||||
|
|
||||||
ShowCrashReportWindow wnd(text);
|
|
||||||
return app.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
class StringReferenceWrapper {
|
class StringReferenceWrapper {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -113,13 +113,9 @@ private:
|
||||||
void psDestroyIcons();
|
void psDestroyIcons();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern LPTOP_LEVEL_EXCEPTION_FILTER _oldWndExceptionFilter;
|
|
||||||
LONG CALLBACK _exceptionFilter(EXCEPTION_POINTERS* pExceptionPointers);
|
|
||||||
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI RedirectedSetUnhandledExceptionFilter(_In_opt_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
|
|
||||||
|
|
||||||
void psWriteDump();
|
void psWriteDump();
|
||||||
void psWriteStackTrace();
|
void psWriteStackTrace();
|
||||||
int psShowCrash(const QString &crashdump);
|
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile);
|
||||||
|
|
||||||
void psDeleteDir(const QString &dir);
|
void psDeleteDir(const QString &dir);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
|
||||||
#include "mediaview.h"
|
#include "mediaview.h"
|
||||||
#include "localstorage.h"
|
#include "localstorage.h"
|
||||||
|
|
||||||
#include "_other/zip.h"
|
#include "zip.h"
|
||||||
|
|
||||||
ConnectingWidget::ConnectingWidget(QWidget *parent, const QString &text, const QString &reconnect) : QWidget(parent), _shadow(st::boxShadow), _reconnect(this, QString()) {
|
ConnectingWidget::ConnectingWidget(QWidget *parent, const QString &text, const QString &reconnect) : QWidget(parent), _shadow(st::boxShadow), _reconnect(this, QString()) {
|
||||||
set(text, reconnect);
|
set(text, reconnect);
|
||||||
|
@ -63,6 +63,7 @@ void ConnectingWidget::set(const QString &text, const QString &reconnect) {
|
||||||
resize(st::connectingPadding.left() + _textWidth + _reconnectWidth + st::connectingPadding.right() + st::boxShadow.pxWidth(), st::boxShadow.pxHeight() + st::connectingPadding.top() + st::linkFont->height + st::connectingPadding.bottom());
|
resize(st::connectingPadding.left() + _textWidth + _reconnectWidth + st::connectingPadding.right() + st::boxShadow.pxWidth(), st::boxShadow.pxHeight() + st::connectingPadding.top() + st::linkFont->height + st::connectingPadding.bottom());
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectingWidget::paintEvent(QPaintEvent *e) {
|
void ConnectingWidget::paintEvent(QPaintEvent *e) {
|
||||||
QPainter p(this);
|
QPainter p(this);
|
||||||
|
|
||||||
|
@ -2021,22 +2022,24 @@ LastCrashedWindow::LastCrashedWindow()
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
if (_sendingState != SendingNoReport) {
|
if (_sendingState != SendingNoReport) {
|
||||||
QString maxDump, maxDumpFull;
|
QString maxDump, maxDumpFull;
|
||||||
QDateTime maxDumpModified;
|
QDateTime maxDumpModified, workingModified = QFileInfo(cWorkingDir() + qsl("tdata/working")).lastModified();
|
||||||
qint64 maxDumpSize = 0;
|
qint64 maxDumpSize = 0;
|
||||||
QFileInfoList list = QDir(cWorkingDir() + qsl("tdumps")).entryInfoList();
|
QFileInfoList list = QDir(cWorkingDir() + qsl("tdumps")).entryInfoList();
|
||||||
for (int32 i = 0, l = list.size(); i < l; ++i) {
|
for (int32 i = 0, l = list.size(); i < l; ++i) {
|
||||||
if (maxDump.isEmpty() || maxDumpModified < list.at(i).lastModified()) {
|
QString name = list.at(i).fileName();
|
||||||
maxDump = list.at(i).fileName();
|
if (name.endsWith(qstr(".dmp"))) {
|
||||||
maxDumpFull = list.at(i).absoluteFilePath();
|
QDateTime modified = list.at(i).lastModified();
|
||||||
maxDumpModified = list.at(i).lastModified();
|
if (maxDump.isEmpty() || qAbs(workingModified.secsTo(modified)) < qAbs(workingModified.secsTo(maxDumpModified))) {
|
||||||
maxDumpSize = list.at(i).size();
|
maxDump = name;
|
||||||
|
maxDumpModified = modified;
|
||||||
|
maxDumpFull = list.at(i).absoluteFilePath();
|
||||||
|
maxDumpSize = list.at(i).size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!maxDump.isEmpty()) {
|
if (!maxDump.isEmpty() && qAbs(workingModified.secsTo(maxDumpModified)) < 10) {
|
||||||
if (qAbs(QFileInfo(cWorkingDir() + qsl("tdata/working")).lastModified().secsTo(maxDumpModified)) < 10) {
|
_minidumpName = maxDump;
|
||||||
_minidumpName = maxDump;
|
_minidumpFull = maxDumpFull;
|
||||||
_minidumpFull = maxDumpFull;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_minidump.setText(qsl("+ %1 (%2 KB)").arg(_minidumpName).arg(maxDumpSize / 1024));
|
_minidump.setText(qsl("+ %1 (%2 KB)").arg(_minidumpName).arg(maxDumpSize / 1024));
|
||||||
|
@ -2306,7 +2309,7 @@ void LastCrashedWindow::onCheckingFinished() {
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
QFileInfo dmpFile(_minidumpFull);
|
QFileInfo dmpFile(_minidumpFull);
|
||||||
if (dmpFile.exists() && dmpFile.size() > 0 && dmpFile.size() < 20 * 1024 * 1024 &&
|
if (dmpFile.exists() && dmpFile.size() > 0 && dmpFile.size() < 20 * 1024 * 1024 &&
|
||||||
QRegularExpression(qsl("^Telegram\\-[\\d\\.\\-]{1,64}\\.dmp$")).match(dmpFile.fileName()).hasMatch()) {
|
QRegularExpression(qsl("^[a-z0-9\\-]{1,64}\\.dmp$")).match(dmpFile.fileName()).hasMatch()) {
|
||||||
QFile file(_minidumpFull);
|
QFile file(_minidumpFull);
|
||||||
if (file.open(QIODevice::ReadOnly)) {
|
if (file.open(QIODevice::ReadOnly)) {
|
||||||
QByteArray minidump = file.readAll();
|
QByteArray minidump = file.readAll();
|
||||||
|
@ -2878,3 +2881,28 @@ void ShowCrashReportWindow::resizeEvent(QResizeEvent *e) {
|
||||||
void ShowCrashReportWindow::closeEvent(QCloseEvent *e) {
|
void ShowCrashReportWindow::closeEvent(QCloseEvent *e) {
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int showCrashReportWindow(const QString &crashdump) {
|
||||||
|
QString text;
|
||||||
|
|
||||||
|
QFile dump(crashdump);
|
||||||
|
if (dump.open(QIODevice::ReadOnly)) {
|
||||||
|
text = qsl("Crash dump file '%1':\n\n").arg(QFileInfo(crashdump).absoluteFilePath());
|
||||||
|
text += psPrepareCrashDump(dump.readAll(), crashdump);
|
||||||
|
} else {
|
||||||
|
text = qsl("ERROR: could not read crash dump file '%1'").arg(QFileInfo(crashdump).absoluteFilePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Sandbox::started()) {
|
||||||
|
ShowCrashReportWindow *wnd = new ShowCrashReportWindow(text);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray args[] = { QDir::toNativeSeparators(cExeDir() + cExeName()).toUtf8() };
|
||||||
|
int a_argc = 1;
|
||||||
|
char *a_argv[1] = { args[0].data() };
|
||||||
|
QApplication app(a_argc, a_argv);
|
||||||
|
|
||||||
|
ShowCrashReportWindow *wnd = new ShowCrashReportWindow(text);
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
|
@ -554,3 +554,5 @@ private:
|
||||||
PreLaunchLog _log;
|
PreLaunchLog _log;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int showCrashReportWindow(const QString &crashdump);
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>AL_LIBTYPE_STATIC;UNICODE;WIN32;WIN64;HAVE_STDINT_H;ZLIB_WINAPI;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>AL_LIBTYPE_STATIC;UNICODE;WIN32;WIN64;HAVE_STDINT_H;ZLIB_WINAPI;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>.\..\..\Libraries\lzma\C;.\..\..\Libraries\libexif-0.6.20;.\..\..\Libraries\zlib-1.2.8;.\..\..\Libraries\openssl_debug\Debug\include;.\..\..\Libraries\ffmpeg;.\..\..\Libraries\openal-soft\include;.\SourceFiles;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore;.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>.\..\..\Libraries\lzma\C;.\..\..\Libraries\libexif-0.6.20;.\..\..\Libraries\zlib-1.2.8;.\..\..\Libraries\openssl_debug\Debug\include;.\..\..\Libraries\ffmpeg;.\..\..\Libraries\openal-soft\include;.\ThirdParty\breakpad;.\ThirdParty\minizip;.\SourceFiles;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore;.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
|
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
@ -1053,14 +1053,44 @@
|
||||||
<ClCompile Include="SourceFiles\title.cpp" />
|
<ClCompile Include="SourceFiles\title.cpp" />
|
||||||
<ClCompile Include="SourceFiles\types.cpp" />
|
<ClCompile Include="SourceFiles\types.cpp" />
|
||||||
<ClCompile Include="SourceFiles\window.cpp" />
|
<ClCompile Include="SourceFiles\window.cpp" />
|
||||||
<ClCompile Include="SourceFiles\_other\zip.c">
|
<ClCompile Include="ThirdParty\breakpad\client\windows\crash_generation\crash_generation_client.cc">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\breakpad\client\windows\handler\exception_handler.cc">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\breakpad\common\windows\guid_string.cc">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\minizip\zip.c">
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="SourceFiles\_other\crypt.h" />
|
<ClInclude Include="ThirdParty\breakpad\client\windows\common\ipc_protocol.h" />
|
||||||
<ClInclude Include="SourceFiles\_other\ioapi.h" />
|
<ClInclude Include="ThirdParty\breakpad\client\windows\crash_generation\crash_generation_client.h" />
|
||||||
<ClInclude Include="SourceFiles\_other\zip.h" />
|
<ClInclude Include="ThirdParty\breakpad\client\windows\handler\exception_handler.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\scoped_ptr.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\windows\guid_string.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\windows\string_utils-inl.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\breakpad_types.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_amd64.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_arm.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_arm64.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_mips.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_ppc.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_ppc64.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_sparc.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_x86.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_linux.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_mac.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_ps3.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_solaris.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_win32.h" />
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_format.h" />
|
||||||
|
<ClInclude Include="ThirdParty\minizip\crypt.h" />
|
||||||
|
<ClInclude Include="ThirdParty\minizip\ioapi.h" />
|
||||||
|
<ClInclude Include="ThirdParty\minizip\zip.h" />
|
||||||
<CustomBuild Include="SourceFiles\types.h">
|
<CustomBuild Include="SourceFiles\types.h">
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing types.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing types.h...</Message>
|
||||||
|
@ -1069,7 +1099,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing types.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing types.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/types.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/types.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing types.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing types.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1078,7 +1108,7 @@
|
||||||
<CustomBuild Include="SourceFiles\window.h">
|
<CustomBuild Include="SourceFiles\window.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing window.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing window.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/window.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/window.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing window.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing window.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing window.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing window.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1110,7 +1140,7 @@
|
||||||
<CustomBuild Include="SourceFiles\application.h">
|
<CustomBuild Include="SourceFiles\application.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing application.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing application.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/application.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/application.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing application.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing application.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing application.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing application.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1133,7 +1163,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing apiwrap.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing apiwrap.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/apiwrap.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/apiwrap.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing apiwrap.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing apiwrap.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1143,7 +1173,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\aboutbox.h">
|
<CustomBuild Include="SourceFiles\boxes\aboutbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing aboutbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing aboutbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/aboutbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/aboutbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing aboutbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing aboutbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing aboutbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing aboutbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1157,7 +1187,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\addcontactbox.h">
|
<CustomBuild Include="SourceFiles\boxes\addcontactbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing addcontactbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing addcontactbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/addcontactbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/addcontactbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing addcontactbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing addcontactbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing addcontactbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing addcontactbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1171,7 +1201,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\confirmbox.h">
|
<CustomBuild Include="SourceFiles\boxes\confirmbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing confirmbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing confirmbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/confirmbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/confirmbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing confirmbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing confirmbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing confirmbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing confirmbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1185,7 +1215,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\connectionbox.h">
|
<CustomBuild Include="SourceFiles\boxes\connectionbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing connectionbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing connectionbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/connectionbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/connectionbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing connectionbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing connectionbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing connectionbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing connectionbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1199,7 +1229,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\contactsbox.h">
|
<CustomBuild Include="SourceFiles\boxes\contactsbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing contactsbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing contactsbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/contactsbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/contactsbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing contactsbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing contactsbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing contactsbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing contactsbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1213,7 +1243,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\photocropbox.h">
|
<CustomBuild Include="SourceFiles\boxes\photocropbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing photocropbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing photocropbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/photocropbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/photocropbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing photocropbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing photocropbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing photocropbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing photocropbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1227,7 +1257,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\photosendbox.h">
|
<CustomBuild Include="SourceFiles\boxes\photosendbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing photosendbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing photosendbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/photosendbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/photosendbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing photosendbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing photosendbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing photosendbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing photosendbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1241,7 +1271,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\emojibox.h">
|
<CustomBuild Include="SourceFiles\boxes\emojibox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing emojibox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing emojibox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/emojibox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/emojibox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing emojibox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing emojibox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing emojibox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing emojibox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1255,7 +1285,7 @@
|
||||||
<CustomBuild Include="SourceFiles\boxes\downloadpathbox.h">
|
<CustomBuild Include="SourceFiles\boxes\downloadpathbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/downloadpathbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/downloadpathbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing downloadpathbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1274,7 +1304,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing audio.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing audio.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/audio.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/audio.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing audio.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing audio.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1288,7 +1318,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing usernamebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing usernamebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/usernamebox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/usernamebox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing usernamebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing usernamebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1302,7 +1332,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing languagebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing languagebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/languagebox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/languagebox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing languagebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing languagebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1316,7 +1346,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing backgroundbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing backgroundbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/backgroundbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/backgroundbox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing backgroundbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing backgroundbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1330,7 +1360,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing autolockbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing autolockbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/autolockbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/autolockbox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing autolockbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing autolockbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1344,7 +1374,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing passcodebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing passcodebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/passcodebox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/passcodebox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing passcodebox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing passcodebox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1358,7 +1388,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing sessionsbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing sessionsbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/sessionsbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/sessionsbox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing sessionsbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing sessionsbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1372,7 +1402,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing abstractbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing abstractbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/abstractbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/abstractbox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing abstractbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing abstractbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1386,7 +1416,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing stickersetbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing stickersetbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/stickersetbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/boxes/stickersetbox.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing stickersetbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing stickersetbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1400,7 +1430,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing autoupdater.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing autoupdater.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/autoupdater.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/autoupdater.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing autoupdater.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing autoupdater.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1410,7 +1440,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\animation.h">
|
<CustomBuild Include="SourceFiles\gui\animation.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing animation.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing animation.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/animation.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/animation.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing animation.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing animation.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing animation.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing animation.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1424,7 +1454,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\button.h">
|
<CustomBuild Include="SourceFiles\gui\button.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing button.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing button.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/button.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/button.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing button.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing button.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing button.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing button.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1438,7 +1468,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\flatbutton.h">
|
<CustomBuild Include="SourceFiles\gui\flatbutton.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatbutton.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatbutton.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatbutton.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatbutton.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatbutton.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatbutton.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatbutton.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatbutton.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1452,7 +1482,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\flatinput.h">
|
<CustomBuild Include="SourceFiles\gui\flatinput.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatinput.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatinput.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatinput.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatinput.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatinput.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1466,7 +1496,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\countryinput.h">
|
<CustomBuild Include="SourceFiles\gui\countryinput.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing countryinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing countryinput.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/countryinput.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/countryinput.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing countryinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing countryinput.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing countryinput.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing countryinput.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1481,7 +1511,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\scrollarea.h">
|
<CustomBuild Include="SourceFiles\gui\scrollarea.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing scrollarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing scrollarea.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/scrollarea.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/scrollarea.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing scrollarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing scrollarea.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing scrollarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing scrollarea.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1495,7 +1525,7 @@
|
||||||
<CustomBuild Include="SourceFiles\dialogswidget.h">
|
<CustomBuild Include="SourceFiles\dialogswidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing dialogswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing dialogswidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/dialogswidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/dialogswidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing dialogswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing dialogswidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing dialogswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing dialogswidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1509,7 +1539,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\flattextarea.h">
|
<CustomBuild Include="SourceFiles\gui\flattextarea.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flattextarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flattextarea.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flattextarea.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flattextarea.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flattextarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flattextarea.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flattextarea.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flattextarea.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1523,7 +1553,7 @@
|
||||||
<CustomBuild Include="SourceFiles\fileuploader.h">
|
<CustomBuild Include="SourceFiles\fileuploader.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing fileuploader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing fileuploader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/fileuploader.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/fileuploader.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing fileuploader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing fileuploader.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing fileuploader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing fileuploader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1537,7 +1567,7 @@
|
||||||
<CustomBuild Include="SourceFiles\dropdown.h">
|
<CustomBuild Include="SourceFiles\dropdown.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing dropdown.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing dropdown.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/dropdown.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/dropdown.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing dropdown.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing dropdown.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing dropdown.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing dropdown.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1558,7 +1588,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing popupmenu.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing popupmenu.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/popupmenu.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/popupmenu.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing popupmenu.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing popupmenu.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1568,7 +1598,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\flatcheckbox.h">
|
<CustomBuild Include="SourceFiles\gui\flatcheckbox.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatcheckbox.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatcheckbox.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatcheckbox.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1603,7 +1633,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\flatlabel.h">
|
<CustomBuild Include="SourceFiles\gui\flatlabel.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatlabel.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing flatlabel.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatlabel.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/flatlabel.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatlabel.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing flatlabel.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatlabel.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing flatlabel.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1617,7 +1647,7 @@
|
||||||
<CustomBuild Include="SourceFiles\gui\twidget.h">
|
<CustomBuild Include="SourceFiles\gui\twidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing twidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing twidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/twidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/twidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing twidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing twidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing twidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing twidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1636,7 +1666,7 @@
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing history.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing history.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing history.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing history.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl\Release\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/history.h"</Command>
|
||||||
|
@ -1647,7 +1677,7 @@
|
||||||
<CustomBuild Include="SourceFiles\historywidget.h">
|
<CustomBuild Include="SourceFiles\historywidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing historywidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing historywidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/historywidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/historywidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing historywidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing historywidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing historywidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing historywidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1661,7 +1691,7 @@
|
||||||
<CustomBuild Include="SourceFiles\intro\intro.h">
|
<CustomBuild Include="SourceFiles\intro\intro.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing intro.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing intro.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/intro.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/intro.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing intro.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing intro.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing intro.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing intro.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1675,7 +1705,7 @@
|
||||||
<CustomBuild Include="SourceFiles\intro\introcode.h">
|
<CustomBuild Include="SourceFiles\intro\introcode.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introcode.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introcode.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introcode.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introcode.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introcode.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introcode.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introcode.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introcode.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1689,7 +1719,7 @@
|
||||||
<CustomBuild Include="SourceFiles\intro\introphone.h">
|
<CustomBuild Include="SourceFiles\intro\introphone.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introphone.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introphone.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introphone.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introphone.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introphone.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introphone.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introphone.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introphone.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1703,7 +1733,7 @@
|
||||||
<CustomBuild Include="SourceFiles\intro\introsignup.h">
|
<CustomBuild Include="SourceFiles\intro\introsignup.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introsignup.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing introsignup.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introsignup.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/introsignup.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introsignup.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing introsignup.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introsignup.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing introsignup.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1722,7 +1752,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing intropwdcheck.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing intropwdcheck.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/intropwdcheck.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/intro/intropwdcheck.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing intropwdcheck.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing intropwdcheck.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1732,7 +1762,7 @@
|
||||||
<CustomBuild Include="SourceFiles\layerwidget.h">
|
<CustomBuild Include="SourceFiles\layerwidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing layerwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing layerwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/layerwidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/layerwidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing layerwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing layerwidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing layerwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing layerwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1746,7 +1776,7 @@
|
||||||
<CustomBuild Include="SourceFiles\localimageloader.h">
|
<CustomBuild Include="SourceFiles\localimageloader.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing localimageloader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing localimageloader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/localimageloader.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/localimageloader.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing localimageloader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing localimageloader.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing localimageloader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing localimageloader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1767,7 +1797,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing localstorage.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing localstorage.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/localstorage.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/localstorage.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing localstorage.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing localstorage.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1797,7 +1827,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mtproto\mtpConnection.h">
|
<CustomBuild Include="SourceFiles\mtproto\mtpConnection.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpConnection.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpConnection.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpConnection.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpConnection.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpConnection.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpConnection.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpConnection.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpConnection.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1811,7 +1841,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mainwidget.h">
|
<CustomBuild Include="SourceFiles\mainwidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mainwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mainwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mainwidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mainwidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mainwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mainwidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mainwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mainwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1825,7 +1855,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mtproto\mtp.h">
|
<CustomBuild Include="SourceFiles\mtproto\mtp.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtp.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtp.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtp.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtp.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtp.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtp.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtp.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtp.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1844,7 +1874,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mediaview.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mediaview.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mediaview.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mediaview.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mediaview.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mediaview.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1854,7 +1884,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mtproto\mtpFileLoader.h">
|
<CustomBuild Include="SourceFiles\mtproto\mtpFileLoader.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpFileLoader.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpFileLoader.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpFileLoader.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1870,7 +1900,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mtproto\mtpDC.h">
|
<CustomBuild Include="SourceFiles\mtproto\mtpDC.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpDC.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpDC.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpDC.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpDC.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpDC.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpDC.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpDC.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpDC.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1886,7 +1916,7 @@
|
||||||
<CustomBuild Include="SourceFiles\mtproto\mtpSession.h">
|
<CustomBuild Include="SourceFiles\mtproto\mtpSession.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpSession.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing mtpSession.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpSession.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/mtproto/mtpSession.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpSession.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing mtpSession.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpSession.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing mtpSession.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1900,7 +1930,7 @@
|
||||||
<CustomBuild Include="SourceFiles\settingswidget.h">
|
<CustomBuild Include="SourceFiles\settingswidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing settingswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing settingswidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/settingswidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/settingswidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing settingswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing settingswidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing settingswidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing settingswidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1914,7 +1944,7 @@
|
||||||
<CustomBuild Include="SourceFiles\profilewidget.h">
|
<CustomBuild Include="SourceFiles\profilewidget.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing profilewidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing profilewidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/profilewidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/profilewidget.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing profilewidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing profilewidget.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing profilewidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing profilewidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1928,7 +1958,7 @@
|
||||||
<CustomBuild Include="SourceFiles\pspecific_wnd.h">
|
<CustomBuild Include="SourceFiles\pspecific_wnd.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_wnd.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_wnd.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing pspecific_wnd.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1948,7 +1978,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing overviewwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing overviewwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/overviewwidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/overviewwidget.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing overviewwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing overviewwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1962,7 +1992,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing passcodewidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing passcodewidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/passcodewidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/passcodewidget.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing passcodewidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing passcodewidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1976,7 +2006,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing playerwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing playerwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/playerwidget.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/playerwidget.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing playerwidget.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing playerwidget.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -1992,7 +2022,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_linux.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_linux.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_linux.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_linux.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_linux.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_linux.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -2009,7 +2039,7 @@
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_mac.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing pspecific_mac.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_mac.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/pspecific_mac.h"</Command>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_mac.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing pspecific_mac.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -2048,7 +2078,7 @@
|
||||||
<CustomBuild Include="SourceFiles\sysbuttons.h">
|
<CustomBuild Include="SourceFiles\sysbuttons.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing sysbuttons.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing sysbuttons.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/sysbuttons.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/sysbuttons.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing sysbuttons.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing sysbuttons.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing sysbuttons.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing sysbuttons.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
@ -2062,7 +2092,7 @@
|
||||||
<CustomBuild Include="SourceFiles\title.h">
|
<CustomBuild Include="SourceFiles\title.h">
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing title.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing title.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/title.h"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\openssl_debug\Debug\include" "-I.\..\..\Libraries\ffmpeg" "-I.\..\..\Libraries\openal-soft\include" "-I.\ThirdParty\breakpad" "-I.\ThirdParty\minizip" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/title.h"</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing title.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing title.h...</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing title.h...</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing title.h...</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
|
||||||
|
|
|
@ -46,6 +46,42 @@
|
||||||
<Filter Include="Version">
|
<Filter Include="Version">
|
||||||
<UniqueIdentifier>{9d7bbb7d-817b-4f19-a719-74e674bdc84b}</UniqueIdentifier>
|
<UniqueIdentifier>{9d7bbb7d-817b-4f19-a719-74e674bdc84b}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty">
|
||||||
|
<UniqueIdentifier>{cda95767-f353-4a6b-a124-73632e61028a}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\minizip">
|
||||||
|
<UniqueIdentifier>{1abe710c-3c36-484c-b2a5-881c29a051c2}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad">
|
||||||
|
<UniqueIdentifier>{7bd3aaf0-4c45-4177-841d-e09b420f969b}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\client">
|
||||||
|
<UniqueIdentifier>{7e91af88-3ca1-43f3-b213-ae3a6e9adbe3}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\client\windows">
|
||||||
|
<UniqueIdentifier>{729af6c6-f616-40f3-86d8-7a177a4ca581}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\client\windows\handler">
|
||||||
|
<UniqueIdentifier>{6ebf64cf-1373-4c85-bc7c-a334da36957d}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\client\windows\common">
|
||||||
|
<UniqueIdentifier>{342ef107-8d0a-4518-a4ef-186706a51186}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\client\windows\crash_generation">
|
||||||
|
<UniqueIdentifier>{ea350daa-d09f-4e6a-a31d-46c971c7e117}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\common">
|
||||||
|
<UniqueIdentifier>{22eae21d-0b6e-4c24-b12a-cad8538b25cf}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\common\windows">
|
||||||
|
<UniqueIdentifier>{6a602fc1-ef90-4276-ad51-e68e520a750d}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\google_breakpad">
|
||||||
|
<UniqueIdentifier>{8c8b7809-73e8-4074-986d-39cfda2961a0}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="ThirdParty\breakpad\google_breakpad\common">
|
||||||
|
<UniqueIdentifier>{1a35c875-fa31-4146-9555-1443abb58026}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="SourceFiles\main.cpp">
|
<ClCompile Include="SourceFiles\main.cpp">
|
||||||
|
@ -897,8 +933,17 @@
|
||||||
<ClCompile Include="GeneratedFiles\Release\moc_history.cpp">
|
<ClCompile Include="GeneratedFiles\Release\moc_history.cpp">
|
||||||
<Filter>Generated Files\Release</Filter>
|
<Filter>Generated Files\Release</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="SourceFiles\_other\zip.c">
|
<ClCompile Include="ThirdParty\minizip\zip.c">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>ThirdParty\minizip</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\breakpad\client\windows\handler\exception_handler.cc">
|
||||||
|
<Filter>ThirdParty\breakpad\client\windows\handler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\breakpad\client\windows\crash_generation\crash_generation_client.cc">
|
||||||
|
<Filter>ThirdParty\breakpad\client\windows\crash_generation</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="ThirdParty\breakpad\common\windows\guid_string.cc">
|
||||||
|
<Filter>ThirdParty\breakpad\common\windows</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -989,14 +1034,77 @@
|
||||||
<ClInclude Include="SourceFiles\facades.h">
|
<ClInclude Include="SourceFiles\facades.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="SourceFiles\_other\zip.h">
|
<ClInclude Include="ThirdParty\minizip\crypt.h">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>ThirdParty\minizip</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="SourceFiles\_other\ioapi.h">
|
<ClInclude Include="ThirdParty\minizip\ioapi.h">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>ThirdParty\minizip</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="SourceFiles\_other\crypt.h">
|
<ClInclude Include="ThirdParty\minizip\zip.h">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>ThirdParty\minizip</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\client\windows\handler\exception_handler.h">
|
||||||
|
<Filter>ThirdParty\breakpad\client\windows\handler</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\client\windows\common\ipc_protocol.h">
|
||||||
|
<Filter>ThirdParty\breakpad\client\windows\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\client\windows\crash_generation\crash_generation_client.h">
|
||||||
|
<Filter>ThirdParty\breakpad\client\windows\crash_generation</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\windows\string_utils-inl.h">
|
||||||
|
<Filter>ThirdParty\breakpad\common\windows</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\scoped_ptr.h">
|
||||||
|
<Filter>ThirdParty\breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_format.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\common\windows\guid_string.h">
|
||||||
|
<Filter>ThirdParty\breakpad\common\windows</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\breakpad_types.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_amd64.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_arm.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_arm64.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_mips.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_ppc.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_ppc64.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_sparc.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_cpu_x86.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_linux.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_mac.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_ps3.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_solaris.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ThirdParty\breakpad\google_breakpad\common\minidump_exception_win32.h">
|
||||||
|
<Filter>ThirdParty\breakpad\google_breakpad\common</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -0,0 +1,765 @@
|
||||||
|
// Copyright (c) 2010 Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// The ExceptionHandler object installs signal handlers for a number of
|
||||||
|
// signals. We rely on the signal handler running on the thread which crashed
|
||||||
|
// in order to identify it. This is true of the synchronous signals (SEGV etc),
|
||||||
|
// but not true of ABRT. Thus, if you send ABRT to yourself in a program which
|
||||||
|
// uses ExceptionHandler, you need to use tgkill to direct it to the current
|
||||||
|
// thread.
|
||||||
|
//
|
||||||
|
// The signal flow looks like this:
|
||||||
|
//
|
||||||
|
// SignalHandler (uses a global stack of ExceptionHandler objects to find
|
||||||
|
// | one to handle the signal. If the first rejects it, try
|
||||||
|
// | the second etc...)
|
||||||
|
// V
|
||||||
|
// HandleSignal ----------------------------| (clones a new process which
|
||||||
|
// | | shares an address space with
|
||||||
|
// (wait for cloned | the crashed process. This
|
||||||
|
// process) | allows us to ptrace the crashed
|
||||||
|
// | | process)
|
||||||
|
// V V
|
||||||
|
// (set signal handler to ThreadEntry (static function to bounce
|
||||||
|
// SIG_DFL and rethrow, | back into the object)
|
||||||
|
// killing the crashed |
|
||||||
|
// process) V
|
||||||
|
// DoDump (writes minidump)
|
||||||
|
// |
|
||||||
|
// V
|
||||||
|
// sys_exit
|
||||||
|
//
|
||||||
|
|
||||||
|
// This code is a little fragmented. Different functions of the ExceptionHandler
|
||||||
|
// class run in a number of different contexts. Some of them run in a normal
|
||||||
|
// context and are easy to code, others run in a compromised context and the
|
||||||
|
// restrictions at the top of minidump_writer.cc apply: no libc and use the
|
||||||
|
// alternative malloc. Each function should have comment above it detailing the
|
||||||
|
// context which it runs in.
|
||||||
|
|
||||||
|
#include "client/linux/handler/exception_handler.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/limits.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/signal.h>
|
||||||
|
#include <sys/ucontext.h>
|
||||||
|
#include <sys/user.h>
|
||||||
|
#include <ucontext.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "common/basictypes.h"
|
||||||
|
#include "common/linux/linux_libc_support.h"
|
||||||
|
#include "common/memory.h"
|
||||||
|
#include "client/linux/log/log.h"
|
||||||
|
#include "client/linux/microdump_writer/microdump_writer.h"
|
||||||
|
#include "client/linux/minidump_writer/linux_dumper.h"
|
||||||
|
#include "client/linux/minidump_writer/minidump_writer.h"
|
||||||
|
#include "common/linux/eintr_wrapper.h"
|
||||||
|
#include "third_party/lss/linux_syscall_support.h"
|
||||||
|
|
||||||
|
#if defined(__ANDROID__)
|
||||||
|
#include "linux/sched.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PR_SET_PTRACER
|
||||||
|
#define PR_SET_PTRACER 0x59616d61
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// A wrapper for the tgkill syscall: send a signal to a specific thread.
|
||||||
|
static int tgkill(pid_t tgid, pid_t tid, int sig) {
|
||||||
|
return syscall(__NR_tgkill, tgid, tid, sig);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// The list of signals which we consider to be crashes. The default action for
|
||||||
|
// all these signals must be Core (see man 7 signal) because we rethrow the
|
||||||
|
// signal after handling it and expect that it'll be fatal.
|
||||||
|
const int kExceptionSignals[] = {
|
||||||
|
SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS
|
||||||
|
};
|
||||||
|
const int kNumHandledSignals =
|
||||||
|
sizeof(kExceptionSignals) / sizeof(kExceptionSignals[0]);
|
||||||
|
struct sigaction old_handlers[kNumHandledSignals];
|
||||||
|
bool handlers_installed = false;
|
||||||
|
|
||||||
|
// InstallAlternateStackLocked will store the newly installed stack in new_stack
|
||||||
|
// and (if it exists) the previously installed stack in old_stack.
|
||||||
|
stack_t old_stack;
|
||||||
|
stack_t new_stack;
|
||||||
|
bool stack_installed = false;
|
||||||
|
|
||||||
|
// Create an alternative stack to run the signal handlers on. This is done since
|
||||||
|
// the signal might have been caused by a stack overflow.
|
||||||
|
// Runs before crashing: normal context.
|
||||||
|
void InstallAlternateStackLocked() {
|
||||||
|
if (stack_installed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(&old_stack, 0, sizeof(old_stack));
|
||||||
|
memset(&new_stack, 0, sizeof(new_stack));
|
||||||
|
|
||||||
|
// SIGSTKSZ may be too small to prevent the signal handlers from overrunning
|
||||||
|
// the alternative stack. Ensure that the size of the alternative stack is
|
||||||
|
// large enough.
|
||||||
|
static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);
|
||||||
|
|
||||||
|
// Only set an alternative stack if there isn't already one, or if the current
|
||||||
|
// one is too small.
|
||||||
|
if (sys_sigaltstack(NULL, &old_stack) == -1 || !old_stack.ss_sp ||
|
||||||
|
old_stack.ss_size < kSigStackSize) {
|
||||||
|
new_stack.ss_sp = calloc(1, kSigStackSize);
|
||||||
|
new_stack.ss_size = kSigStackSize;
|
||||||
|
|
||||||
|
if (sys_sigaltstack(&new_stack, NULL) == -1) {
|
||||||
|
free(new_stack.ss_sp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stack_installed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs before crashing: normal context.
|
||||||
|
void RestoreAlternateStackLocked() {
|
||||||
|
if (!stack_installed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
stack_t current_stack;
|
||||||
|
if (sys_sigaltstack(NULL, ¤t_stack) == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only restore the old_stack if the current alternative stack is the one
|
||||||
|
// installed by the call to InstallAlternateStackLocked.
|
||||||
|
if (current_stack.ss_sp == new_stack.ss_sp) {
|
||||||
|
if (old_stack.ss_sp) {
|
||||||
|
if (sys_sigaltstack(&old_stack, NULL) == -1)
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
stack_t disable_stack;
|
||||||
|
disable_stack.ss_flags = SS_DISABLE;
|
||||||
|
if (sys_sigaltstack(&disable_stack, NULL) == -1)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(new_stack.ss_sp);
|
||||||
|
stack_installed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstallDefaultHandler(int sig) {
|
||||||
|
#if defined(__ANDROID__)
|
||||||
|
// Android L+ expose signal and sigaction symbols that override the system
|
||||||
|
// ones. There is a bug in these functions where a request to set the handler
|
||||||
|
// to SIG_DFL is ignored. In that case, an infinite loop is entered as the
|
||||||
|
// signal is repeatedly sent to breakpad's signal handler.
|
||||||
|
// To work around this, directly call the system's sigaction.
|
||||||
|
struct kernel_sigaction sa;
|
||||||
|
memset(&sa, 0, sizeof(sa));
|
||||||
|
sys_sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_handler_ = SIG_DFL;
|
||||||
|
sa.sa_flags = SA_RESTART;
|
||||||
|
sys_rt_sigaction(sig, &sa, NULL, sizeof(kernel_sigset_t));
|
||||||
|
#else
|
||||||
|
signal(sig, SIG_DFL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// The global exception handler stack. This is needed because there may exist
|
||||||
|
// multiple ExceptionHandler instances in a process. Each will have itself
|
||||||
|
// registered in this stack.
|
||||||
|
std::vector<ExceptionHandler*>* g_handler_stack_ = NULL;
|
||||||
|
pthread_mutex_t g_handler_stack_mutex_ = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
// sizeof(CrashContext) can be too big w.r.t the size of alternatate stack
|
||||||
|
// for SignalHandler(). Keep the crash context as a .bss field. Exception
|
||||||
|
// handlers are serialized by the |g_handler_stack_mutex_| and at most one at a
|
||||||
|
// time can use |g_crash_context_|.
|
||||||
|
ExceptionHandler::CrashContext g_crash_context_;
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
// Runs before crashing: normal context.
|
||||||
|
ExceptionHandler::ExceptionHandler(const MinidumpDescriptor& descriptor,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
bool install_handler,
|
||||||
|
const int server_fd)
|
||||||
|
: filter_(filter),
|
||||||
|
callback_(callback),
|
||||||
|
callback_context_(callback_context),
|
||||||
|
minidump_descriptor_(descriptor),
|
||||||
|
crash_handler_(NULL) {
|
||||||
|
if (server_fd >= 0)
|
||||||
|
crash_generation_client_.reset(CrashGenerationClient::TryCreate(server_fd));
|
||||||
|
|
||||||
|
if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() &&
|
||||||
|
!minidump_descriptor_.IsMicrodumpOnConsole())
|
||||||
|
minidump_descriptor_.UpdatePath();
|
||||||
|
|
||||||
|
#if defined(__ANDROID__)
|
||||||
|
if (minidump_descriptor_.IsMicrodumpOnConsole())
|
||||||
|
logger::initializeCrashLogWriter();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pthread_mutex_lock(&g_handler_stack_mutex_);
|
||||||
|
|
||||||
|
// Pre-fault the crash context struct. This is to avoid failing due to OOM
|
||||||
|
// if handling an exception when the process ran out of virtual memory.
|
||||||
|
memset(&g_crash_context_, 0, sizeof(g_crash_context_));
|
||||||
|
|
||||||
|
if (!g_handler_stack_)
|
||||||
|
g_handler_stack_ = new std::vector<ExceptionHandler*>;
|
||||||
|
if (install_handler) {
|
||||||
|
InstallAlternateStackLocked();
|
||||||
|
InstallHandlersLocked();
|
||||||
|
}
|
||||||
|
g_handler_stack_->push_back(this);
|
||||||
|
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs before crashing: normal context.
|
||||||
|
ExceptionHandler::~ExceptionHandler() {
|
||||||
|
pthread_mutex_lock(&g_handler_stack_mutex_);
|
||||||
|
std::vector<ExceptionHandler*>::iterator handler =
|
||||||
|
std::find(g_handler_stack_->begin(), g_handler_stack_->end(), this);
|
||||||
|
g_handler_stack_->erase(handler);
|
||||||
|
if (g_handler_stack_->empty()) {
|
||||||
|
delete g_handler_stack_;
|
||||||
|
g_handler_stack_ = NULL;
|
||||||
|
RestoreAlternateStackLocked();
|
||||||
|
RestoreHandlersLocked();
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs before crashing: normal context.
|
||||||
|
// static
|
||||||
|
bool ExceptionHandler::InstallHandlersLocked() {
|
||||||
|
if (handlers_installed)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Fail if unable to store all the old handlers.
|
||||||
|
for (int i = 0; i < kNumHandledSignals; ++i) {
|
||||||
|
if (sigaction(kExceptionSignals[i], NULL, &old_handlers[i]) == -1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sigaction sa;
|
||||||
|
memset(&sa, 0, sizeof(sa));
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
|
||||||
|
// Mask all exception signals when we're handling one of them.
|
||||||
|
for (int i = 0; i < kNumHandledSignals; ++i)
|
||||||
|
sigaddset(&sa.sa_mask, kExceptionSignals[i]);
|
||||||
|
|
||||||
|
sa.sa_sigaction = SignalHandler;
|
||||||
|
sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
||||||
|
|
||||||
|
for (int i = 0; i < kNumHandledSignals; ++i) {
|
||||||
|
if (sigaction(kExceptionSignals[i], &sa, NULL) == -1) {
|
||||||
|
// At this point it is impractical to back out changes, and so failure to
|
||||||
|
// install a signal is intentionally ignored.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handlers_installed = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
// Runs on the crashing thread.
|
||||||
|
// static
|
||||||
|
void ExceptionHandler::RestoreHandlersLocked() {
|
||||||
|
if (!handlers_installed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < kNumHandledSignals; ++i) {
|
||||||
|
if (sigaction(kExceptionSignals[i], &old_handlers[i], NULL) == -1) {
|
||||||
|
InstallDefaultHandler(kExceptionSignals[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handlers_installed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// void ExceptionHandler::set_crash_handler(HandlerCallback callback) {
|
||||||
|
// crash_handler_ = callback;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
// Runs on the crashing thread.
|
||||||
|
// static
|
||||||
|
void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
|
||||||
|
// All the exception signals are blocked at this point.
|
||||||
|
pthread_mutex_lock(&g_handler_stack_mutex_);
|
||||||
|
|
||||||
|
// Sometimes, Breakpad runs inside a process where some other buggy code
|
||||||
|
// saves and restores signal handlers temporarily with 'signal'
|
||||||
|
// instead of 'sigaction'. This loses the SA_SIGINFO flag associated
|
||||||
|
// with this function. As a consequence, the values of 'info' and 'uc'
|
||||||
|
// become totally bogus, generally inducing a crash.
|
||||||
|
//
|
||||||
|
// The following code tries to detect this case. When it does, it
|
||||||
|
// resets the signal handlers with sigaction + SA_SIGINFO and returns.
|
||||||
|
// This forces the signal to be thrown again, but this time the kernel
|
||||||
|
// will call the function with the right arguments.
|
||||||
|
struct sigaction cur_handler;
|
||||||
|
if (sigaction(sig, NULL, &cur_handler) == 0 &&
|
||||||
|
(cur_handler.sa_flags & SA_SIGINFO) == 0) {
|
||||||
|
// Reset signal handler with the right flags.
|
||||||
|
sigemptyset(&cur_handler.sa_mask);
|
||||||
|
sigaddset(&cur_handler.sa_mask, sig);
|
||||||
|
|
||||||
|
cur_handler.sa_sigaction = SignalHandler;
|
||||||
|
cur_handler.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
||||||
|
|
||||||
|
if (sigaction(sig, &cur_handler, NULL) == -1) {
|
||||||
|
// When resetting the handler fails, try to reset the
|
||||||
|
// default one to avoid an infinite loop here.
|
||||||
|
InstallDefaultHandler(sig);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handled = false;
|
||||||
|
for (int i = g_handler_stack_->size() - 1; !handled && i >= 0; --i) {
|
||||||
|
handled = (*g_handler_stack_)[i]->HandleSignal(sig, info, uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upon returning from this signal handler, sig will become unmasked and then
|
||||||
|
// it will be retriggered. If one of the ExceptionHandlers handled it
|
||||||
|
// successfully, restore the default handler. Otherwise, restore the
|
||||||
|
// previously installed handler. Then, when the signal is retriggered, it will
|
||||||
|
// be delivered to the appropriate handler.
|
||||||
|
if (handled) {
|
||||||
|
InstallDefaultHandler(sig);
|
||||||
|
} else {
|
||||||
|
RestoreHandlersLocked();
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&g_handler_stack_mutex_);
|
||||||
|
|
||||||
|
// info->si_code <= 0 iff SI_FROMUSER (SI_FROMKERNEL otherwise).
|
||||||
|
if (info->si_code <= 0 || sig == SIGABRT) {
|
||||||
|
// This signal was triggered by somebody sending us the signal with kill().
|
||||||
|
// In order to retrigger it, we have to queue a new signal by calling
|
||||||
|
// kill() ourselves. The special case (si_pid == 0 && sig == SIGABRT) is
|
||||||
|
// due to the kernel sending a SIGABRT from a user request via SysRQ.
|
||||||
|
if (tgkill(getpid(), syscall(__NR_gettid), sig) < 0) {
|
||||||
|
// If we failed to kill ourselves (e.g. because a sandbox disallows us
|
||||||
|
// to do so), we instead resort to terminating our process. This will
|
||||||
|
// result in an incorrect exit code.
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This was a synchronous signal triggered by a hard fault (e.g. SIGSEGV).
|
||||||
|
// No need to reissue the signal. It will automatically trigger again,
|
||||||
|
// when we return from the signal handler.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ThreadArgument {
|
||||||
|
pid_t pid; // the crashing process
|
||||||
|
const MinidumpDescriptor* minidump_descriptor;
|
||||||
|
ExceptionHandler* handler;
|
||||||
|
const void* context; // a CrashContext structure
|
||||||
|
size_t context_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is the entry function for the cloned process. We are in a compromised
|
||||||
|
// context here: see the top of the file.
|
||||||
|
// static
|
||||||
|
int ExceptionHandler::ThreadEntry(void *arg) {
|
||||||
|
const ThreadArgument *thread_arg = reinterpret_cast<ThreadArgument*>(arg);
|
||||||
|
|
||||||
|
// Block here until the crashing process unblocks us when
|
||||||
|
// we're allowed to use ptrace
|
||||||
|
thread_arg->handler->WaitForContinueSignal();
|
||||||
|
|
||||||
|
return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context,
|
||||||
|
thread_arg->context_size) == false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
// Runs on the crashing thread.
|
||||||
|
bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {
|
||||||
|
if (filter_ && !filter_(callback_context_))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Allow ourselves to be dumped if the signal is trusted.
|
||||||
|
bool signal_trusted = info->si_code > 0;
|
||||||
|
bool signal_pid_trusted = info->si_code == SI_USER ||
|
||||||
|
info->si_code == SI_TKILL;
|
||||||
|
if (signal_trusted || (signal_pid_trusted && info->si_pid == getpid())) {
|
||||||
|
sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill in all the holes in the struct to make Valgrind happy.
|
||||||
|
memset(&g_crash_context_, 0, sizeof(g_crash_context_));
|
||||||
|
memcpy(&g_crash_context_.siginfo, info, sizeof(siginfo_t));
|
||||||
|
memcpy(&g_crash_context_.context, uc, sizeof(struct ucontext));
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
struct ucontext* uc_ptr = (struct ucontext*)uc;
|
||||||
|
struct fpsimd_context* fp_ptr =
|
||||||
|
(struct fpsimd_context*)&uc_ptr->uc_mcontext.__reserved;
|
||||||
|
if (fp_ptr->head.magic == FPSIMD_MAGIC) {
|
||||||
|
memcpy(&g_crash_context_.float_state, fp_ptr,
|
||||||
|
sizeof(g_crash_context_.float_state));
|
||||||
|
}
|
||||||
|
#elif !defined(__ARM_EABI__) && !defined(__mips__)
|
||||||
|
// FP state is not part of user ABI on ARM Linux.
|
||||||
|
// In case of MIPS Linux FP state is already part of struct ucontext
|
||||||
|
// and 'float_state' is not a member of CrashContext.
|
||||||
|
struct ucontext* uc_ptr = (struct ucontext*)uc;
|
||||||
|
if (uc_ptr->uc_mcontext.fpregs) {
|
||||||
|
memcpy(&g_crash_context_.float_state, uc_ptr->uc_mcontext.fpregs,
|
||||||
|
sizeof(g_crash_context_.float_state));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
g_crash_context_.tid = syscall(__NR_gettid);
|
||||||
|
if (crash_handler_ != NULL) {
|
||||||
|
if (crash_handler_(&g_crash_context_, sizeof(g_crash_context_),
|
||||||
|
callback_context_)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GenerateDump(&g_crash_context_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a public interface to HandleSignal that allows the client to
|
||||||
|
// generate a crash dump. This function may run in a compromised context.
|
||||||
|
bool ExceptionHandler::SimulateSignalDelivery(int sig) {
|
||||||
|
siginfo_t siginfo = {};
|
||||||
|
// Mimic a trusted signal to allow tracing the process (see
|
||||||
|
// ExceptionHandler::HandleSignal().
|
||||||
|
siginfo.si_code = SI_USER;
|
||||||
|
siginfo.si_pid = getpid();
|
||||||
|
struct ucontext context;
|
||||||
|
getcontext(&context);
|
||||||
|
return HandleSignal(sig, &siginfo, &context);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function may run in a compromised context: see the top of the file.
|
||||||
|
bool ExceptionHandler::GenerateDump(CrashContext *context) {
|
||||||
|
if (IsOutOfProcess())
|
||||||
|
return crash_generation_client_->RequestDump(context, sizeof(*context));
|
||||||
|
|
||||||
|
// Allocating too much stack isn't a problem, and better to err on the side
|
||||||
|
// of caution than smash it into random locations.
|
||||||
|
static const unsigned kChildStackSize = 16000;
|
||||||
|
PageAllocator allocator;
|
||||||
|
uint8_t* stack = reinterpret_cast<uint8_t*>(allocator.Alloc(kChildStackSize));
|
||||||
|
if (!stack)
|
||||||
|
return false;
|
||||||
|
// clone() needs the top-most address. (scrub just to be safe)
|
||||||
|
stack += kChildStackSize;
|
||||||
|
my_memset(stack - 16, 0, 16);
|
||||||
|
|
||||||
|
ThreadArgument thread_arg;
|
||||||
|
thread_arg.handler = this;
|
||||||
|
thread_arg.minidump_descriptor = &minidump_descriptor_;
|
||||||
|
thread_arg.pid = getpid();
|
||||||
|
thread_arg.context = context;
|
||||||
|
thread_arg.context_size = sizeof(*context);
|
||||||
|
|
||||||
|
// We need to explicitly enable ptrace of parent processes on some
|
||||||
|
// kernels, but we need to know the PID of the cloned process before we
|
||||||
|
// can do this. Create a pipe here which we can use to block the
|
||||||
|
// cloned process after creating it, until we have explicitly enabled ptrace
|
||||||
|
if (sys_pipe(fdes) == -1) {
|
||||||
|
// Creating the pipe failed. We'll log an error but carry on anyway,
|
||||||
|
// as we'll probably still get a useful crash report. All that will happen
|
||||||
|
// is the write() and read() calls will fail with EBADF
|
||||||
|
static const char no_pipe_msg[] = "ExceptionHandler::GenerateDump "
|
||||||
|
"sys_pipe failed:";
|
||||||
|
logger::write(no_pipe_msg, sizeof(no_pipe_msg) - 1);
|
||||||
|
logger::write(strerror(errno), strlen(strerror(errno)));
|
||||||
|
logger::write("\n", 1);
|
||||||
|
|
||||||
|
// Ensure fdes[0] and fdes[1] are invalid file descriptors.
|
||||||
|
fdes[0] = fdes[1] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pid_t child = sys_clone(
|
||||||
|
ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
|
||||||
|
&thread_arg, NULL, NULL, NULL);
|
||||||
|
if (child == -1) {
|
||||||
|
sys_close(fdes[0]);
|
||||||
|
sys_close(fdes[1]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow the child to ptrace us
|
||||||
|
sys_prctl(PR_SET_PTRACER, child, 0, 0, 0);
|
||||||
|
SendContinueSignalToChild();
|
||||||
|
int status;
|
||||||
|
const int r = HANDLE_EINTR(sys_waitpid(child, &status, __WALL));
|
||||||
|
|
||||||
|
sys_close(fdes[0]);
|
||||||
|
sys_close(fdes[1]);
|
||||||
|
|
||||||
|
if (r == -1) {
|
||||||
|
static const char msg[] = "ExceptionHandler::GenerateDump waitpid failed:";
|
||||||
|
logger::write(msg, sizeof(msg) - 1);
|
||||||
|
logger::write(strerror(errno), strlen(strerror(errno)));
|
||||||
|
logger::write("\n", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0;
|
||||||
|
if (callback_)
|
||||||
|
success = callback_(minidump_descriptor_, callback_context_, success);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
void ExceptionHandler::SendContinueSignalToChild() {
|
||||||
|
static const char okToContinueMessage = 'a';
|
||||||
|
int r;
|
||||||
|
r = HANDLE_EINTR(sys_write(fdes[1], &okToContinueMessage, sizeof(char)));
|
||||||
|
if (r == -1) {
|
||||||
|
static const char msg[] = "ExceptionHandler::SendContinueSignalToChild "
|
||||||
|
"sys_write failed:";
|
||||||
|
logger::write(msg, sizeof(msg) - 1);
|
||||||
|
logger::write(strerror(errno), strlen(strerror(errno)));
|
||||||
|
logger::write("\n", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
// Runs on the cloned process.
|
||||||
|
void ExceptionHandler::WaitForContinueSignal() {
|
||||||
|
int r;
|
||||||
|
char receivedMessage;
|
||||||
|
r = HANDLE_EINTR(sys_read(fdes[0], &receivedMessage, sizeof(char)));
|
||||||
|
if (r == -1) {
|
||||||
|
static const char msg[] = "ExceptionHandler::WaitForContinueSignal "
|
||||||
|
"sys_read failed:";
|
||||||
|
logger::write(msg, sizeof(msg) - 1);
|
||||||
|
logger::write(strerror(errno), strlen(strerror(errno)));
|
||||||
|
logger::write("\n", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function runs in a compromised context: see the top of the file.
|
||||||
|
// Runs on the cloned process.
|
||||||
|
bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context,
|
||||||
|
size_t context_size) {
|
||||||
|
if (minidump_descriptor_.IsMicrodumpOnConsole()) {
|
||||||
|
return google_breakpad::WriteMicrodump(
|
||||||
|
crashing_process,
|
||||||
|
context,
|
||||||
|
context_size,
|
||||||
|
mapping_list_,
|
||||||
|
*minidump_descriptor_.microdump_extra_info());
|
||||||
|
}
|
||||||
|
if (minidump_descriptor_.IsFD()) {
|
||||||
|
return google_breakpad::WriteMinidump(minidump_descriptor_.fd(),
|
||||||
|
minidump_descriptor_.size_limit(),
|
||||||
|
crashing_process,
|
||||||
|
context,
|
||||||
|
context_size,
|
||||||
|
mapping_list_,
|
||||||
|
app_memory_list_);
|
||||||
|
}
|
||||||
|
return google_breakpad::WriteMinidump(minidump_descriptor_.path(),
|
||||||
|
minidump_descriptor_.size_limit(),
|
||||||
|
crashing_process,
|
||||||
|
context,
|
||||||
|
context_size,
|
||||||
|
mapping_list_,
|
||||||
|
app_memory_list_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool ExceptionHandler::WriteMinidump(const string& dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context) {
|
||||||
|
MinidumpDescriptor descriptor(dump_path);
|
||||||
|
ExceptionHandler eh(descriptor, NULL, callback, callback_context, false, -1);
|
||||||
|
return eh.WriteMinidump();
|
||||||
|
}
|
||||||
|
|
||||||
|
// In order to making using EBP to calculate the desired value for ESP
|
||||||
|
// a valid operation, ensure that this function is compiled with a
|
||||||
|
// frame pointer using the following attribute. This attribute
|
||||||
|
// is supported on GCC but not on clang.
|
||||||
|
#if defined(__i386__) && defined(__GNUC__) && !defined(__clang__)
|
||||||
|
__attribute__((optimize("no-omit-frame-pointer")))
|
||||||
|
#endif
|
||||||
|
bool ExceptionHandler::WriteMinidump() {
|
||||||
|
if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() &&
|
||||||
|
!minidump_descriptor_.IsMicrodumpOnConsole()) {
|
||||||
|
// Update the path of the minidump so that this can be called multiple times
|
||||||
|
// and new files are created for each minidump. This is done before the
|
||||||
|
// generation happens, as clients may want to access the MinidumpDescriptor
|
||||||
|
// after this call to find the exact path to the minidump file.
|
||||||
|
minidump_descriptor_.UpdatePath();
|
||||||
|
} else if (minidump_descriptor_.IsFD()) {
|
||||||
|
// Reposition the FD to its beginning and resize it to get rid of the
|
||||||
|
// previous minidump info.
|
||||||
|
lseek(minidump_descriptor_.fd(), 0, SEEK_SET);
|
||||||
|
ignore_result(ftruncate(minidump_descriptor_.fd(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow this process to be dumped.
|
||||||
|
sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
|
||||||
|
|
||||||
|
CrashContext context;
|
||||||
|
int getcontext_result = getcontext(&context.context);
|
||||||
|
if (getcontext_result)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
// In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
|
||||||
|
// from REG_UESP instead of from REG_ESP. REG_UESP is the user stack pointer
|
||||||
|
// and it only makes sense when running in kernel mode with a different stack
|
||||||
|
// pointer. When WriteMiniDump is called during normal processing REG_UESP is
|
||||||
|
// zero which leads to bad minidump files.
|
||||||
|
if (!context.context.uc_mcontext.gregs[REG_UESP]) {
|
||||||
|
// If REG_UESP is set to REG_ESP then that includes the stack space for the
|
||||||
|
// CrashContext object in this function, which is about 128 KB. Since the
|
||||||
|
// Linux dumper only records 32 KB of stack this would mean that nothing
|
||||||
|
// useful would be recorded. A better option is to set REG_UESP to REG_EBP,
|
||||||
|
// perhaps with a small negative offset in case there is any code that
|
||||||
|
// objects to them being equal.
|
||||||
|
context.context.uc_mcontext.gregs[REG_UESP] =
|
||||||
|
context.context.uc_mcontext.gregs[REG_EBP] - 16;
|
||||||
|
// The stack saving is based off of REG_ESP so it must be set to match the
|
||||||
|
// new REG_UESP.
|
||||||
|
context.context.uc_mcontext.gregs[REG_ESP] =
|
||||||
|
context.context.uc_mcontext.gregs[REG_UESP];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
|
||||||
|
// FPU state is not part of ARM EABI ucontext_t.
|
||||||
|
memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
|
||||||
|
sizeof(context.float_state));
|
||||||
|
#endif
|
||||||
|
context.tid = sys_gettid();
|
||||||
|
|
||||||
|
// Add an exception stream to the minidump for better reporting.
|
||||||
|
memset(&context.siginfo, 0, sizeof(context.siginfo));
|
||||||
|
context.siginfo.si_signo = MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED;
|
||||||
|
#if defined(__i386__)
|
||||||
|
context.siginfo.si_addr =
|
||||||
|
reinterpret_cast<void*>(context.context.uc_mcontext.gregs[REG_EIP]);
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
context.siginfo.si_addr =
|
||||||
|
reinterpret_cast<void*>(context.context.uc_mcontext.gregs[REG_RIP]);
|
||||||
|
#elif defined(__arm__)
|
||||||
|
context.siginfo.si_addr =
|
||||||
|
reinterpret_cast<void*>(context.context.uc_mcontext.arm_pc);
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
context.siginfo.si_addr =
|
||||||
|
reinterpret_cast<void*>(context.context.uc_mcontext.pc);
|
||||||
|
#elif defined(__mips__)
|
||||||
|
context.siginfo.si_addr =
|
||||||
|
reinterpret_cast<void*>(context.context.uc_mcontext.pc);
|
||||||
|
#else
|
||||||
|
#error "This code has not been ported to your platform yet."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return GenerateDump(&context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExceptionHandler::AddMappingInfo(const string& name,
|
||||||
|
const uint8_t identifier[sizeof(MDGUID)],
|
||||||
|
uintptr_t start_address,
|
||||||
|
size_t mapping_size,
|
||||||
|
size_t file_offset) {
|
||||||
|
MappingInfo info;
|
||||||
|
info.start_addr = start_address;
|
||||||
|
info.size = mapping_size;
|
||||||
|
info.offset = file_offset;
|
||||||
|
strncpy(info.name, name.c_str(), sizeof(info.name) - 1);
|
||||||
|
info.name[sizeof(info.name) - 1] = '\0';
|
||||||
|
|
||||||
|
MappingEntry mapping;
|
||||||
|
mapping.first = info;
|
||||||
|
memcpy(mapping.second, identifier, sizeof(MDGUID));
|
||||||
|
mapping_list_.push_back(mapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExceptionHandler::RegisterAppMemory(void* ptr, size_t length) {
|
||||||
|
AppMemoryList::iterator iter =
|
||||||
|
std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr);
|
||||||
|
if (iter != app_memory_list_.end()) {
|
||||||
|
// Don't allow registering the same pointer twice.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppMemory app_memory;
|
||||||
|
app_memory.ptr = ptr;
|
||||||
|
app_memory.length = length;
|
||||||
|
app_memory_list_.push_back(app_memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExceptionHandler::UnregisterAppMemory(void* ptr) {
|
||||||
|
AppMemoryList::iterator iter =
|
||||||
|
std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr);
|
||||||
|
if (iter != app_memory_list_.end()) {
|
||||||
|
app_memory_list_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool ExceptionHandler::WriteMinidumpForChild(pid_t child,
|
||||||
|
pid_t child_blamed_thread,
|
||||||
|
const string& dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context) {
|
||||||
|
// This function is not run in a compromised context.
|
||||||
|
MinidumpDescriptor descriptor(dump_path);
|
||||||
|
descriptor.UpdatePath();
|
||||||
|
if (!google_breakpad::WriteMinidump(descriptor.path(),
|
||||||
|
child,
|
||||||
|
child_blamed_thread))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return callback ? callback(descriptor, callback_context, true) : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
|
@ -0,0 +1,278 @@
|
||||||
|
// Copyright (c) 2010 Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
||||||
|
#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/ucontext.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "client/linux/crash_generation/crash_generation_client.h"
|
||||||
|
#include "client/linux/handler/minidump_descriptor.h"
|
||||||
|
#include "client/linux/minidump_writer/minidump_writer.h"
|
||||||
|
#include "common/scoped_ptr.h"
|
||||||
|
#include "common/using_std_string.h"
|
||||||
|
#include "google_breakpad/common/minidump_format.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
// ExceptionHandler
|
||||||
|
//
|
||||||
|
// ExceptionHandler can write a minidump file when an exception occurs,
|
||||||
|
// or when WriteMinidump() is called explicitly by your program.
|
||||||
|
//
|
||||||
|
// To have the exception handler write minidumps when an uncaught exception
|
||||||
|
// (crash) occurs, you should create an instance early in the execution
|
||||||
|
// of your program, and keep it around for the entire time you want to
|
||||||
|
// have crash handling active (typically, until shutdown).
|
||||||
|
// (NOTE): There should be only be one this kind of exception handler
|
||||||
|
// object per process.
|
||||||
|
//
|
||||||
|
// If you want to write minidumps without installing the exception handler,
|
||||||
|
// you can create an ExceptionHandler with install_handler set to false,
|
||||||
|
// then call WriteMinidump. You can also use this technique if you want to
|
||||||
|
// use different minidump callbacks for different call sites.
|
||||||
|
//
|
||||||
|
// In either case, a callback function is called when a minidump is written,
|
||||||
|
// which receives the full path or file descriptor of the minidump. The
|
||||||
|
// caller can collect and write additional application state to that minidump,
|
||||||
|
// and launch an external crash-reporting application.
|
||||||
|
//
|
||||||
|
// Caller should try to make the callbacks as crash-friendly as possible,
|
||||||
|
// it should avoid use heap memory allocation as much as possible.
|
||||||
|
|
||||||
|
class ExceptionHandler {
|
||||||
|
public:
|
||||||
|
// A callback function to run before Breakpad performs any substantial
|
||||||
|
// processing of an exception. A FilterCallback is called before writing
|
||||||
|
// a minidump. |context| is the parameter supplied by the user as
|
||||||
|
// callback_context when the handler was created.
|
||||||
|
//
|
||||||
|
// If a FilterCallback returns true, Breakpad will continue processing,
|
||||||
|
// attempting to write a minidump. If a FilterCallback returns false,
|
||||||
|
// Breakpad will immediately report the exception as unhandled without
|
||||||
|
// writing a minidump, allowing another handler the opportunity to handle it.
|
||||||
|
typedef bool (*FilterCallback)(void *context);
|
||||||
|
|
||||||
|
// A callback function to run after the minidump has been written.
|
||||||
|
// |descriptor| contains the file descriptor or file path containing the
|
||||||
|
// minidump. |context| is the parameter supplied by the user as
|
||||||
|
// callback_context when the handler was created. |succeeded| indicates
|
||||||
|
// whether a minidump file was successfully written.
|
||||||
|
//
|
||||||
|
// If an exception occurred and the callback returns true, Breakpad will
|
||||||
|
// treat the exception as fully-handled, suppressing any other handlers from
|
||||||
|
// being notified of the exception. If the callback returns false, Breakpad
|
||||||
|
// will treat the exception as unhandled, and allow another handler to handle
|
||||||
|
// it. If there are no other handlers, Breakpad will report the exception to
|
||||||
|
// the system as unhandled, allowing a debugger or native crash dialog the
|
||||||
|
// opportunity to handle the exception. Most callback implementations
|
||||||
|
// should normally return the value of |succeeded|, or when they wish to
|
||||||
|
// not report an exception of handled, false. Callbacks will rarely want to
|
||||||
|
// return true directly (unless |succeeded| is true).
|
||||||
|
typedef bool (*MinidumpCallback)(const MinidumpDescriptor& descriptor,
|
||||||
|
void* context,
|
||||||
|
bool succeeded);
|
||||||
|
|
||||||
|
// In certain cases, a user may wish to handle the generation of the minidump
|
||||||
|
// themselves. In this case, they can install a handler callback which is
|
||||||
|
// called when a crash has occurred. If this function returns true, no other
|
||||||
|
// processing of occurs and the process will shortly be crashed. If this
|
||||||
|
// returns false, the normal processing continues.
|
||||||
|
typedef bool (*HandlerCallback)(const void* crash_context,
|
||||||
|
size_t crash_context_size,
|
||||||
|
void* context);
|
||||||
|
|
||||||
|
// Creates a new ExceptionHandler instance to handle writing minidumps.
|
||||||
|
// Before writing a minidump, the optional |filter| callback will be called.
|
||||||
|
// Its return value determines whether or not Breakpad should write a
|
||||||
|
// minidump. The minidump content will be written to the file path or file
|
||||||
|
// descriptor from |descriptor|, and the optional |callback| is called after
|
||||||
|
// writing the dump file, as described above.
|
||||||
|
// If install_handler is true, then a minidump will be written whenever
|
||||||
|
// an unhandled exception occurs. If it is false, minidumps will only
|
||||||
|
// be written when WriteMinidump is called.
|
||||||
|
// If |server_fd| is valid, the minidump is generated out-of-process. If it
|
||||||
|
// is -1, in-process generation will always be used.
|
||||||
|
ExceptionHandler(const MinidumpDescriptor& descriptor,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
bool install_handler,
|
||||||
|
const int server_fd);
|
||||||
|
~ExceptionHandler();
|
||||||
|
|
||||||
|
const MinidumpDescriptor& minidump_descriptor() const {
|
||||||
|
return minidump_descriptor_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_minidump_descriptor(const MinidumpDescriptor& descriptor) {
|
||||||
|
minidump_descriptor_ = descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_crash_handler(HandlerCallback callback) {
|
||||||
|
crash_handler_ = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_crash_generation_client(CrashGenerationClient* client) {
|
||||||
|
crash_generation_client_.reset(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes a minidump immediately. This can be used to capture the execution
|
||||||
|
// state independently of a crash.
|
||||||
|
// Returns true on success.
|
||||||
|
// If the ExceptionHandler has been created with a path, a new file is
|
||||||
|
// generated for each minidump. The file path can be retrieved in the
|
||||||
|
// MinidumpDescriptor passed to the MinidumpCallback or by accessing the
|
||||||
|
// MinidumpDescriptor directly from the ExceptionHandler (with
|
||||||
|
// minidump_descriptor()).
|
||||||
|
// If the ExceptionHandler has been created with a file descriptor, the file
|
||||||
|
// descriptor is repositioned to its beginning and the previous generated
|
||||||
|
// minidump is overwritten.
|
||||||
|
// Note that this method is not supposed to be called from a compromised
|
||||||
|
// context as it uses the heap.
|
||||||
|
bool WriteMinidump();
|
||||||
|
|
||||||
|
// Convenience form of WriteMinidump which does not require an
|
||||||
|
// ExceptionHandler instance.
|
||||||
|
static bool WriteMinidump(const string& dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context);
|
||||||
|
|
||||||
|
// Write a minidump of |child| immediately. This can be used to
|
||||||
|
// capture the execution state of |child| independently of a crash.
|
||||||
|
// Pass a meaningful |child_blamed_thread| to make that thread in
|
||||||
|
// the child process the one from which a crash signature is
|
||||||
|
// extracted.
|
||||||
|
//
|
||||||
|
// WARNING: the return of this function *must* happen before
|
||||||
|
// the code that will eventually reap |child| executes.
|
||||||
|
// Otherwise there's a pernicious race condition in which |child|
|
||||||
|
// exits, is reaped, another process created with its pid, then that
|
||||||
|
// new process dumped.
|
||||||
|
static bool WriteMinidumpForChild(pid_t child,
|
||||||
|
pid_t child_blamed_thread,
|
||||||
|
const string& dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context);
|
||||||
|
|
||||||
|
// This structure is passed to minidump_writer.h:WriteMinidump via an opaque
|
||||||
|
// blob. It shouldn't be needed in any user code.
|
||||||
|
struct CrashContext {
|
||||||
|
siginfo_t siginfo;
|
||||||
|
pid_t tid; // the crashing thread.
|
||||||
|
struct ucontext context;
|
||||||
|
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
||||||
|
// #ifdef this out because FP state is not part of user ABI for Linux ARM.
|
||||||
|
// In case of MIPS Linux FP state is already part of struct
|
||||||
|
// ucontext so 'float_state' is not required.
|
||||||
|
fpstate_t float_state;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns whether out-of-process dump generation is used or not.
|
||||||
|
bool IsOutOfProcess() const {
|
||||||
|
return crash_generation_client_.get() != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add information about a memory mapping. This can be used if
|
||||||
|
// a custom library loader is used that maps things in a way
|
||||||
|
// that the linux dumper can't handle by reading the maps file.
|
||||||
|
void AddMappingInfo(const string& name,
|
||||||
|
const uint8_t identifier[sizeof(MDGUID)],
|
||||||
|
uintptr_t start_address,
|
||||||
|
size_t mapping_size,
|
||||||
|
size_t file_offset);
|
||||||
|
|
||||||
|
// Register a block of memory of length bytes starting at address ptr
|
||||||
|
// to be copied to the minidump when a crash happens.
|
||||||
|
void RegisterAppMemory(void* ptr, size_t length);
|
||||||
|
|
||||||
|
// Unregister a block of memory that was registered with RegisterAppMemory.
|
||||||
|
void UnregisterAppMemory(void* ptr);
|
||||||
|
|
||||||
|
// Force signal handling for the specified signal.
|
||||||
|
bool SimulateSignalDelivery(int sig);
|
||||||
|
|
||||||
|
// Report a crash signal from an SA_SIGINFO signal handler.
|
||||||
|
bool HandleSignal(int sig, siginfo_t* info, void* uc);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Save the old signal handlers and install new ones.
|
||||||
|
static bool InstallHandlersLocked();
|
||||||
|
// Restore the old signal handlers.
|
||||||
|
static void RestoreHandlersLocked();
|
||||||
|
|
||||||
|
void PreresolveSymbols();
|
||||||
|
bool GenerateDump(CrashContext *context);
|
||||||
|
void SendContinueSignalToChild();
|
||||||
|
void WaitForContinueSignal();
|
||||||
|
|
||||||
|
static void SignalHandler(int sig, siginfo_t* info, void* uc);
|
||||||
|
static int ThreadEntry(void* arg);
|
||||||
|
bool DoDump(pid_t crashing_process, const void* context,
|
||||||
|
size_t context_size);
|
||||||
|
|
||||||
|
const FilterCallback filter_;
|
||||||
|
const MinidumpCallback callback_;
|
||||||
|
void* const callback_context_;
|
||||||
|
|
||||||
|
scoped_ptr<CrashGenerationClient> crash_generation_client_;
|
||||||
|
|
||||||
|
MinidumpDescriptor minidump_descriptor_;
|
||||||
|
|
||||||
|
// Must be volatile. The compiler is unaware of the code which runs in
|
||||||
|
// the signal handler which reads this variable. Without volatile the
|
||||||
|
// compiler is free to optimise away writes to this variable which it
|
||||||
|
// believes are never read.
|
||||||
|
volatile HandlerCallback crash_handler_;
|
||||||
|
|
||||||
|
// We need to explicitly enable ptrace of parent processes on some
|
||||||
|
// kernels, but we need to know the PID of the cloned process before we
|
||||||
|
// can do this. We create a pipe which we can use to block the
|
||||||
|
// cloned process after creating it, until we have explicitly enabled
|
||||||
|
// ptrace. This is used to store the file descriptors for the pipe
|
||||||
|
int fdes[2];
|
||||||
|
|
||||||
|
// Callers can add extra info about mappings for cases where the
|
||||||
|
// dumper code cannot extract enough information from /proc/<pid>/maps.
|
||||||
|
MappingList mapping_list_;
|
||||||
|
|
||||||
|
// Callers can request additional memory regions to be included in
|
||||||
|
// the dump.
|
||||||
|
AppMemoryList app_memory_list_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
@ -0,0 +1,855 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include <mach/exc.h>
|
||||||
|
#include <mach/mig.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <TargetConditionals.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include "client/mac/handler/exception_handler.h"
|
||||||
|
#include "client/mac/handler/minidump_generator.h"
|
||||||
|
#include "common/mac/macho_utilities.h"
|
||||||
|
#include "common/mac/scoped_task_suspend-inl.h"
|
||||||
|
#include "google_breakpad/common/minidump_exception_mac.h"
|
||||||
|
|
||||||
|
#ifndef __EXCEPTIONS
|
||||||
|
// This file uses C++ try/catch (but shouldn't). Duplicate the macros from
|
||||||
|
// <c++/4.2.1/exception_defines.h> allowing this file to work properly with
|
||||||
|
// exceptions disabled even when other C++ libraries are used. #undef the try
|
||||||
|
// and catch macros first in case libstdc++ is in use and has already provided
|
||||||
|
// its own definitions.
|
||||||
|
#undef try
|
||||||
|
#define try if (true)
|
||||||
|
#undef catch
|
||||||
|
#define catch(X) if (false)
|
||||||
|
#endif // __EXCEPTIONS
|
||||||
|
|
||||||
|
#ifndef USE_PROTECTED_ALLOCATIONS
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
#define USE_PROTECTED_ALLOCATIONS 1
|
||||||
|
#else
|
||||||
|
#define USE_PROTECTED_ALLOCATIONS 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If USE_PROTECTED_ALLOCATIONS is activated then the
|
||||||
|
// gBreakpadAllocator needs to be setup in other code
|
||||||
|
// ahead of time. Please see ProtectedMemoryAllocator.h
|
||||||
|
// for more details.
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
#include "protected_memory_allocator.h"
|
||||||
|
extern ProtectedMemoryAllocator *gBreakpadAllocator;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
static union {
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
#if defined PAGE_MAX_SIZE
|
||||||
|
char protected_buffer[PAGE_MAX_SIZE] __attribute__((aligned(PAGE_MAX_SIZE)));
|
||||||
|
#else
|
||||||
|
char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
|
||||||
|
#endif // defined PAGE_MAX_SIZE
|
||||||
|
#endif // USE_PROTECTED_ALLOCATIONS
|
||||||
|
google_breakpad::ExceptionHandler *handler;
|
||||||
|
} gProtectedData;
|
||||||
|
|
||||||
|
using std::map;
|
||||||
|
|
||||||
|
// These structures and techniques are illustrated in
|
||||||
|
// Mac OS X Internals, Amit Singh, ch 9.7
|
||||||
|
struct ExceptionMessage {
|
||||||
|
mach_msg_header_t header;
|
||||||
|
mach_msg_body_t body;
|
||||||
|
mach_msg_port_descriptor_t thread;
|
||||||
|
mach_msg_port_descriptor_t task;
|
||||||
|
NDR_record_t ndr;
|
||||||
|
exception_type_t exception;
|
||||||
|
mach_msg_type_number_t code_count;
|
||||||
|
integer_t code[EXCEPTION_CODE_MAX];
|
||||||
|
char padding[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ExceptionParameters {
|
||||||
|
ExceptionParameters() : count(0) {}
|
||||||
|
mach_msg_type_number_t count;
|
||||||
|
exception_mask_t masks[EXC_TYPES_COUNT];
|
||||||
|
mach_port_t ports[EXC_TYPES_COUNT];
|
||||||
|
exception_behavior_t behaviors[EXC_TYPES_COUNT];
|
||||||
|
thread_state_flavor_t flavors[EXC_TYPES_COUNT];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ExceptionReplyMessage {
|
||||||
|
mach_msg_header_t header;
|
||||||
|
NDR_record_t ndr;
|
||||||
|
kern_return_t return_code;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Only catch these three exceptions. The other ones are nebulously defined
|
||||||
|
// and may result in treating a non-fatal exception as fatal.
|
||||||
|
exception_mask_t s_exception_mask = EXC_MASK_BAD_ACCESS |
|
||||||
|
EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT;
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
extern "C" {
|
||||||
|
// Forward declarations for functions that need "C" style compilation
|
||||||
|
boolean_t exc_server(mach_msg_header_t* request,
|
||||||
|
mach_msg_header_t* reply);
|
||||||
|
|
||||||
|
// This symbol must be visible to dlsym() - see
|
||||||
|
// http://code.google.com/p/google-breakpad/issues/detail?id=345 for details.
|
||||||
|
kern_return_t catch_exception_raise(mach_port_t target_port,
|
||||||
|
mach_port_t failed_thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count)
|
||||||
|
__attribute__((visibility("default")));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
kern_return_t ForwardException(mach_port_t task,
|
||||||
|
mach_port_t failed_thread,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count);
|
||||||
|
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
// Implementation is based on the implementation generated by mig.
|
||||||
|
boolean_t breakpad_exc_server(mach_msg_header_t* InHeadP,
|
||||||
|
mach_msg_header_t* OutHeadP) {
|
||||||
|
OutHeadP->msgh_bits =
|
||||||
|
MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InHeadP->msgh_bits), 0);
|
||||||
|
OutHeadP->msgh_remote_port = InHeadP->msgh_remote_port;
|
||||||
|
/* Minimal size: routine() will update it if different */
|
||||||
|
OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
|
||||||
|
OutHeadP->msgh_local_port = MACH_PORT_NULL;
|
||||||
|
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
|
||||||
|
|
||||||
|
if (InHeadP->msgh_id != 2401) {
|
||||||
|
((mig_reply_error_t*)OutHeadP)->NDR = NDR_record;
|
||||||
|
((mig_reply_error_t*)OutHeadP)->RetCode = MIG_BAD_ID;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
/* start of the kernel processed data */
|
||||||
|
mach_msg_body_t msgh_body;
|
||||||
|
mach_msg_port_descriptor_t thread;
|
||||||
|
mach_msg_port_descriptor_t task;
|
||||||
|
/* end of the kernel processed data */
|
||||||
|
NDR_record_t NDR;
|
||||||
|
exception_type_t exception;
|
||||||
|
mach_msg_type_number_t codeCnt;
|
||||||
|
integer_t code[2];
|
||||||
|
mach_msg_trailer_t trailer;
|
||||||
|
} Request;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
NDR_record_t NDR;
|
||||||
|
kern_return_t RetCode;
|
||||||
|
} Reply;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Request* In0P = (Request*)InHeadP;
|
||||||
|
Reply* OutP = (Reply*)OutHeadP;
|
||||||
|
|
||||||
|
if (In0P->task.name != mach_task_self()) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
OutP->RetCode = ForwardException(In0P->task.name,
|
||||||
|
In0P->thread.name,
|
||||||
|
In0P->exception,
|
||||||
|
In0P->code,
|
||||||
|
In0P->codeCnt);
|
||||||
|
OutP->NDR = NDR_record;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
boolean_t breakpad_exc_server(mach_msg_header_t* request,
|
||||||
|
mach_msg_header_t* reply) {
|
||||||
|
return exc_server(request, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback from exc_server()
|
||||||
|
kern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count) {
|
||||||
|
if (task != mach_task_self()) {
|
||||||
|
return KERN_FAILURE;
|
||||||
|
}
|
||||||
|
return ForwardException(task, failed_thread, exception, code, code_count);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ExceptionHandler::ExceptionHandler(const string &dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
bool install_handler,
|
||||||
|
const char* port_name)
|
||||||
|
: dump_path_(),
|
||||||
|
filter_(filter),
|
||||||
|
callback_(callback),
|
||||||
|
callback_context_(callback_context),
|
||||||
|
directCallback_(NULL),
|
||||||
|
handler_thread_(NULL),
|
||||||
|
handler_port_(MACH_PORT_NULL),
|
||||||
|
previous_(NULL),
|
||||||
|
installed_exception_handler_(false),
|
||||||
|
is_in_teardown_(false),
|
||||||
|
last_minidump_write_result_(false),
|
||||||
|
use_minidump_write_mutex_(false) {
|
||||||
|
// This will update to the ID and C-string pointers
|
||||||
|
set_dump_path(dump_path);
|
||||||
|
MinidumpGenerator::GatherSystemInformation();
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
if (port_name)
|
||||||
|
crash_generation_client_.reset(new CrashGenerationClient(port_name));
|
||||||
|
#endif
|
||||||
|
Setup(install_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// special constructor if we want to bypass minidump writing and
|
||||||
|
// simply get a callback with the exception information
|
||||||
|
ExceptionHandler::ExceptionHandler(DirectCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
bool install_handler)
|
||||||
|
: dump_path_(),
|
||||||
|
filter_(NULL),
|
||||||
|
callback_(NULL),
|
||||||
|
callback_context_(callback_context),
|
||||||
|
directCallback_(callback),
|
||||||
|
handler_thread_(NULL),
|
||||||
|
handler_port_(MACH_PORT_NULL),
|
||||||
|
previous_(NULL),
|
||||||
|
installed_exception_handler_(false),
|
||||||
|
is_in_teardown_(false),
|
||||||
|
last_minidump_write_result_(false),
|
||||||
|
use_minidump_write_mutex_(false) {
|
||||||
|
MinidumpGenerator::GatherSystemInformation();
|
||||||
|
Setup(install_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExceptionHandler::~ExceptionHandler() {
|
||||||
|
Teardown();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::WriteMinidump(bool write_exception_stream) {
|
||||||
|
// If we're currently writing, just return
|
||||||
|
if (use_minidump_write_mutex_)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
use_minidump_write_mutex_ = true;
|
||||||
|
last_minidump_write_result_ = false;
|
||||||
|
|
||||||
|
// Lock the mutex. Since we just created it, this will return immediately.
|
||||||
|
if (pthread_mutex_lock(&minidump_write_mutex_) == 0) {
|
||||||
|
// Send an empty message to the handle port so that a minidump will
|
||||||
|
// be written
|
||||||
|
bool result = SendMessageToHandlerThread(write_exception_stream ?
|
||||||
|
kWriteDumpWithExceptionMessage :
|
||||||
|
kWriteDumpMessage);
|
||||||
|
if (!result) {
|
||||||
|
pthread_mutex_unlock(&minidump_write_mutex_);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the minidump writer to complete its writing. It will unlock
|
||||||
|
// the mutex when completed
|
||||||
|
pthread_mutex_lock(&minidump_write_mutex_);
|
||||||
|
}
|
||||||
|
|
||||||
|
use_minidump_write_mutex_ = false;
|
||||||
|
UpdateNextID();
|
||||||
|
return last_minidump_write_result_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool ExceptionHandler::WriteMinidump(const string &dump_path,
|
||||||
|
bool write_exception_stream,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context) {
|
||||||
|
ExceptionHandler handler(dump_path, NULL, callback, callback_context, false,
|
||||||
|
NULL);
|
||||||
|
return handler.WriteMinidump(write_exception_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool ExceptionHandler::WriteMinidumpForChild(mach_port_t child,
|
||||||
|
mach_port_t child_blamed_thread,
|
||||||
|
const string &dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context) {
|
||||||
|
ScopedTaskSuspend suspend(child);
|
||||||
|
|
||||||
|
MinidumpGenerator generator(child, MACH_PORT_NULL);
|
||||||
|
string dump_id;
|
||||||
|
string dump_filename = generator.UniqueNameInDirectory(dump_path, &dump_id);
|
||||||
|
|
||||||
|
generator.SetExceptionInformation(EXC_BREAKPOINT,
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
EXC_I386_BPT,
|
||||||
|
#elif defined(__ppc__) || defined(__ppc64__)
|
||||||
|
EXC_PPC_BREAKPOINT,
|
||||||
|
#elif defined(__arm__) || defined(__aarch64__)
|
||||||
|
EXC_ARM_BREAKPOINT,
|
||||||
|
#else
|
||||||
|
#error architecture not supported
|
||||||
|
#endif
|
||||||
|
0,
|
||||||
|
child_blamed_thread);
|
||||||
|
bool result = generator.Write(dump_filename.c_str());
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
return callback(dump_path.c_str(), dump_id.c_str(),
|
||||||
|
callback_context, result);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::WriteMinidumpWithException(
|
||||||
|
int exception_type,
|
||||||
|
int exception_code,
|
||||||
|
int exception_subcode,
|
||||||
|
breakpad_ucontext_t* task_context,
|
||||||
|
mach_port_t thread_name,
|
||||||
|
bool exit_after_write,
|
||||||
|
bool report_current_thread) {
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (directCallback_) {
|
||||||
|
if (directCallback_(callback_context_,
|
||||||
|
exception_type,
|
||||||
|
exception_code,
|
||||||
|
exception_subcode,
|
||||||
|
thread_name) ) {
|
||||||
|
if (exit_after_write)
|
||||||
|
_exit(exception_type);
|
||||||
|
}
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
} else if (IsOutOfProcess()) {
|
||||||
|
if (exception_type && exception_code) {
|
||||||
|
// If this is a real exception, give the filter (if any) a chance to
|
||||||
|
// decide if this should be sent.
|
||||||
|
if (filter_ && !filter_(callback_context_))
|
||||||
|
return false;
|
||||||
|
result = crash_generation_client_->RequestDumpForException(
|
||||||
|
exception_type,
|
||||||
|
exception_code,
|
||||||
|
exception_subcode,
|
||||||
|
thread_name);
|
||||||
|
if (result && exit_after_write) {
|
||||||
|
_exit(exception_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
string minidump_id;
|
||||||
|
|
||||||
|
// Putting the MinidumpGenerator in its own context will ensure that the
|
||||||
|
// destructor is executed, closing the newly created minidump file.
|
||||||
|
if (!dump_path_.empty()) {
|
||||||
|
MinidumpGenerator md(mach_task_self(),
|
||||||
|
report_current_thread ? MACH_PORT_NULL :
|
||||||
|
mach_thread_self());
|
||||||
|
md.SetTaskContext(task_context);
|
||||||
|
if (exception_type && exception_code) {
|
||||||
|
// If this is a real exception, give the filter (if any) a chance to
|
||||||
|
// decide if this should be sent.
|
||||||
|
if (filter_ && !filter_(callback_context_))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
md.SetExceptionInformation(exception_type, exception_code,
|
||||||
|
exception_subcode, thread_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = md.Write(next_minidump_path_c_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call user specified callback (if any)
|
||||||
|
if (callback_) {
|
||||||
|
// If the user callback returned true and we're handling an exception
|
||||||
|
// (rather than just writing out the file), then we should exit without
|
||||||
|
// forwarding the exception to the next handler.
|
||||||
|
if (callback_(dump_path_c_, next_minidump_id_c_, callback_context_,
|
||||||
|
result)) {
|
||||||
|
if (exit_after_write)
|
||||||
|
_exit(exception_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count) {
|
||||||
|
// At this time, we should have called Uninstall() on the exception handler
|
||||||
|
// so that the current exception ports are the ones that we should be
|
||||||
|
// forwarding to.
|
||||||
|
ExceptionParameters current;
|
||||||
|
|
||||||
|
current.count = EXC_TYPES_COUNT;
|
||||||
|
mach_port_t current_task = mach_task_self();
|
||||||
|
task_get_exception_ports(current_task,
|
||||||
|
s_exception_mask,
|
||||||
|
current.masks,
|
||||||
|
¤t.count,
|
||||||
|
current.ports,
|
||||||
|
current.behaviors,
|
||||||
|
current.flavors);
|
||||||
|
|
||||||
|
// Find the first exception handler that matches the exception
|
||||||
|
unsigned int found;
|
||||||
|
for (found = 0; found < current.count; ++found) {
|
||||||
|
if (current.masks[found] & (1 << exception)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing to forward
|
||||||
|
if (found == current.count) {
|
||||||
|
fprintf(stderr, "** No previous ports for forwarding!! \n");
|
||||||
|
exit(KERN_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
mach_port_t target_port = current.ports[found];
|
||||||
|
exception_behavior_t target_behavior = current.behaviors[found];
|
||||||
|
|
||||||
|
kern_return_t result;
|
||||||
|
// TODO: Handle the case where |target_behavior| has MACH_EXCEPTION_CODES
|
||||||
|
// set. https://code.google.com/p/google-breakpad/issues/detail?id=551
|
||||||
|
switch (target_behavior) {
|
||||||
|
case EXCEPTION_DEFAULT:
|
||||||
|
result = exception_raise(target_port, failed_thread, task, exception,
|
||||||
|
code, code_count);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "** Unknown exception behavior: %d\n", target_behavior);
|
||||||
|
result = KERN_FAILURE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void* ExceptionHandler::WaitForMessage(void* exception_handler_class) {
|
||||||
|
ExceptionHandler* self =
|
||||||
|
reinterpret_cast<ExceptionHandler*>(exception_handler_class);
|
||||||
|
ExceptionMessage receive;
|
||||||
|
|
||||||
|
// Wait for the exception info
|
||||||
|
while (1) {
|
||||||
|
receive.header.msgh_local_port = self->handler_port_;
|
||||||
|
receive.header.msgh_size = static_cast<mach_msg_size_t>(sizeof(receive));
|
||||||
|
kern_return_t result = mach_msg(&(receive.header),
|
||||||
|
MACH_RCV_MSG | MACH_RCV_LARGE, 0,
|
||||||
|
receive.header.msgh_size,
|
||||||
|
self->handler_port_,
|
||||||
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
|
||||||
|
|
||||||
|
if (result == KERN_SUCCESS) {
|
||||||
|
// Uninstall our handler so that we don't get in a loop if the process of
|
||||||
|
// writing out a minidump causes an exception. However, if the exception
|
||||||
|
// was caused by a fork'd process, don't uninstall things
|
||||||
|
|
||||||
|
// If the actual exception code is zero, then we're calling this handler
|
||||||
|
// in a way that indicates that we want to either exit this thread or
|
||||||
|
// generate a minidump
|
||||||
|
//
|
||||||
|
// While reporting, all threads (except this one) must be suspended
|
||||||
|
// to avoid misleading stacks. If appropriate they will be resumed
|
||||||
|
// afterwards.
|
||||||
|
if (!receive.exception) {
|
||||||
|
// Don't touch self, since this message could have been sent
|
||||||
|
// from its destructor.
|
||||||
|
if (receive.header.msgh_id == kShutdownMessage)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
self->SuspendThreads();
|
||||||
|
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Unprotect();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mach_port_t thread = MACH_PORT_NULL;
|
||||||
|
int exception_type = 0;
|
||||||
|
int exception_code = 0;
|
||||||
|
if (receive.header.msgh_id == kWriteDumpWithExceptionMessage) {
|
||||||
|
thread = receive.thread.name;
|
||||||
|
exception_type = EXC_BREAKPOINT;
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
exception_code = EXC_I386_BPT;
|
||||||
|
#elif defined(__ppc__) || defined(__ppc64__)
|
||||||
|
exception_code = EXC_PPC_BREAKPOINT;
|
||||||
|
#elif defined(__arm__) || defined(__aarch64__)
|
||||||
|
exception_code = EXC_ARM_BREAKPOINT;
|
||||||
|
#else
|
||||||
|
#error architecture not supported
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write out the dump and save the result for later retrieval
|
||||||
|
self->last_minidump_write_result_ =
|
||||||
|
self->WriteMinidumpWithException(exception_type, exception_code,
|
||||||
|
0, NULL, thread,
|
||||||
|
false, false);
|
||||||
|
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Protect();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
self->ResumeThreads();
|
||||||
|
|
||||||
|
if (self->use_minidump_write_mutex_)
|
||||||
|
pthread_mutex_unlock(&self->minidump_write_mutex_);
|
||||||
|
} else {
|
||||||
|
// When forking a child process with the exception handler installed,
|
||||||
|
// if the child crashes, it will send the exception back to the parent
|
||||||
|
// process. The check for task == self_task() ensures that only
|
||||||
|
// exceptions that occur in the parent process are caught and
|
||||||
|
// processed. If the exception was not caused by this task, we
|
||||||
|
// still need to call into the exception server and have it return
|
||||||
|
// KERN_FAILURE (see catch_exception_raise) in order for the kernel
|
||||||
|
// to move onto the host exception handler for the child task
|
||||||
|
if (receive.task.name == mach_task_self()) {
|
||||||
|
self->SuspendThreads();
|
||||||
|
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Unprotect();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int subcode = 0;
|
||||||
|
if (receive.exception == EXC_BAD_ACCESS && receive.code_count > 1)
|
||||||
|
subcode = receive.code[1];
|
||||||
|
|
||||||
|
// Generate the minidump with the exception data.
|
||||||
|
self->WriteMinidumpWithException(receive.exception, receive.code[0],
|
||||||
|
subcode, NULL, receive.thread.name,
|
||||||
|
true, false);
|
||||||
|
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
// This may have become protected again within
|
||||||
|
// WriteMinidumpWithException, but it needs to be unprotected for
|
||||||
|
// UninstallHandler.
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Unprotect();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
self->UninstallHandler(true);
|
||||||
|
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Protect();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// Pass along the exception to the server, which will setup the
|
||||||
|
// message and call catch_exception_raise() and put the return
|
||||||
|
// code into the reply.
|
||||||
|
ExceptionReplyMessage reply;
|
||||||
|
if (!breakpad_exc_server(&receive.header, &reply.header))
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
// Send a reply and exit
|
||||||
|
mach_msg(&(reply.header), MACH_SEND_MSG,
|
||||||
|
reply.header.msgh_size, 0, MACH_PORT_NULL,
|
||||||
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Unprotect();
|
||||||
|
#endif
|
||||||
|
gProtectedData.handler->WriteMinidumpWithException(
|
||||||
|
EXC_SOFTWARE,
|
||||||
|
MD_EXCEPTION_CODE_MAC_ABORT,
|
||||||
|
0,
|
||||||
|
static_cast<breakpad_ucontext_t*>(uc),
|
||||||
|
mach_thread_self(),
|
||||||
|
true,
|
||||||
|
true);
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
if (gBreakpadAllocator)
|
||||||
|
gBreakpadAllocator->Protect();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::InstallHandler() {
|
||||||
|
// If a handler is already installed, something is really wrong.
|
||||||
|
if (gProtectedData.handler != NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!IsOutOfProcess()) {
|
||||||
|
struct sigaction sa;
|
||||||
|
memset(&sa, 0, sizeof(sa));
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sigaddset(&sa.sa_mask, SIGABRT);
|
||||||
|
sa.sa_sigaction = ExceptionHandler::SignalHandler;
|
||||||
|
sa.sa_flags = SA_SIGINFO;
|
||||||
|
|
||||||
|
scoped_ptr<struct sigaction> old(new struct sigaction);
|
||||||
|
if (sigaction(SIGABRT, &sa, old.get()) == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
old_handler_.swap(old);
|
||||||
|
gProtectedData.handler = this;
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0);
|
||||||
|
mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
previous_ = new (gBreakpadAllocator->Allocate(sizeof(ExceptionParameters)) )
|
||||||
|
ExceptionParameters();
|
||||||
|
#else
|
||||||
|
previous_ = new ExceptionParameters();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the current exception ports so that we can forward to them
|
||||||
|
previous_->count = EXC_TYPES_COUNT;
|
||||||
|
mach_port_t current_task = mach_task_self();
|
||||||
|
kern_return_t result = task_get_exception_ports(current_task,
|
||||||
|
s_exception_mask,
|
||||||
|
previous_->masks,
|
||||||
|
&previous_->count,
|
||||||
|
previous_->ports,
|
||||||
|
previous_->behaviors,
|
||||||
|
previous_->flavors);
|
||||||
|
|
||||||
|
// Setup the exception ports on this task
|
||||||
|
if (result == KERN_SUCCESS)
|
||||||
|
result = task_set_exception_ports(current_task, s_exception_mask,
|
||||||
|
handler_port_, EXCEPTION_DEFAULT,
|
||||||
|
THREAD_STATE_NONE);
|
||||||
|
|
||||||
|
installed_exception_handler_ = (result == KERN_SUCCESS);
|
||||||
|
|
||||||
|
return installed_exception_handler_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::UninstallHandler(bool in_exception) {
|
||||||
|
kern_return_t result = KERN_SUCCESS;
|
||||||
|
|
||||||
|
if (old_handler_.get()) {
|
||||||
|
sigaction(SIGABRT, old_handler_.get(), NULL);
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
mprotect(gProtectedData.protected_buffer, PAGE_SIZE,
|
||||||
|
PROT_READ | PROT_WRITE);
|
||||||
|
#endif
|
||||||
|
old_handler_.reset();
|
||||||
|
gProtectedData.handler = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installed_exception_handler_) {
|
||||||
|
mach_port_t current_task = mach_task_self();
|
||||||
|
|
||||||
|
// Restore the previous ports
|
||||||
|
for (unsigned int i = 0; i < previous_->count; ++i) {
|
||||||
|
result = task_set_exception_ports(current_task, previous_->masks[i],
|
||||||
|
previous_->ports[i],
|
||||||
|
previous_->behaviors[i],
|
||||||
|
previous_->flavors[i]);
|
||||||
|
if (result != KERN_SUCCESS)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this delete should NOT happen if an exception just occurred!
|
||||||
|
if (!in_exception) {
|
||||||
|
#if USE_PROTECTED_ALLOCATIONS
|
||||||
|
previous_->~ExceptionParameters();
|
||||||
|
#else
|
||||||
|
delete previous_;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_ = NULL;
|
||||||
|
installed_exception_handler_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result == KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::Setup(bool install_handler) {
|
||||||
|
if (pthread_mutex_init(&minidump_write_mutex_, NULL))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Create a receive right
|
||||||
|
mach_port_t current_task = mach_task_self();
|
||||||
|
kern_return_t result = mach_port_allocate(current_task,
|
||||||
|
MACH_PORT_RIGHT_RECEIVE,
|
||||||
|
&handler_port_);
|
||||||
|
// Add send right
|
||||||
|
if (result == KERN_SUCCESS)
|
||||||
|
result = mach_port_insert_right(current_task, handler_port_, handler_port_,
|
||||||
|
MACH_MSG_TYPE_MAKE_SEND);
|
||||||
|
|
||||||
|
if (install_handler && result == KERN_SUCCESS)
|
||||||
|
if (!InstallHandler())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (result == KERN_SUCCESS) {
|
||||||
|
// Install the handler in its own thread, detached as we won't be joining.
|
||||||
|
pthread_attr_t attr;
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||||
|
int thread_create_result = pthread_create(&handler_thread_, &attr,
|
||||||
|
&WaitForMessage, this);
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
result = thread_create_result ? KERN_FAILURE : KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result == KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::Teardown() {
|
||||||
|
kern_return_t result = KERN_SUCCESS;
|
||||||
|
is_in_teardown_ = true;
|
||||||
|
|
||||||
|
if (!UninstallHandler(false))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Send an empty message so that the handler_thread exits
|
||||||
|
if (SendMessageToHandlerThread(kShutdownMessage)) {
|
||||||
|
mach_port_t current_task = mach_task_self();
|
||||||
|
result = mach_port_deallocate(current_task, handler_port_);
|
||||||
|
if (result != KERN_SUCCESS)
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler_thread_ = NULL;
|
||||||
|
handler_port_ = MACH_PORT_NULL;
|
||||||
|
pthread_mutex_destroy(&minidump_write_mutex_);
|
||||||
|
|
||||||
|
return result == KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::SendMessageToHandlerThread(
|
||||||
|
HandlerThreadMessage message_id) {
|
||||||
|
ExceptionMessage msg;
|
||||||
|
memset(&msg, 0, sizeof(msg));
|
||||||
|
msg.header.msgh_id = message_id;
|
||||||
|
if (message_id == kWriteDumpMessage ||
|
||||||
|
message_id == kWriteDumpWithExceptionMessage) {
|
||||||
|
// Include this thread's port.
|
||||||
|
msg.thread.name = mach_thread_self();
|
||||||
|
msg.thread.disposition = MACH_MSG_TYPE_PORT_SEND;
|
||||||
|
msg.thread.type = MACH_MSG_PORT_DESCRIPTOR;
|
||||||
|
}
|
||||||
|
msg.header.msgh_size = sizeof(msg) - sizeof(msg.padding);
|
||||||
|
msg.header.msgh_remote_port = handler_port_;
|
||||||
|
msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND,
|
||||||
|
MACH_MSG_TYPE_MAKE_SEND_ONCE);
|
||||||
|
kern_return_t result = mach_msg(&(msg.header),
|
||||||
|
MACH_SEND_MSG | MACH_SEND_TIMEOUT,
|
||||||
|
msg.header.msgh_size, 0, 0,
|
||||||
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
|
|
||||||
|
return result == KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExceptionHandler::UpdateNextID() {
|
||||||
|
next_minidump_path_ =
|
||||||
|
(MinidumpGenerator::UniqueNameInDirectory(dump_path_, &next_minidump_id_));
|
||||||
|
|
||||||
|
next_minidump_path_c_ = next_minidump_path_.c_str();
|
||||||
|
next_minidump_id_c_ = next_minidump_id_.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::SuspendThreads() {
|
||||||
|
thread_act_port_array_t threads_for_task;
|
||||||
|
mach_msg_type_number_t thread_count;
|
||||||
|
|
||||||
|
if (task_threads(mach_task_self(), &threads_for_task, &thread_count))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// suspend all of the threads except for this one
|
||||||
|
for (unsigned int i = 0; i < thread_count; ++i) {
|
||||||
|
if (threads_for_task[i] != mach_thread_self()) {
|
||||||
|
if (thread_suspend(threads_for_task[i]))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExceptionHandler::ResumeThreads() {
|
||||||
|
thread_act_port_array_t threads_for_task;
|
||||||
|
mach_msg_type_number_t thread_count;
|
||||||
|
|
||||||
|
if (task_threads(mach_task_self(), &threads_for_task, &thread_count))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// resume all of the threads except for this one
|
||||||
|
for (unsigned int i = 0; i < thread_count; ++i) {
|
||||||
|
if (threads_for_task[i] != mach_thread_self()) {
|
||||||
|
if (thread_resume(threads_for_task[i]))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
|
@ -0,0 +1,281 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// exception_handler.h: MacOS exception handler
|
||||||
|
// This class can install a Mach exception port handler to trap most common
|
||||||
|
// programming errors. If an exception occurs, a minidump file will be
|
||||||
|
// generated which contains detailed information about the process and the
|
||||||
|
// exception.
|
||||||
|
|
||||||
|
#ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
|
||||||
|
#define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
|
||||||
|
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#include <TargetConditionals.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "client/mac/handler/ucontext_compat.h"
|
||||||
|
#include "common/scoped_ptr.h"
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
#include "client/mac/crash_generation/crash_generation_client.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
struct ExceptionParameters;
|
||||||
|
|
||||||
|
enum HandlerThreadMessage {
|
||||||
|
// Message ID telling the handler thread to write a dump.
|
||||||
|
kWriteDumpMessage = 0,
|
||||||
|
// Message ID telling the handler thread to write a dump and include
|
||||||
|
// an exception stream.
|
||||||
|
kWriteDumpWithExceptionMessage = 1,
|
||||||
|
// Message ID telling the handler thread to quit.
|
||||||
|
kShutdownMessage = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExceptionHandler {
|
||||||
|
public:
|
||||||
|
// A callback function to run before Breakpad performs any substantial
|
||||||
|
// processing of an exception. A FilterCallback is called before writing
|
||||||
|
// a minidump. context is the parameter supplied by the user as
|
||||||
|
// callback_context when the handler was created.
|
||||||
|
//
|
||||||
|
// If a FilterCallback returns true, Breakpad will continue processing,
|
||||||
|
// attempting to write a minidump. If a FilterCallback returns false, Breakpad
|
||||||
|
// will immediately report the exception as unhandled without writing a
|
||||||
|
// minidump, allowing another handler the opportunity to handle it.
|
||||||
|
typedef bool (*FilterCallback)(void *context);
|
||||||
|
|
||||||
|
// A callback function to run after the minidump has been written.
|
||||||
|
// |minidump_id| is a unique id for the dump, so the minidump
|
||||||
|
// file is <dump_dir>/<minidump_id>.dmp.
|
||||||
|
// |context| is the value passed into the constructor.
|
||||||
|
// |succeeded| indicates whether a minidump file was successfully written.
|
||||||
|
// Return true if the exception was fully handled and breakpad should exit.
|
||||||
|
// Return false to allow any other exception handlers to process the
|
||||||
|
// exception.
|
||||||
|
typedef bool (*MinidumpCallback)(const char *dump_dir,
|
||||||
|
const char *minidump_id,
|
||||||
|
void *context, bool succeeded);
|
||||||
|
|
||||||
|
// A callback function which will be called directly if an exception occurs.
|
||||||
|
// This bypasses the minidump file writing and simply gives the client
|
||||||
|
// the exception information.
|
||||||
|
typedef bool (*DirectCallback)( void *context,
|
||||||
|
int exception_type,
|
||||||
|
int exception_code,
|
||||||
|
int exception_subcode,
|
||||||
|
mach_port_t thread_name);
|
||||||
|
|
||||||
|
// Creates a new ExceptionHandler instance to handle writing minidumps.
|
||||||
|
// Minidump files will be written to dump_path, and the optional callback
|
||||||
|
// is called after writing the dump file, as described above.
|
||||||
|
// If install_handler is true, then a minidump will be written whenever
|
||||||
|
// an unhandled exception occurs. If it is false, minidumps will only
|
||||||
|
// be written when WriteMinidump is called.
|
||||||
|
// If port_name is non-NULL, attempt to perform out-of-process dump generation
|
||||||
|
// If port_name is NULL, in-process dump generation will be used.
|
||||||
|
ExceptionHandler(const string &dump_path,
|
||||||
|
FilterCallback filter, MinidumpCallback callback,
|
||||||
|
void *callback_context, bool install_handler,
|
||||||
|
const char *port_name);
|
||||||
|
|
||||||
|
// A special constructor if we want to bypass minidump writing and
|
||||||
|
// simply get a callback with the exception information.
|
||||||
|
ExceptionHandler(DirectCallback callback,
|
||||||
|
void *callback_context,
|
||||||
|
bool install_handler);
|
||||||
|
|
||||||
|
~ExceptionHandler();
|
||||||
|
|
||||||
|
// Get and set the minidump path.
|
||||||
|
string dump_path() const { return dump_path_; }
|
||||||
|
void set_dump_path(const string &dump_path) {
|
||||||
|
dump_path_ = dump_path;
|
||||||
|
dump_path_c_ = dump_path_.c_str();
|
||||||
|
UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writes a minidump immediately. This can be used to capture the
|
||||||
|
// execution state independently of a crash. Returns true on success.
|
||||||
|
bool WriteMinidump() {
|
||||||
|
return WriteMinidump(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WriteMinidump(bool write_exception_stream);
|
||||||
|
|
||||||
|
// Convenience form of WriteMinidump which does not require an
|
||||||
|
// ExceptionHandler instance.
|
||||||
|
static bool WriteMinidump(const string &dump_path, MinidumpCallback callback,
|
||||||
|
void *callback_context) {
|
||||||
|
return WriteMinidump(dump_path, false, callback, callback_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool WriteMinidump(const string &dump_path,
|
||||||
|
bool write_exception_stream,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void *callback_context);
|
||||||
|
|
||||||
|
// Write a minidump of child immediately. This can be used to capture
|
||||||
|
// the execution state of a child process independently of a crash.
|
||||||
|
static bool WriteMinidumpForChild(mach_port_t child,
|
||||||
|
mach_port_t child_blamed_thread,
|
||||||
|
const std::string &dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void *callback_context);
|
||||||
|
|
||||||
|
// Returns whether out-of-process dump generation is used or not.
|
||||||
|
bool IsOutOfProcess() const {
|
||||||
|
#if TARGET_OS_IPHONE
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return crash_generation_client_.get() != NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Install the mach exception handler
|
||||||
|
bool InstallHandler();
|
||||||
|
|
||||||
|
// Uninstall the mach exception handler (if any)
|
||||||
|
bool UninstallHandler(bool in_exception);
|
||||||
|
|
||||||
|
// Setup the handler thread, and if |install_handler| is true, install the
|
||||||
|
// mach exception port handler
|
||||||
|
bool Setup(bool install_handler);
|
||||||
|
|
||||||
|
// Uninstall the mach exception handler (if any) and terminate the helper
|
||||||
|
// thread
|
||||||
|
bool Teardown();
|
||||||
|
|
||||||
|
// Send a mach message to the exception handler. Return true on
|
||||||
|
// success, false otherwise.
|
||||||
|
bool SendMessageToHandlerThread(HandlerThreadMessage message_id);
|
||||||
|
|
||||||
|
// All minidump writing goes through this one routine.
|
||||||
|
// |task_context| can be NULL. If not, it will be used to retrieve the
|
||||||
|
// context of the current thread, instead of using |thread_get_state|.
|
||||||
|
bool WriteMinidumpWithException(int exception_type,
|
||||||
|
int exception_code,
|
||||||
|
int exception_subcode,
|
||||||
|
breakpad_ucontext_t *task_context,
|
||||||
|
mach_port_t thread_name,
|
||||||
|
bool exit_after_write,
|
||||||
|
bool report_current_thread);
|
||||||
|
|
||||||
|
// When installed, this static function will be call from a newly created
|
||||||
|
// pthread with |this| as the argument
|
||||||
|
static void *WaitForMessage(void *exception_handler_class);
|
||||||
|
|
||||||
|
// Signal handler for SIGABRT.
|
||||||
|
static void SignalHandler(int sig, siginfo_t* info, void* uc);
|
||||||
|
|
||||||
|
// disallow copy ctor and operator=
|
||||||
|
explicit ExceptionHandler(const ExceptionHandler &);
|
||||||
|
void operator=(const ExceptionHandler &);
|
||||||
|
|
||||||
|
// Generates a new ID and stores it in next_minidump_id_, and stores the
|
||||||
|
// path of the next minidump to be written in next_minidump_path_.
|
||||||
|
void UpdateNextID();
|
||||||
|
|
||||||
|
// These functions will suspend/resume all threads except for the
|
||||||
|
// reporting thread
|
||||||
|
bool SuspendThreads();
|
||||||
|
bool ResumeThreads();
|
||||||
|
|
||||||
|
// The destination directory for the minidump
|
||||||
|
string dump_path_;
|
||||||
|
|
||||||
|
// The basename of the next minidump w/o extension
|
||||||
|
string next_minidump_id_;
|
||||||
|
|
||||||
|
// The full path to the next minidump to be written, including extension
|
||||||
|
string next_minidump_path_;
|
||||||
|
|
||||||
|
// Pointers to the UTF-8 versions of above
|
||||||
|
const char *dump_path_c_;
|
||||||
|
const char *next_minidump_id_c_;
|
||||||
|
const char *next_minidump_path_c_;
|
||||||
|
|
||||||
|
// The callback function and pointer to be passed back after the minidump
|
||||||
|
// has been written
|
||||||
|
FilterCallback filter_;
|
||||||
|
MinidumpCallback callback_;
|
||||||
|
void *callback_context_;
|
||||||
|
|
||||||
|
// The callback function to be passed back when we don't want a minidump
|
||||||
|
// file to be written
|
||||||
|
DirectCallback directCallback_;
|
||||||
|
|
||||||
|
// The thread that is created for the handler
|
||||||
|
pthread_t handler_thread_;
|
||||||
|
|
||||||
|
// The port that is waiting on an exception message to be sent, if the
|
||||||
|
// handler is installed
|
||||||
|
mach_port_t handler_port_;
|
||||||
|
|
||||||
|
// These variables save the previous exception handler's data so that it
|
||||||
|
// can be re-installed when this handler is uninstalled
|
||||||
|
ExceptionParameters *previous_;
|
||||||
|
|
||||||
|
// True, if we've installed the exception handler
|
||||||
|
bool installed_exception_handler_;
|
||||||
|
|
||||||
|
// True, if we're in the process of uninstalling the exception handler and
|
||||||
|
// the thread.
|
||||||
|
bool is_in_teardown_;
|
||||||
|
|
||||||
|
// Save the last result of the last minidump
|
||||||
|
bool last_minidump_write_result_;
|
||||||
|
|
||||||
|
// A mutex for use when writing out a minidump that was requested on a
|
||||||
|
// thread other than the exception handler.
|
||||||
|
pthread_mutex_t minidump_write_mutex_;
|
||||||
|
|
||||||
|
// True, if we're using the mutext to indicate when mindump writing occurs
|
||||||
|
bool use_minidump_write_mutex_;
|
||||||
|
|
||||||
|
// Old signal handler for SIGABRT. Used to be able to restore it when
|
||||||
|
// uninstalling.
|
||||||
|
scoped_ptr<struct sigaction> old_handler_;
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
// Client for out-of-process dump generation.
|
||||||
|
scoped_ptr<CrashGenerationClient> crash_generation_client_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
|
|
@ -0,0 +1,181 @@
|
||||||
|
// Copyright (c) 2008, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
|
||||||
|
#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dbghelp.h>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include "common/windows/string_utils-inl.h"
|
||||||
|
#include "google_breakpad/common/minidump_format.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
// Name/value pair for custom client information.
|
||||||
|
struct CustomInfoEntry {
|
||||||
|
// Maximum length for name and value for client custom info.
|
||||||
|
static const int kNameMaxLength = 64;
|
||||||
|
static const int kValueMaxLength = 64;
|
||||||
|
|
||||||
|
CustomInfoEntry() {
|
||||||
|
// Putting name and value in initializer list makes VC++ show warning 4351.
|
||||||
|
set_name(NULL);
|
||||||
|
set_value(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) {
|
||||||
|
set_name(name_arg);
|
||||||
|
set_value(value_arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_name(const wchar_t* name_arg) {
|
||||||
|
if (!name_arg) {
|
||||||
|
name[0] = L'\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_value(const wchar_t* value_arg) {
|
||||||
|
if (!value_arg) {
|
||||||
|
value[0] = L'\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(const wchar_t* name_arg, const wchar_t* value_arg) {
|
||||||
|
set_name(name_arg);
|
||||||
|
set_value(value_arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
wchar_t name[kNameMaxLength];
|
||||||
|
wchar_t value[kValueMaxLength];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Constants for the protocol between client and the server.
|
||||||
|
|
||||||
|
// Tags sent with each message indicating the purpose of
|
||||||
|
// the message.
|
||||||
|
enum MessageTag {
|
||||||
|
MESSAGE_TAG_NONE = 0,
|
||||||
|
MESSAGE_TAG_REGISTRATION_REQUEST = 1,
|
||||||
|
MESSAGE_TAG_REGISTRATION_RESPONSE = 2,
|
||||||
|
MESSAGE_TAG_REGISTRATION_ACK = 3,
|
||||||
|
MESSAGE_TAG_UPLOAD_REQUEST = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CustomClientInfo {
|
||||||
|
const CustomInfoEntry* entries;
|
||||||
|
size_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Message structure for IPC between crash client and crash server.
|
||||||
|
struct ProtocolMessage {
|
||||||
|
ProtocolMessage()
|
||||||
|
: tag(MESSAGE_TAG_NONE),
|
||||||
|
id(0),
|
||||||
|
dump_type(MiniDumpNormal),
|
||||||
|
thread_id(0),
|
||||||
|
exception_pointers(NULL),
|
||||||
|
assert_info(NULL),
|
||||||
|
custom_client_info(),
|
||||||
|
dump_request_handle(NULL),
|
||||||
|
dump_generated_handle(NULL),
|
||||||
|
server_alive_handle(NULL) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates an instance with the given parameters.
|
||||||
|
ProtocolMessage(MessageTag arg_tag,
|
||||||
|
DWORD arg_id,
|
||||||
|
MINIDUMP_TYPE arg_dump_type,
|
||||||
|
DWORD* arg_thread_id,
|
||||||
|
EXCEPTION_POINTERS** arg_exception_pointers,
|
||||||
|
MDRawAssertionInfo* arg_assert_info,
|
||||||
|
const CustomClientInfo& custom_info,
|
||||||
|
HANDLE arg_dump_request_handle,
|
||||||
|
HANDLE arg_dump_generated_handle,
|
||||||
|
HANDLE arg_server_alive)
|
||||||
|
: tag(arg_tag),
|
||||||
|
id(arg_id),
|
||||||
|
dump_type(arg_dump_type),
|
||||||
|
thread_id(arg_thread_id),
|
||||||
|
exception_pointers(arg_exception_pointers),
|
||||||
|
assert_info(arg_assert_info),
|
||||||
|
custom_client_info(custom_info),
|
||||||
|
dump_request_handle(arg_dump_request_handle),
|
||||||
|
dump_generated_handle(arg_dump_generated_handle),
|
||||||
|
server_alive_handle(arg_server_alive) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tag in the message.
|
||||||
|
MessageTag tag;
|
||||||
|
|
||||||
|
// The id for this message. This may be either a process id or a crash id
|
||||||
|
// depending on the type of message.
|
||||||
|
DWORD id;
|
||||||
|
|
||||||
|
// Dump type requested.
|
||||||
|
MINIDUMP_TYPE dump_type;
|
||||||
|
|
||||||
|
// Client thread id pointer.
|
||||||
|
DWORD* thread_id;
|
||||||
|
|
||||||
|
// Exception information.
|
||||||
|
EXCEPTION_POINTERS** exception_pointers;
|
||||||
|
|
||||||
|
// Assert information in case of an invalid parameter or
|
||||||
|
// pure call failure.
|
||||||
|
MDRawAssertionInfo* assert_info;
|
||||||
|
|
||||||
|
// Custom client information.
|
||||||
|
CustomClientInfo custom_client_info;
|
||||||
|
|
||||||
|
// Handle to signal the crash event.
|
||||||
|
HANDLE dump_request_handle;
|
||||||
|
|
||||||
|
// Handle to check if server is done generating crash.
|
||||||
|
HANDLE dump_generated_handle;
|
||||||
|
|
||||||
|
// Handle to a mutex that becomes signaled (WAIT_ABANDONED)
|
||||||
|
// if server process goes down.
|
||||||
|
HANDLE server_alive_handle;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Disable copy ctor and operator=.
|
||||||
|
ProtocolMessage(const ProtocolMessage& msg);
|
||||||
|
ProtocolMessage& operator=(const ProtocolMessage& msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
|
405
Telegram/ThirdParty/breakpad/client/windows/crash_generation/crash_generation_client.cc
vendored
Normal file
405
Telegram/ThirdParty/breakpad/client/windows/crash_generation/crash_generation_client.cc
vendored
Normal file
|
@ -0,0 +1,405 @@
|
||||||
|
// Copyright (c) 2008, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include "client/windows/crash_generation/crash_generation_client.h"
|
||||||
|
#include <cassert>
|
||||||
|
#include <utility>
|
||||||
|
#include "client/windows/common/ipc_protocol.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
const int kPipeBusyWaitTimeoutMs = 2000;
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
const DWORD kWaitForServerTimeoutMs = INFINITE;
|
||||||
|
#else
|
||||||
|
const DWORD kWaitForServerTimeoutMs = 15000;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const int kPipeConnectMaxAttempts = 2;
|
||||||
|
|
||||||
|
const DWORD kPipeDesiredAccess = FILE_READ_DATA |
|
||||||
|
FILE_WRITE_DATA |
|
||||||
|
FILE_WRITE_ATTRIBUTES;
|
||||||
|
|
||||||
|
const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION |
|
||||||
|
SECURITY_SQOS_PRESENT;
|
||||||
|
|
||||||
|
const DWORD kPipeMode = PIPE_READMODE_MESSAGE;
|
||||||
|
|
||||||
|
const size_t kWaitEventCount = 2;
|
||||||
|
|
||||||
|
// This function is orphan for production code. It can be used
|
||||||
|
// for debugging to help repro some scenarios like the client
|
||||||
|
// is slow in writing to the pipe after connecting, the client
|
||||||
|
// is slow in reading from the pipe after writing, etc. The parameter
|
||||||
|
// overlapped below is not used and it is present to match the signature
|
||||||
|
// of this function to TransactNamedPipe Win32 API. Uncomment if needed
|
||||||
|
// for debugging.
|
||||||
|
/**
|
||||||
|
static bool TransactNamedPipeDebugHelper(HANDLE pipe,
|
||||||
|
const void* in_buffer,
|
||||||
|
DWORD in_size,
|
||||||
|
void* out_buffer,
|
||||||
|
DWORD out_size,
|
||||||
|
DWORD* bytes_count,
|
||||||
|
LPOVERLAPPED) {
|
||||||
|
// Uncomment the next sleep to create a gap before writing
|
||||||
|
// to pipe.
|
||||||
|
// Sleep(5000);
|
||||||
|
|
||||||
|
if (!WriteFile(pipe,
|
||||||
|
in_buffer,
|
||||||
|
in_size,
|
||||||
|
bytes_count,
|
||||||
|
NULL)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncomment the next sleep to create a gap between write
|
||||||
|
// and read.
|
||||||
|
// Sleep(5000);
|
||||||
|
|
||||||
|
return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE;
|
||||||
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
|
CrashGenerationClient::CrashGenerationClient(
|
||||||
|
const wchar_t* pipe_name,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const CustomClientInfo* custom_info)
|
||||||
|
: pipe_name_(pipe_name),
|
||||||
|
pipe_handle_(NULL),
|
||||||
|
custom_info_(),
|
||||||
|
dump_type_(dump_type),
|
||||||
|
crash_event_(NULL),
|
||||||
|
crash_generated_(NULL),
|
||||||
|
server_alive_(NULL),
|
||||||
|
server_process_id_(0),
|
||||||
|
thread_id_(0),
|
||||||
|
exception_pointers_(NULL) {
|
||||||
|
memset(&assert_info_, 0, sizeof(assert_info_));
|
||||||
|
if (custom_info) {
|
||||||
|
custom_info_ = *custom_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CrashGenerationClient::CrashGenerationClient(
|
||||||
|
HANDLE pipe_handle,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const CustomClientInfo* custom_info)
|
||||||
|
: pipe_name_(),
|
||||||
|
pipe_handle_(pipe_handle),
|
||||||
|
custom_info_(),
|
||||||
|
dump_type_(dump_type),
|
||||||
|
crash_event_(NULL),
|
||||||
|
crash_generated_(NULL),
|
||||||
|
server_alive_(NULL),
|
||||||
|
server_process_id_(0),
|
||||||
|
thread_id_(0),
|
||||||
|
exception_pointers_(NULL) {
|
||||||
|
memset(&assert_info_, 0, sizeof(assert_info_));
|
||||||
|
if (custom_info) {
|
||||||
|
custom_info_ = *custom_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CrashGenerationClient::~CrashGenerationClient() {
|
||||||
|
if (crash_event_) {
|
||||||
|
CloseHandle(crash_event_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crash_generated_) {
|
||||||
|
CloseHandle(crash_generated_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server_alive_) {
|
||||||
|
CloseHandle(server_alive_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Performs the registration step with the server process.
|
||||||
|
// The registration step involves communicating with the server
|
||||||
|
// via a named pipe. The client sends the following pieces of
|
||||||
|
// data to the server:
|
||||||
|
//
|
||||||
|
// * Message tag indicating the client is requesting registration.
|
||||||
|
// * Process id of the client process.
|
||||||
|
// * Address of a DWORD variable in the client address space
|
||||||
|
// that will contain the thread id of the client thread that
|
||||||
|
// caused the crash.
|
||||||
|
// * Address of a EXCEPTION_POINTERS* variable in the client
|
||||||
|
// address space that will point to an instance of EXCEPTION_POINTERS
|
||||||
|
// when the crash happens.
|
||||||
|
// * Address of an instance of MDRawAssertionInfo that will contain
|
||||||
|
// relevant information in case of non-exception crashes like assertion
|
||||||
|
// failures and pure calls.
|
||||||
|
//
|
||||||
|
// In return the client expects the following information from the server:
|
||||||
|
//
|
||||||
|
// * Message tag indicating successful registration.
|
||||||
|
// * Server process id.
|
||||||
|
// * Handle to an object that client can signal to request dump
|
||||||
|
// generation from the server.
|
||||||
|
// * Handle to an object that client can wait on after requesting
|
||||||
|
// dump generation for the server to finish dump generation.
|
||||||
|
// * Handle to a mutex object that client can wait on to make sure
|
||||||
|
// server is still alive.
|
||||||
|
//
|
||||||
|
// If any step of the expected behavior mentioned above fails, the
|
||||||
|
// registration step is not considered successful and hence out-of-process
|
||||||
|
// dump generation service is not available.
|
||||||
|
//
|
||||||
|
// Returns true if the registration is successful; false otherwise.
|
||||||
|
bool CrashGenerationClient::Register() {
|
||||||
|
if (IsRegistered()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE pipe = ConnectToServer();
|
||||||
|
if (!pipe) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success = RegisterClient(pipe);
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::RequestUpload(DWORD crash_id) {
|
||||||
|
HANDLE pipe = ConnectToServer();
|
||||||
|
if (!pipe) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomClientInfo custom_info = {NULL, 0};
|
||||||
|
ProtocolMessage msg(MESSAGE_TAG_UPLOAD_REQUEST, crash_id,
|
||||||
|
static_cast<MINIDUMP_TYPE>(NULL), NULL, NULL, NULL,
|
||||||
|
custom_info, NULL, NULL, NULL);
|
||||||
|
DWORD bytes_count = 0;
|
||||||
|
bool success = WriteFile(pipe, &msg, sizeof(msg), &bytes_count, NULL) != 0;
|
||||||
|
|
||||||
|
CloseHandle(pipe);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE CrashGenerationClient::ConnectToServer() {
|
||||||
|
HANDLE pipe = ConnectToPipe(pipe_name_.c_str(),
|
||||||
|
kPipeDesiredAccess,
|
||||||
|
kPipeFlagsAndAttributes);
|
||||||
|
if (!pipe) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD mode = kPipeMode;
|
||||||
|
if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) {
|
||||||
|
CloseHandle(pipe);
|
||||||
|
pipe = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::RegisterClient(HANDLE pipe) {
|
||||||
|
ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST,
|
||||||
|
GetCurrentProcessId(),
|
||||||
|
dump_type_,
|
||||||
|
&thread_id_,
|
||||||
|
&exception_pointers_,
|
||||||
|
&assert_info_,
|
||||||
|
custom_info_,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
ProtocolMessage reply;
|
||||||
|
DWORD bytes_count = 0;
|
||||||
|
// The call to TransactNamedPipe below can be changed to a call
|
||||||
|
// to TransactNamedPipeDebugHelper to help repro some scenarios.
|
||||||
|
// For details see comments for TransactNamedPipeDebugHelper.
|
||||||
|
if (!TransactNamedPipe(pipe,
|
||||||
|
&msg,
|
||||||
|
sizeof(msg),
|
||||||
|
&reply,
|
||||||
|
sizeof(ProtocolMessage),
|
||||||
|
&bytes_count,
|
||||||
|
NULL)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ValidateResponse(reply)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProtocolMessage ack_msg;
|
||||||
|
ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK;
|
||||||
|
|
||||||
|
if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
crash_event_ = reply.dump_request_handle;
|
||||||
|
crash_generated_ = reply.dump_generated_handle;
|
||||||
|
server_alive_ = reply.server_alive_handle;
|
||||||
|
server_process_id_ = reply.id;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name,
|
||||||
|
DWORD pipe_access,
|
||||||
|
DWORD flags_attrs) {
|
||||||
|
if (pipe_handle_) {
|
||||||
|
HANDLE t = pipe_handle_;
|
||||||
|
pipe_handle_ = NULL;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < kPipeConnectMaxAttempts; ++i) {
|
||||||
|
HANDLE pipe = CreateFile(pipe_name,
|
||||||
|
pipe_access,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
flags_attrs,
|
||||||
|
NULL);
|
||||||
|
if (pipe != INVALID_HANDLE_VALUE) {
|
||||||
|
return pipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot continue retrying if error is something other than
|
||||||
|
// ERROR_PIPE_BUSY.
|
||||||
|
if (GetLastError() != ERROR_PIPE_BUSY) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot continue retrying if wait on pipe fails.
|
||||||
|
if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::ValidateResponse(
|
||||||
|
const ProtocolMessage& msg) const {
|
||||||
|
return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) &&
|
||||||
|
(msg.id != 0) &&
|
||||||
|
(msg.dump_request_handle != NULL) &&
|
||||||
|
(msg.dump_generated_handle != NULL) &&
|
||||||
|
(msg.server_alive_handle != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::IsRegistered() const {
|
||||||
|
return crash_event_ != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info,
|
||||||
|
MDRawAssertionInfo* assert_info) {
|
||||||
|
if (!IsRegistered()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
exception_pointers_ = ex_info;
|
||||||
|
thread_id_ = GetCurrentThreadId();
|
||||||
|
|
||||||
|
if (assert_info) {
|
||||||
|
memcpy(&assert_info_, assert_info, sizeof(assert_info_));
|
||||||
|
} else {
|
||||||
|
memset(&assert_info_, 0, sizeof(assert_info_));
|
||||||
|
}
|
||||||
|
|
||||||
|
return SignalCrashEventAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) {
|
||||||
|
return RequestDump(ex_info, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) {
|
||||||
|
return RequestDump(NULL, assert_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrashGenerationClient::SignalCrashEventAndWait() {
|
||||||
|
assert(crash_event_);
|
||||||
|
assert(crash_generated_);
|
||||||
|
assert(server_alive_);
|
||||||
|
|
||||||
|
// Reset the dump generated event before signaling the crash
|
||||||
|
// event so that the server can set the dump generated event
|
||||||
|
// once it is done generating the event.
|
||||||
|
if (!ResetEvent(crash_generated_)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SetEvent(crash_event_)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_};
|
||||||
|
|
||||||
|
DWORD result = WaitForMultipleObjects(kWaitEventCount,
|
||||||
|
wait_handles,
|
||||||
|
FALSE,
|
||||||
|
kWaitForServerTimeoutMs);
|
||||||
|
|
||||||
|
// Crash dump was successfully generated only if the server
|
||||||
|
// signaled the crash generated event.
|
||||||
|
return result == WAIT_OBJECT_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE CrashGenerationClient::DuplicatePipeToClientProcess(const wchar_t* pipe_name,
|
||||||
|
HANDLE hProcess) {
|
||||||
|
for (int i = 0; i < kPipeConnectMaxAttempts; ++i) {
|
||||||
|
HANDLE local_pipe = CreateFile(pipe_name, kPipeDesiredAccess,
|
||||||
|
0, NULL, OPEN_EXISTING,
|
||||||
|
kPipeFlagsAndAttributes, NULL);
|
||||||
|
if (local_pipe != INVALID_HANDLE_VALUE) {
|
||||||
|
HANDLE remotePipe = INVALID_HANDLE_VALUE;
|
||||||
|
if (DuplicateHandle(GetCurrentProcess(), local_pipe,
|
||||||
|
hProcess, &remotePipe, 0, FALSE,
|
||||||
|
DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
||||||
|
return remotePipe;
|
||||||
|
} else {
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot continue retrying if the error wasn't a busy pipe.
|
||||||
|
if (GetLastError() != ERROR_PIPE_BUSY) {
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) {
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
182
Telegram/ThirdParty/breakpad/client/windows/crash_generation/crash_generation_client.h
vendored
Normal file
182
Telegram/ThirdParty/breakpad/client/windows/crash_generation/crash_generation_client.h
vendored
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
// Copyright (c) 2008, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
||||||
|
#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dbghelp.h>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include "client/windows/common/ipc_protocol.h"
|
||||||
|
#include "common/scoped_ptr.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
struct CustomClientInfo;
|
||||||
|
|
||||||
|
// Abstraction of client-side implementation of out of process
|
||||||
|
// crash generation.
|
||||||
|
//
|
||||||
|
// The process that desires to have out-of-process crash dump
|
||||||
|
// generation service can use this class in the following way:
|
||||||
|
//
|
||||||
|
// * Create an instance.
|
||||||
|
// * Call Register method so that the client tries to register
|
||||||
|
// with the server process and check the return value. If
|
||||||
|
// registration is not successful, out-of-process crash dump
|
||||||
|
// generation will not be available
|
||||||
|
// * Request dump generation by calling either of the two
|
||||||
|
// overloaded RequestDump methods - one in case of exceptions
|
||||||
|
// and the other in case of assertion failures
|
||||||
|
//
|
||||||
|
// Note that it is the responsibility of the client code of
|
||||||
|
// this class to set the unhandled exception filter with the
|
||||||
|
// system by calling the SetUnhandledExceptionFilter function
|
||||||
|
// and the client code should explicitly request dump generation.
|
||||||
|
class CrashGenerationClient {
|
||||||
|
public:
|
||||||
|
CrashGenerationClient(const wchar_t* pipe_name,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const CustomClientInfo* custom_info);
|
||||||
|
|
||||||
|
CrashGenerationClient(HANDLE pipe_handle,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const CustomClientInfo* custom_info);
|
||||||
|
|
||||||
|
~CrashGenerationClient();
|
||||||
|
|
||||||
|
// Registers the client process with the crash server.
|
||||||
|
//
|
||||||
|
// Returns true if the registration is successful; false otherwise.
|
||||||
|
bool Register();
|
||||||
|
|
||||||
|
// Requests the crash server to upload a previous dump with the
|
||||||
|
// given crash id.
|
||||||
|
bool RequestUpload(DWORD crash_id);
|
||||||
|
|
||||||
|
bool RequestDump(EXCEPTION_POINTERS* ex_info,
|
||||||
|
MDRawAssertionInfo* assert_info);
|
||||||
|
|
||||||
|
// Requests the crash server to generate a dump with the given
|
||||||
|
// exception information.
|
||||||
|
//
|
||||||
|
// Returns true if the dump was successful; false otherwise. Note that
|
||||||
|
// if the registration step was not performed or it was not successful,
|
||||||
|
// false will be returned.
|
||||||
|
bool RequestDump(EXCEPTION_POINTERS* ex_info);
|
||||||
|
|
||||||
|
// Requests the crash server to generate a dump with the given
|
||||||
|
// assertion information.
|
||||||
|
//
|
||||||
|
// Returns true if the dump was successful; false otherwise. Note that
|
||||||
|
// if the registration step was not performed or it was not successful,
|
||||||
|
// false will be returned.
|
||||||
|
bool RequestDump(MDRawAssertionInfo* assert_info);
|
||||||
|
|
||||||
|
// If the crash generation client is running in a sandbox that prevents it
|
||||||
|
// from opening the named pipe directly, the server process may open the
|
||||||
|
// handle and duplicate it into the client process with this helper method.
|
||||||
|
// Returns INVALID_HANDLE_VALUE on failure. The process must have been opened
|
||||||
|
// with the PROCESS_DUP_HANDLE access right.
|
||||||
|
static HANDLE DuplicatePipeToClientProcess(const wchar_t* pipe_name,
|
||||||
|
HANDLE hProcess);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Connects to the appropriate pipe and sets the pipe handle state.
|
||||||
|
//
|
||||||
|
// Returns the pipe handle if everything goes well; otherwise Returns NULL.
|
||||||
|
HANDLE ConnectToServer();
|
||||||
|
|
||||||
|
// Performs a handshake with the server over the given pipe which should be
|
||||||
|
// already connected to the server.
|
||||||
|
//
|
||||||
|
// Returns true if handshake with the server was successful; false otherwise.
|
||||||
|
bool RegisterClient(HANDLE pipe);
|
||||||
|
|
||||||
|
// Validates the given server response.
|
||||||
|
bool ValidateResponse(const ProtocolMessage& msg) const;
|
||||||
|
|
||||||
|
// Returns true if the registration step succeeded; false otherwise.
|
||||||
|
bool IsRegistered() const;
|
||||||
|
|
||||||
|
// Connects to the given named pipe with given parameters.
|
||||||
|
//
|
||||||
|
// Returns true if the connection is successful; false otherwise.
|
||||||
|
HANDLE ConnectToPipe(const wchar_t* pipe_name,
|
||||||
|
DWORD pipe_access,
|
||||||
|
DWORD flags_attrs);
|
||||||
|
|
||||||
|
// Signals the crash event and wait for the server to generate crash.
|
||||||
|
bool SignalCrashEventAndWait();
|
||||||
|
|
||||||
|
// Pipe name to use to talk to server.
|
||||||
|
std::wstring pipe_name_;
|
||||||
|
|
||||||
|
// Pipe handle duplicated from server process. Only valid before
|
||||||
|
// Register is called.
|
||||||
|
HANDLE pipe_handle_;
|
||||||
|
|
||||||
|
// Custom client information
|
||||||
|
CustomClientInfo custom_info_;
|
||||||
|
|
||||||
|
// Type of dump to generate.
|
||||||
|
MINIDUMP_TYPE dump_type_;
|
||||||
|
|
||||||
|
// Event to signal in case of a crash.
|
||||||
|
HANDLE crash_event_;
|
||||||
|
|
||||||
|
// Handle to wait on after signaling a crash for the server
|
||||||
|
// to finish generating crash dump.
|
||||||
|
HANDLE crash_generated_;
|
||||||
|
|
||||||
|
// Handle to a mutex that will become signaled with WAIT_ABANDONED
|
||||||
|
// if the server process goes down.
|
||||||
|
HANDLE server_alive_;
|
||||||
|
|
||||||
|
// Server process id.
|
||||||
|
DWORD server_process_id_;
|
||||||
|
|
||||||
|
// Id of the thread that caused the crash.
|
||||||
|
DWORD thread_id_;
|
||||||
|
|
||||||
|
// Exception pointers for an exception crash.
|
||||||
|
EXCEPTION_POINTERS* exception_pointers_;
|
||||||
|
|
||||||
|
// Assertion info for an invalid parameter or pure call crash.
|
||||||
|
MDRawAssertionInfo assert_info_;
|
||||||
|
|
||||||
|
// Disable copy ctor and operator=.
|
||||||
|
CrashGenerationClient(const CrashGenerationClient& crash_client);
|
||||||
|
CrashGenerationClient& operator=(const CrashGenerationClient& crash_client);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,522 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// ExceptionHandler can write a minidump file when an exception occurs,
|
||||||
|
// or when WriteMinidump() is called explicitly by your program.
|
||||||
|
//
|
||||||
|
// To have the exception handler write minidumps when an uncaught exception
|
||||||
|
// (crash) occurs, you should create an instance early in the execution
|
||||||
|
// of your program, and keep it around for the entire time you want to
|
||||||
|
// have crash handling active (typically, until shutdown).
|
||||||
|
//
|
||||||
|
// If you want to write minidumps without installing the exception handler,
|
||||||
|
// you can create an ExceptionHandler with install_handler set to false,
|
||||||
|
// then call WriteMinidump. You can also use this technique if you want to
|
||||||
|
// use different minidump callbacks for different call sites.
|
||||||
|
//
|
||||||
|
// In either case, a callback function is called when a minidump is written,
|
||||||
|
// which receives the unqiue id of the minidump. The caller can use this
|
||||||
|
// id to collect and write additional application state, and to launch an
|
||||||
|
// external crash-reporting application.
|
||||||
|
//
|
||||||
|
// It is important that creation and destruction of ExceptionHandler objects
|
||||||
|
// be nested cleanly, when using install_handler = true.
|
||||||
|
// Avoid the following pattern:
|
||||||
|
// ExceptionHandler *e = new ExceptionHandler(...);
|
||||||
|
// ExceptionHandler *f = new ExceptionHandler(...);
|
||||||
|
// delete e;
|
||||||
|
// This will put the exception filter stack into an inconsistent state.
|
||||||
|
|
||||||
|
#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__
|
||||||
|
#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dbghelp.h>
|
||||||
|
#include <rpc.h>
|
||||||
|
|
||||||
|
#pragma warning(push)
|
||||||
|
// Disable exception handler warnings.
|
||||||
|
#pragma warning(disable:4530)
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "client/windows/common/ipc_protocol.h"
|
||||||
|
#include "client/windows/crash_generation/crash_generation_client.h"
|
||||||
|
#include "common/scoped_ptr.h"
|
||||||
|
#include "google_breakpad/common/minidump_format.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
using std::vector;
|
||||||
|
using std::wstring;
|
||||||
|
|
||||||
|
// These entries store a list of memory regions that the client wants included
|
||||||
|
// in the minidump.
|
||||||
|
struct AppMemory {
|
||||||
|
ULONG64 ptr;
|
||||||
|
ULONG length;
|
||||||
|
|
||||||
|
bool operator==(const struct AppMemory& other) const {
|
||||||
|
return ptr == other.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const void* other) const {
|
||||||
|
return ptr == reinterpret_cast<ULONG64>(other);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef std::list<AppMemory> AppMemoryList;
|
||||||
|
|
||||||
|
class ExceptionHandler {
|
||||||
|
public:
|
||||||
|
// A callback function to run before Breakpad performs any substantial
|
||||||
|
// processing of an exception. A FilterCallback is called before writing
|
||||||
|
// a minidump. context is the parameter supplied by the user as
|
||||||
|
// callback_context when the handler was created. exinfo points to the
|
||||||
|
// exception record, if any; assertion points to assertion information,
|
||||||
|
// if any.
|
||||||
|
//
|
||||||
|
// If a FilterCallback returns true, Breakpad will continue processing,
|
||||||
|
// attempting to write a minidump. If a FilterCallback returns false,
|
||||||
|
// Breakpad will immediately report the exception as unhandled without
|
||||||
|
// writing a minidump, allowing another handler the opportunity to handle it.
|
||||||
|
typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo,
|
||||||
|
MDRawAssertionInfo* assertion);
|
||||||
|
|
||||||
|
// A callback function to run after the minidump has been written.
|
||||||
|
// minidump_id is a unique id for the dump, so the minidump
|
||||||
|
// file is <dump_path>\<minidump_id>.dmp. context is the parameter supplied
|
||||||
|
// by the user as callback_context when the handler was created. exinfo
|
||||||
|
// points to the exception record, or NULL if no exception occurred.
|
||||||
|
// succeeded indicates whether a minidump file was successfully written.
|
||||||
|
// assertion points to information about an assertion if the handler was
|
||||||
|
// invoked by an assertion.
|
||||||
|
//
|
||||||
|
// If an exception occurred and the callback returns true, Breakpad will treat
|
||||||
|
// the exception as fully-handled, suppressing any other handlers from being
|
||||||
|
// notified of the exception. If the callback returns false, Breakpad will
|
||||||
|
// treat the exception as unhandled, and allow another handler to handle it.
|
||||||
|
// If there are no other handlers, Breakpad will report the exception to the
|
||||||
|
// system as unhandled, allowing a debugger or native crash dialog the
|
||||||
|
// opportunity to handle the exception. Most callback implementations
|
||||||
|
// should normally return the value of |succeeded|, or when they wish to
|
||||||
|
// not report an exception of handled, false. Callbacks will rarely want to
|
||||||
|
// return true directly (unless |succeeded| is true).
|
||||||
|
//
|
||||||
|
// For out-of-process dump generation, dump path and minidump ID will always
|
||||||
|
// be NULL. In case of out-of-process dump generation, the dump path and
|
||||||
|
// minidump id are controlled by the server process and are not communicated
|
||||||
|
// back to the crashing process.
|
||||||
|
typedef bool (*MinidumpCallback)(const wchar_t* dump_path,
|
||||||
|
const wchar_t* minidump_id,
|
||||||
|
void* context,
|
||||||
|
EXCEPTION_POINTERS* exinfo,
|
||||||
|
MDRawAssertionInfo* assertion,
|
||||||
|
bool succeeded);
|
||||||
|
|
||||||
|
// HandlerType specifies which types of handlers should be installed, if
|
||||||
|
// any. Use HANDLER_NONE for an ExceptionHandler that remains idle,
|
||||||
|
// without catching any failures on its own. This type of handler may
|
||||||
|
// still be triggered by calling WriteMinidump. Otherwise, use a
|
||||||
|
// combination of the other HANDLER_ values, or HANDLER_ALL to install
|
||||||
|
// all handlers.
|
||||||
|
enum HandlerType {
|
||||||
|
HANDLER_NONE = 0,
|
||||||
|
HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter
|
||||||
|
HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler
|
||||||
|
HANDLER_PURECALL = 1 << 2, // _set_purecall_handler
|
||||||
|
HANDLER_ALL = HANDLER_EXCEPTION |
|
||||||
|
HANDLER_INVALID_PARAMETER |
|
||||||
|
HANDLER_PURECALL
|
||||||
|
};
|
||||||
|
|
||||||
|
// Creates a new ExceptionHandler instance to handle writing minidumps.
|
||||||
|
// Before writing a minidump, the optional filter callback will be called.
|
||||||
|
// Its return value determines whether or not Breakpad should write a
|
||||||
|
// minidump. Minidump files will be written to dump_path, and the optional
|
||||||
|
// callback is called after writing the dump file, as described above.
|
||||||
|
// handler_types specifies the types of handlers that should be installed.
|
||||||
|
ExceptionHandler(const wstring& dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
int handler_types);
|
||||||
|
|
||||||
|
// Creates a new ExceptionHandler instance that can attempt to perform
|
||||||
|
// out-of-process dump generation if pipe_name is not NULL. If pipe_name is
|
||||||
|
// NULL, or if out-of-process dump generation registration step fails,
|
||||||
|
// in-process dump generation will be used. This also allows specifying
|
||||||
|
// the dump type to generate.
|
||||||
|
ExceptionHandler(const wstring& dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
int handler_types,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const wchar_t* pipe_name,
|
||||||
|
const CustomClientInfo* custom_info);
|
||||||
|
|
||||||
|
// As above, creates a new ExceptionHandler instance to perform
|
||||||
|
// out-of-process dump generation if the given pipe_handle is not NULL.
|
||||||
|
ExceptionHandler(const wstring& dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
int handler_types,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
HANDLE pipe_handle,
|
||||||
|
const CustomClientInfo* custom_info);
|
||||||
|
|
||||||
|
// ExceptionHandler that ENSURES out-of-process dump generation. Expects a
|
||||||
|
// crash generation client that is already registered with a crash generation
|
||||||
|
// server. Takes ownership of the passed-in crash_generation_client.
|
||||||
|
//
|
||||||
|
// Usage example:
|
||||||
|
// crash_generation_client = new CrashGenerationClient(..);
|
||||||
|
// if (crash_generation_client->Register()) {
|
||||||
|
// // Registration with the crash generation server succeeded.
|
||||||
|
// // Out-of-process dump generation is guaranteed.
|
||||||
|
// g_handler = new ExceptionHandler(.., crash_generation_client, ..);
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
ExceptionHandler(const wstring& dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
int handler_types,
|
||||||
|
CrashGenerationClient* crash_generation_client);
|
||||||
|
|
||||||
|
~ExceptionHandler();
|
||||||
|
|
||||||
|
// Get and set the minidump path.
|
||||||
|
wstring dump_path() const { return dump_path_; }
|
||||||
|
void set_dump_path(const wstring &dump_path) {
|
||||||
|
dump_path_ = dump_path;
|
||||||
|
dump_path_c_ = dump_path_.c_str();
|
||||||
|
UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Requests that a previously reported crash be uploaded.
|
||||||
|
bool RequestUpload(DWORD crash_id);
|
||||||
|
|
||||||
|
// Writes a minidump immediately. This can be used to capture the
|
||||||
|
// execution state independently of a crash. Returns true on success.
|
||||||
|
bool WriteMinidump();
|
||||||
|
|
||||||
|
// Writes a minidump immediately, with the user-supplied exception
|
||||||
|
// information.
|
||||||
|
bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo);
|
||||||
|
|
||||||
|
// Convenience form of WriteMinidump which does not require an
|
||||||
|
// ExceptionHandler instance.
|
||||||
|
static bool WriteMinidump(const wstring &dump_path,
|
||||||
|
MinidumpCallback callback, void* callback_context);
|
||||||
|
|
||||||
|
// Write a minidump of |child| immediately. This can be used to
|
||||||
|
// capture the execution state of |child| independently of a crash.
|
||||||
|
// Pass a meaningful |child_blamed_thread| to make that thread in
|
||||||
|
// the child process the one from which a crash signature is
|
||||||
|
// extracted.
|
||||||
|
static bool WriteMinidumpForChild(HANDLE child,
|
||||||
|
DWORD child_blamed_thread,
|
||||||
|
const wstring& dump_path,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context);
|
||||||
|
|
||||||
|
// Get the thread ID of the thread requesting the dump (either the exception
|
||||||
|
// thread or any other thread that called WriteMinidump directly). This
|
||||||
|
// may be useful if you want to include additional thread state in your
|
||||||
|
// dumps.
|
||||||
|
DWORD get_requesting_thread_id() const { return requesting_thread_id_; }
|
||||||
|
|
||||||
|
// Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP.
|
||||||
|
bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; }
|
||||||
|
void set_handle_debug_exceptions(bool handle_debug_exceptions) {
|
||||||
|
handle_debug_exceptions_ = handle_debug_exceptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Controls behavior of EXCEPTION_INVALID_HANDLE.
|
||||||
|
bool get_consume_invalid_handle_exceptions() const {
|
||||||
|
return consume_invalid_handle_exceptions_;
|
||||||
|
}
|
||||||
|
void set_consume_invalid_handle_exceptions(
|
||||||
|
bool consume_invalid_handle_exceptions) {
|
||||||
|
consume_invalid_handle_exceptions_ = consume_invalid_handle_exceptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns whether out-of-process dump generation is used or not.
|
||||||
|
bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; }
|
||||||
|
|
||||||
|
// Calling RegisterAppMemory(p, len) causes len bytes starting
|
||||||
|
// at address p to be copied to the minidump when a crash happens.
|
||||||
|
void RegisterAppMemory(void* ptr, size_t length);
|
||||||
|
void UnregisterAppMemory(void* ptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class AutoExceptionHandler;
|
||||||
|
|
||||||
|
// Initializes the instance with given values.
|
||||||
|
void Initialize(const wstring& dump_path,
|
||||||
|
FilterCallback filter,
|
||||||
|
MinidumpCallback callback,
|
||||||
|
void* callback_context,
|
||||||
|
int handler_types,
|
||||||
|
MINIDUMP_TYPE dump_type,
|
||||||
|
const wchar_t* pipe_name,
|
||||||
|
HANDLE pipe_handle,
|
||||||
|
CrashGenerationClient* crash_generation_client,
|
||||||
|
const CustomClientInfo* custom_info);
|
||||||
|
|
||||||
|
// Function pointer type for MiniDumpWriteDump, which is looked up
|
||||||
|
// dynamically.
|
||||||
|
typedef BOOL (WINAPI *MiniDumpWriteDump_type)(
|
||||||
|
HANDLE hProcess,
|
||||||
|
DWORD dwPid,
|
||||||
|
HANDLE hFile,
|
||||||
|
MINIDUMP_TYPE DumpType,
|
||||||
|
CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
|
||||||
|
CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
|
||||||
|
CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
|
||||||
|
|
||||||
|
// Function pointer type for UuidCreate, which is looked up dynamically.
|
||||||
|
typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid);
|
||||||
|
|
||||||
|
// Runs the main loop for the exception handler thread.
|
||||||
|
static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter);
|
||||||
|
|
||||||
|
// Called on the exception thread when an unhandled exception occurs.
|
||||||
|
// Signals the exception handler thread to handle the exception.
|
||||||
|
static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo);
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||||
|
// This function will be called by some CRT functions when they detect
|
||||||
|
// that they were passed an invalid parameter. Note that in _DEBUG builds,
|
||||||
|
// the CRT may display an assertion dialog before calling this function,
|
||||||
|
// and the function will not be called unless the assertion dialog is
|
||||||
|
// dismissed by clicking "Ignore."
|
||||||
|
static void HandleInvalidParameter(const wchar_t* expression,
|
||||||
|
const wchar_t* function,
|
||||||
|
const wchar_t* file,
|
||||||
|
unsigned int line,
|
||||||
|
uintptr_t reserved);
|
||||||
|
#endif // _MSC_VER >= 1400
|
||||||
|
|
||||||
|
// This function will be called by the CRT when a pure virtual
|
||||||
|
// function is called.
|
||||||
|
static void HandlePureVirtualCall();
|
||||||
|
|
||||||
|
// This is called on the exception thread or on another thread that
|
||||||
|
// the user wishes to produce a dump from. It calls
|
||||||
|
// WriteMinidumpWithException on the handler thread, avoiding stack
|
||||||
|
// overflows and inconsistent dumps due to writing the dump from
|
||||||
|
// the exception thread. If the dump is requested as a result of an
|
||||||
|
// exception, exinfo contains exception information, otherwise, it
|
||||||
|
// is NULL. If the dump is requested as a result of an assertion
|
||||||
|
// (such as an invalid parameter being passed to a CRT function),
|
||||||
|
// assertion contains data about the assertion, otherwise, it is NULL.
|
||||||
|
bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo,
|
||||||
|
MDRawAssertionInfo* assertion);
|
||||||
|
|
||||||
|
// This function is called on the handler thread. It calls into
|
||||||
|
// WriteMinidumpWithExceptionForProcess() with a handle to the
|
||||||
|
// current process. requesting_thread_id is the ID of the thread
|
||||||
|
// that requested the dump. If the dump is requested as a result of
|
||||||
|
// an exception, exinfo contains exception information, otherwise,
|
||||||
|
// it is NULL.
|
||||||
|
bool WriteMinidumpWithException(DWORD requesting_thread_id,
|
||||||
|
EXCEPTION_POINTERS* exinfo,
|
||||||
|
MDRawAssertionInfo* assertion);
|
||||||
|
|
||||||
|
// This function is used as a callback when calling MinidumpWriteDump,
|
||||||
|
// in order to add additional memory regions to the dump.
|
||||||
|
static BOOL CALLBACK MinidumpWriteDumpCallback(
|
||||||
|
PVOID context,
|
||||||
|
const PMINIDUMP_CALLBACK_INPUT callback_input,
|
||||||
|
PMINIDUMP_CALLBACK_OUTPUT callback_output);
|
||||||
|
|
||||||
|
// This function does the actual writing of a minidump. It is
|
||||||
|
// called on the handler thread. requesting_thread_id is the ID of
|
||||||
|
// the thread that requested the dump, if that information is
|
||||||
|
// meaningful. If the dump is requested as a result of an
|
||||||
|
// exception, exinfo contains exception information, otherwise, it
|
||||||
|
// is NULL. process is the one that will be dumped. If
|
||||||
|
// requesting_thread_id is meaningful and should be added to the
|
||||||
|
// minidump, write_requester_stream is |true|.
|
||||||
|
bool WriteMinidumpWithExceptionForProcess(DWORD requesting_thread_id,
|
||||||
|
EXCEPTION_POINTERS* exinfo,
|
||||||
|
MDRawAssertionInfo* assertion,
|
||||||
|
HANDLE process,
|
||||||
|
bool write_requester_stream);
|
||||||
|
|
||||||
|
// Generates a new ID and stores it in next_minidump_id_, and stores the
|
||||||
|
// path of the next minidump to be written in next_minidump_path_.
|
||||||
|
void UpdateNextID();
|
||||||
|
|
||||||
|
FilterCallback filter_;
|
||||||
|
MinidumpCallback callback_;
|
||||||
|
void* callback_context_;
|
||||||
|
|
||||||
|
scoped_ptr<CrashGenerationClient> crash_generation_client_;
|
||||||
|
|
||||||
|
// The directory in which a minidump will be written, set by the dump_path
|
||||||
|
// argument to the constructor, or set_dump_path.
|
||||||
|
wstring dump_path_;
|
||||||
|
|
||||||
|
// The basename of the next minidump to be written, without the extension.
|
||||||
|
wstring next_minidump_id_;
|
||||||
|
|
||||||
|
// The full pathname of the next minidump to be written, including the file
|
||||||
|
// extension.
|
||||||
|
wstring next_minidump_path_;
|
||||||
|
|
||||||
|
// Pointers to C-string representations of the above. These are set when
|
||||||
|
// the above wstring versions are set in order to avoid calling c_str during
|
||||||
|
// an exception, as c_str may attempt to allocate heap memory. These
|
||||||
|
// pointers are not owned by the ExceptionHandler object, but their lifetimes
|
||||||
|
// should be equivalent to the lifetimes of the associated wstring, provided
|
||||||
|
// that the wstrings are not altered.
|
||||||
|
const wchar_t* dump_path_c_;
|
||||||
|
const wchar_t* next_minidump_id_c_;
|
||||||
|
const wchar_t* next_minidump_path_c_;
|
||||||
|
|
||||||
|
HMODULE dbghelp_module_;
|
||||||
|
MiniDumpWriteDump_type minidump_write_dump_;
|
||||||
|
MINIDUMP_TYPE dump_type_;
|
||||||
|
|
||||||
|
HMODULE rpcrt4_module_;
|
||||||
|
UuidCreate_type uuid_create_;
|
||||||
|
|
||||||
|
// Tracks the handler types that were installed according to the
|
||||||
|
// handler_types constructor argument.
|
||||||
|
int handler_types_;
|
||||||
|
|
||||||
|
// When installed_handler_ is true, previous_filter_ is the unhandled
|
||||||
|
// exception filter that was set prior to installing ExceptionHandler as
|
||||||
|
// the unhandled exception filter and pointing it to |this|. NULL indicates
|
||||||
|
// that there is no previous unhandled exception filter.
|
||||||
|
LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_;
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||||
|
// Beginning in VC 8, the CRT provides an invalid parameter handler that will
|
||||||
|
// be called when some CRT functions are passed invalid parameters. In
|
||||||
|
// earlier CRTs, the same conditions would cause unexpected behavior or
|
||||||
|
// crashes.
|
||||||
|
_invalid_parameter_handler previous_iph_;
|
||||||
|
#endif // _MSC_VER >= 1400
|
||||||
|
|
||||||
|
// The CRT allows you to override the default handler for pure
|
||||||
|
// virtual function calls.
|
||||||
|
_purecall_handler previous_pch_;
|
||||||
|
|
||||||
|
// The exception handler thread.
|
||||||
|
HANDLE handler_thread_;
|
||||||
|
|
||||||
|
// True if the exception handler is being destroyed.
|
||||||
|
// Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars.
|
||||||
|
// It has release semantics on write and acquire semantics on reads.
|
||||||
|
// See the msdn documentation.
|
||||||
|
volatile bool is_shutdown_;
|
||||||
|
|
||||||
|
// The critical section enforcing the requirement that only one exception be
|
||||||
|
// handled by a handler at a time.
|
||||||
|
CRITICAL_SECTION handler_critical_section_;
|
||||||
|
|
||||||
|
// Semaphores used to move exception handling between the exception thread
|
||||||
|
// and the handler thread. handler_start_semaphore_ is signalled by the
|
||||||
|
// exception thread to wake up the handler thread when an exception occurs.
|
||||||
|
// handler_finish_semaphore_ is signalled by the handler thread to wake up
|
||||||
|
// the exception thread when handling is complete.
|
||||||
|
HANDLE handler_start_semaphore_;
|
||||||
|
HANDLE handler_finish_semaphore_;
|
||||||
|
|
||||||
|
// The next 2 fields contain data passed from the requesting thread to
|
||||||
|
// the handler thread.
|
||||||
|
|
||||||
|
// The thread ID of the thread requesting the dump (either the exception
|
||||||
|
// thread or any other thread that called WriteMinidump directly).
|
||||||
|
DWORD requesting_thread_id_;
|
||||||
|
|
||||||
|
// The exception info passed to the exception handler on the exception
|
||||||
|
// thread, if an exception occurred. NULL for user-requested dumps.
|
||||||
|
EXCEPTION_POINTERS* exception_info_;
|
||||||
|
|
||||||
|
// If the handler is invoked due to an assertion, this will contain a
|
||||||
|
// pointer to the assertion information. It is NULL at other times.
|
||||||
|
MDRawAssertionInfo* assertion_;
|
||||||
|
|
||||||
|
// The return value of the handler, passed from the handler thread back to
|
||||||
|
// the requesting thread.
|
||||||
|
bool handler_return_value_;
|
||||||
|
|
||||||
|
// If true, the handler will intercept EXCEPTION_BREAKPOINT and
|
||||||
|
// EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default)
|
||||||
|
// to not interfere with debuggers.
|
||||||
|
bool handle_debug_exceptions_;
|
||||||
|
|
||||||
|
// If true, the handler will consume any EXCEPTION_INVALID_HANDLE exceptions.
|
||||||
|
// Leave this false (the default) to handle these exceptions as normal.
|
||||||
|
bool consume_invalid_handle_exceptions_;
|
||||||
|
|
||||||
|
// Callers can request additional memory regions to be included in
|
||||||
|
// the dump.
|
||||||
|
AppMemoryList app_memory_info_;
|
||||||
|
|
||||||
|
// A stack of ExceptionHandler objects that have installed unhandled
|
||||||
|
// exception filters. This vector is used by HandleException to determine
|
||||||
|
// which ExceptionHandler object to route an exception to. When an
|
||||||
|
// ExceptionHandler is created with install_handler true, it will append
|
||||||
|
// itself to this list.
|
||||||
|
static vector<ExceptionHandler*>* handler_stack_;
|
||||||
|
|
||||||
|
// The index of the ExceptionHandler in handler_stack_ that will handle the
|
||||||
|
// next exception. Note that 0 means the last entry in handler_stack_, 1
|
||||||
|
// means the next-to-last entry, and so on. This is used by HandleException
|
||||||
|
// to support multiple stacked Breakpad handlers.
|
||||||
|
static LONG handler_stack_index_;
|
||||||
|
|
||||||
|
// handler_stack_critical_section_ guards operations on handler_stack_ and
|
||||||
|
// handler_stack_index_. The critical section is initialized by the
|
||||||
|
// first instance of the class and destroyed by the last instance of it.
|
||||||
|
static CRITICAL_SECTION handler_stack_critical_section_;
|
||||||
|
|
||||||
|
// The number of instances of this class.
|
||||||
|
static volatile LONG instance_count_;
|
||||||
|
|
||||||
|
// disallow copy ctor and operator=
|
||||||
|
explicit ExceptionHandler(const ExceptionHandler &);
|
||||||
|
void operator=(const ExceptionHandler &);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#pragma warning(pop)
|
||||||
|
|
||||||
|
#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__
|
|
@ -0,0 +1,404 @@
|
||||||
|
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// Scopers help you manage ownership of a pointer, helping you easily manage the
|
||||||
|
// a pointer within a scope, and automatically destroying the pointer at the
|
||||||
|
// end of a scope. There are two main classes you will use, which correspond
|
||||||
|
// to the operators new/delete and new[]/delete[].
|
||||||
|
//
|
||||||
|
// Example usage (scoped_ptr):
|
||||||
|
// {
|
||||||
|
// scoped_ptr<Foo> foo(new Foo("wee"));
|
||||||
|
// } // foo goes out of scope, releasing the pointer with it.
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// scoped_ptr<Foo> foo; // No pointer managed.
|
||||||
|
// foo.reset(new Foo("wee")); // Now a pointer is managed.
|
||||||
|
// foo.reset(new Foo("wee2")); // Foo("wee") was destroyed.
|
||||||
|
// foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed.
|
||||||
|
// foo->Method(); // Foo::Method() called.
|
||||||
|
// foo.get()->Method(); // Foo::Method() called.
|
||||||
|
// SomeFunc(foo.release()); // SomeFunc takes ownership, foo no longer
|
||||||
|
// // manages a pointer.
|
||||||
|
// foo.reset(new Foo("wee4")); // foo manages a pointer again.
|
||||||
|
// foo.reset(); // Foo("wee4") destroyed, foo no longer
|
||||||
|
// // manages a pointer.
|
||||||
|
// } // foo wasn't managing a pointer, so nothing was destroyed.
|
||||||
|
//
|
||||||
|
// Example usage (scoped_array):
|
||||||
|
// {
|
||||||
|
// scoped_array<Foo> foo(new Foo[100]);
|
||||||
|
// foo.get()->Method(); // Foo::Method on the 0th element.
|
||||||
|
// foo[10].Method(); // Foo::Method on the 10th element.
|
||||||
|
// }
|
||||||
|
|
||||||
|
#ifndef COMMON_SCOPED_PTR_H_
|
||||||
|
#define COMMON_SCOPED_PTR_H_
|
||||||
|
|
||||||
|
// This is an implementation designed to match the anticipated future TR2
|
||||||
|
// implementation of the scoped_ptr class, and its closely-related brethren,
|
||||||
|
// scoped_array, scoped_ptr_malloc.
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
|
||||||
|
// automatically deletes the pointer it holds (if any).
|
||||||
|
// That is, scoped_ptr<T> owns the T object that it points to.
|
||||||
|
// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
|
||||||
|
// Also like T*, scoped_ptr<T> is thread-compatible, and once you
|
||||||
|
// dereference it, you get the threadsafety guarantees of T.
|
||||||
|
//
|
||||||
|
// The size of a scoped_ptr is small:
|
||||||
|
// sizeof(scoped_ptr<C>) == sizeof(C*)
|
||||||
|
template <class C>
|
||||||
|
class scoped_ptr {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// The element type
|
||||||
|
typedef C element_type;
|
||||||
|
|
||||||
|
// Constructor. Defaults to initializing with NULL.
|
||||||
|
// There is no way to create an uninitialized scoped_ptr.
|
||||||
|
// The input parameter must be allocated with new.
|
||||||
|
explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
|
||||||
|
|
||||||
|
// Destructor. If there is a C object, delete it.
|
||||||
|
// We don't need to test ptr_ == NULL because C++ does that for us.
|
||||||
|
~scoped_ptr() {
|
||||||
|
enum { type_must_be_complete = sizeof(C) };
|
||||||
|
delete ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset. Deletes the current owned object, if any.
|
||||||
|
// Then takes ownership of a new object, if given.
|
||||||
|
// this->reset(this->get()) works.
|
||||||
|
void reset(C* p = NULL) {
|
||||||
|
if (p != ptr_) {
|
||||||
|
enum { type_must_be_complete = sizeof(C) };
|
||||||
|
delete ptr_;
|
||||||
|
ptr_ = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors to get the owned object.
|
||||||
|
// operator* and operator-> will assert() if there is no current object.
|
||||||
|
C& operator*() const {
|
||||||
|
assert(ptr_ != NULL);
|
||||||
|
return *ptr_;
|
||||||
|
}
|
||||||
|
C* operator->() const {
|
||||||
|
assert(ptr_ != NULL);
|
||||||
|
return ptr_;
|
||||||
|
}
|
||||||
|
C* get() const { return ptr_; }
|
||||||
|
|
||||||
|
// Comparison operators.
|
||||||
|
// These return whether two scoped_ptr refer to the same object, not just to
|
||||||
|
// two different but equal objects.
|
||||||
|
bool operator==(C* p) const { return ptr_ == p; }
|
||||||
|
bool operator!=(C* p) const { return ptr_ != p; }
|
||||||
|
|
||||||
|
// Swap two scoped pointers.
|
||||||
|
void swap(scoped_ptr& p2) {
|
||||||
|
C* tmp = ptr_;
|
||||||
|
ptr_ = p2.ptr_;
|
||||||
|
p2.ptr_ = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release a pointer.
|
||||||
|
// The return value is the current pointer held by this object.
|
||||||
|
// If this object holds a NULL pointer, the return value is NULL.
|
||||||
|
// After this operation, this object will hold a NULL pointer,
|
||||||
|
// and will not own the object any more.
|
||||||
|
C* release() {
|
||||||
|
C* retVal = ptr_;
|
||||||
|
ptr_ = NULL;
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
C* ptr_;
|
||||||
|
|
||||||
|
// Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't
|
||||||
|
// make sense, and if C2 == C, it still doesn't make sense because you should
|
||||||
|
// never have the same object owned by two different scoped_ptrs.
|
||||||
|
template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
|
||||||
|
template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
|
||||||
|
|
||||||
|
// Disallow evil constructors
|
||||||
|
scoped_ptr(const scoped_ptr&);
|
||||||
|
void operator=(const scoped_ptr&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Free functions
|
||||||
|
template <class C>
|
||||||
|
void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
|
||||||
|
p1.swap(p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
bool operator==(C* p1, const scoped_ptr<C>& p2) {
|
||||||
|
return p1 == p2.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
bool operator!=(C* p1, const scoped_ptr<C>& p2) {
|
||||||
|
return p1 != p2.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
|
||||||
|
// with new [] and the destructor deletes objects with delete [].
|
||||||
|
//
|
||||||
|
// As with scoped_ptr<C>, a scoped_array<C> either points to an object
|
||||||
|
// or is NULL. A scoped_array<C> owns the object that it points to.
|
||||||
|
// scoped_array<T> is thread-compatible, and once you index into it,
|
||||||
|
// the returned objects have only the threadsafety guarantees of T.
|
||||||
|
//
|
||||||
|
// Size: sizeof(scoped_array<C>) == sizeof(C*)
|
||||||
|
template <class C>
|
||||||
|
class scoped_array {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// The element type
|
||||||
|
typedef C element_type;
|
||||||
|
|
||||||
|
// Constructor. Defaults to intializing with NULL.
|
||||||
|
// There is no way to create an uninitialized scoped_array.
|
||||||
|
// The input parameter must be allocated with new [].
|
||||||
|
explicit scoped_array(C* p = NULL) : array_(p) { }
|
||||||
|
|
||||||
|
// Destructor. If there is a C object, delete it.
|
||||||
|
// We don't need to test ptr_ == NULL because C++ does that for us.
|
||||||
|
~scoped_array() {
|
||||||
|
enum { type_must_be_complete = sizeof(C) };
|
||||||
|
delete[] array_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset. Deletes the current owned object, if any.
|
||||||
|
// Then takes ownership of a new object, if given.
|
||||||
|
// this->reset(this->get()) works.
|
||||||
|
void reset(C* p = NULL) {
|
||||||
|
if (p != array_) {
|
||||||
|
enum { type_must_be_complete = sizeof(C) };
|
||||||
|
delete[] array_;
|
||||||
|
array_ = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get one element of the current object.
|
||||||
|
// Will assert() if there is no current object, or index i is negative.
|
||||||
|
C& operator[](ptrdiff_t i) const {
|
||||||
|
assert(i >= 0);
|
||||||
|
assert(array_ != NULL);
|
||||||
|
return array_[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a pointer to the zeroth element of the current object.
|
||||||
|
// If there is no current object, return NULL.
|
||||||
|
C* get() const {
|
||||||
|
return array_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comparison operators.
|
||||||
|
// These return whether two scoped_array refer to the same object, not just to
|
||||||
|
// two different but equal objects.
|
||||||
|
bool operator==(C* p) const { return array_ == p; }
|
||||||
|
bool operator!=(C* p) const { return array_ != p; }
|
||||||
|
|
||||||
|
// Swap two scoped arrays.
|
||||||
|
void swap(scoped_array& p2) {
|
||||||
|
C* tmp = array_;
|
||||||
|
array_ = p2.array_;
|
||||||
|
p2.array_ = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release an array.
|
||||||
|
// The return value is the current pointer held by this object.
|
||||||
|
// If this object holds a NULL pointer, the return value is NULL.
|
||||||
|
// After this operation, this object will hold a NULL pointer,
|
||||||
|
// and will not own the object any more.
|
||||||
|
C* release() {
|
||||||
|
C* retVal = array_;
|
||||||
|
array_ = NULL;
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
C* array_;
|
||||||
|
|
||||||
|
// Forbid comparison of different scoped_array types.
|
||||||
|
template <class C2> bool operator==(scoped_array<C2> const& p2) const;
|
||||||
|
template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
|
||||||
|
|
||||||
|
// Disallow evil constructors
|
||||||
|
scoped_array(const scoped_array&);
|
||||||
|
void operator=(const scoped_array&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Free functions
|
||||||
|
template <class C>
|
||||||
|
void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
|
||||||
|
p1.swap(p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
bool operator==(C* p1, const scoped_array<C>& p2) {
|
||||||
|
return p1 == p2.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
bool operator!=(C* p1, const scoped_array<C>& p2) {
|
||||||
|
return p1 != p2.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This class wraps the c library function free() in a class that can be
|
||||||
|
// passed as a template argument to scoped_ptr_malloc below.
|
||||||
|
class ScopedPtrMallocFree {
|
||||||
|
public:
|
||||||
|
inline void operator()(void* x) const {
|
||||||
|
free(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
|
||||||
|
// second template argument, the functor used to free the object.
|
||||||
|
|
||||||
|
template<class C, class FreeProc = ScopedPtrMallocFree>
|
||||||
|
class scoped_ptr_malloc {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// The element type
|
||||||
|
typedef C element_type;
|
||||||
|
|
||||||
|
// Constructor. Defaults to initializing with NULL.
|
||||||
|
// There is no way to create an uninitialized scoped_ptr.
|
||||||
|
// The input parameter must be allocated with an allocator that matches the
|
||||||
|
// Free functor. For the default Free functor, this is malloc, calloc, or
|
||||||
|
// realloc.
|
||||||
|
explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {}
|
||||||
|
|
||||||
|
// Destructor. If there is a C object, call the Free functor.
|
||||||
|
~scoped_ptr_malloc() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset. Calls the Free functor on the current owned object, if any.
|
||||||
|
// Then takes ownership of a new object, if given.
|
||||||
|
// this->reset(this->get()) works.
|
||||||
|
void reset(C* p = NULL) {
|
||||||
|
if (ptr_ != p) {
|
||||||
|
FreeProc free_proc;
|
||||||
|
free_proc(ptr_);
|
||||||
|
ptr_ = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object.
|
||||||
|
// operator* and operator-> will cause an assert() failure if there is
|
||||||
|
// no current object.
|
||||||
|
C& operator*() const {
|
||||||
|
assert(ptr_ != NULL);
|
||||||
|
return *ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
C* operator->() const {
|
||||||
|
assert(ptr_ != NULL);
|
||||||
|
return ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
C* get() const {
|
||||||
|
return ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comparison operators.
|
||||||
|
// These return whether a scoped_ptr_malloc and a plain pointer refer
|
||||||
|
// to the same object, not just to two different but equal objects.
|
||||||
|
// For compatibility with the boost-derived implementation, these
|
||||||
|
// take non-const arguments.
|
||||||
|
bool operator==(C* p) const {
|
||||||
|
return ptr_ == p;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(C* p) const {
|
||||||
|
return ptr_ != p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Swap two scoped pointers.
|
||||||
|
void swap(scoped_ptr_malloc & b) {
|
||||||
|
C* tmp = b.ptr_;
|
||||||
|
b.ptr_ = ptr_;
|
||||||
|
ptr_ = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release a pointer.
|
||||||
|
// The return value is the current pointer held by this object.
|
||||||
|
// If this object holds a NULL pointer, the return value is NULL.
|
||||||
|
// After this operation, this object will hold a NULL pointer,
|
||||||
|
// and will not own the object any more.
|
||||||
|
C* release() {
|
||||||
|
C* tmp = ptr_;
|
||||||
|
ptr_ = NULL;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
C* ptr_;
|
||||||
|
|
||||||
|
// no reason to use these: each scoped_ptr_malloc should have its own object
|
||||||
|
template <class C2, class GP>
|
||||||
|
bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
|
||||||
|
template <class C2, class GP>
|
||||||
|
bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
|
||||||
|
|
||||||
|
// Disallow evil constructors
|
||||||
|
scoped_ptr_malloc(const scoped_ptr_malloc&);
|
||||||
|
void operator=(const scoped_ptr_malloc&);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class C, class FP> inline
|
||||||
|
void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
|
||||||
|
a.swap(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class C, class FP> inline
|
||||||
|
bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
|
||||||
|
return p == b.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class C, class FP> inline
|
||||||
|
bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
|
||||||
|
return p != b.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // COMMON_SCOPED_PTR_H_
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// guid_string.cc: Convert GUIDs to strings.
|
||||||
|
//
|
||||||
|
// See guid_string.h for documentation.
|
||||||
|
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include "common/windows/string_utils-inl.h"
|
||||||
|
|
||||||
|
#include "common/windows/guid_string.h"
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
// static
|
||||||
|
wstring GUIDString::GUIDToWString(GUID *guid) {
|
||||||
|
wchar_t guid_string[37];
|
||||||
|
swprintf(
|
||||||
|
guid_string, sizeof(guid_string) / sizeof(guid_string[0]),
|
||||||
|
L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
|
guid->Data1, guid->Data2, guid->Data3,
|
||||||
|
guid->Data4[0], guid->Data4[1], guid->Data4[2],
|
||||||
|
guid->Data4[3], guid->Data4[4], guid->Data4[5],
|
||||||
|
guid->Data4[6], guid->Data4[7]);
|
||||||
|
|
||||||
|
// remove when VC++7.1 is no longer supported
|
||||||
|
guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0';
|
||||||
|
|
||||||
|
return wstring(guid_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
wstring GUIDString::GUIDToSymbolServerWString(GUID *guid) {
|
||||||
|
wchar_t guid_string[33];
|
||||||
|
swprintf(
|
||||||
|
guid_string, sizeof(guid_string) / sizeof(guid_string[0]),
|
||||||
|
L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
|
||||||
|
guid->Data1, guid->Data2, guid->Data3,
|
||||||
|
guid->Data4[0], guid->Data4[1], guid->Data4[2],
|
||||||
|
guid->Data4[3], guid->Data4[4], guid->Data4[5],
|
||||||
|
guid->Data4[6], guid->Data4[7]);
|
||||||
|
|
||||||
|
// remove when VC++7.1 is no longer supported
|
||||||
|
guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0';
|
||||||
|
|
||||||
|
return wstring(guid_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// guid_string.cc: Convert GUIDs to strings.
|
||||||
|
|
||||||
|
#ifndef COMMON_WINDOWS_GUID_STRING_H_
|
||||||
|
#define COMMON_WINDOWS_GUID_STRING_H_
|
||||||
|
|
||||||
|
#include <guiddef.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
using std::wstring;
|
||||||
|
|
||||||
|
class GUIDString {
|
||||||
|
public:
|
||||||
|
// Converts guid to a string in the format recommended by RFC 4122 and
|
||||||
|
// returns the string.
|
||||||
|
static wstring GUIDToWString(GUID *guid);
|
||||||
|
|
||||||
|
// Converts guid to a string formatted as uppercase hexadecimal, with
|
||||||
|
// no separators, and returns the string. This is the format used for
|
||||||
|
// symbol server identifiers, although identifiers have an age tacked
|
||||||
|
// on to the string.
|
||||||
|
static wstring GUIDToSymbolServerWString(GUID *guid);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // COMMON_WINDOWS_GUID_STRING_H_
|
|
@ -0,0 +1,142 @@
|
||||||
|
// Copyright (c) 2006, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// string_utils-inl.h: Safer string manipulation on Windows, supporting
|
||||||
|
// pre-MSVC8 environments.
|
||||||
|
|
||||||
|
#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H_
|
||||||
|
#define COMMON_WINDOWS_STRING_UTILS_INL_H_
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
// The "ll" printf format size specifier corresponding to |long long| was
|
||||||
|
// intrudced in MSVC8. Earlier versions did not provide this size specifier,
|
||||||
|
// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll"
|
||||||
|
// is available, in the event of oddball systems where |long long| is not
|
||||||
|
// 64 bits wide.
|
||||||
|
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||||
|
#define WIN_STRING_FORMAT_LL "ll"
|
||||||
|
#else // MSC_VER >= 1400
|
||||||
|
#define WIN_STRING_FORMAT_LL "I64"
|
||||||
|
#endif // MSC_VER >= 1400
|
||||||
|
|
||||||
|
// A nonconforming version of swprintf, without the length argument, was
|
||||||
|
// included with the CRT prior to MSVC8. Although a conforming version was
|
||||||
|
// also available via an overload, it is not reliably chosen. _snwprintf
|
||||||
|
// behaves as a standards-confirming swprintf should, so force the use of
|
||||||
|
// _snwprintf when using older CRTs.
|
||||||
|
#if _MSC_VER < 1400 // MSVC 2005/8
|
||||||
|
#define swprintf _snwprintf
|
||||||
|
#else
|
||||||
|
// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently,
|
||||||
|
// it takes the same argument list as swprintf.
|
||||||
|
#define swprintf swprintf_s
|
||||||
|
#endif // MSC_VER < 1400
|
||||||
|
|
||||||
|
namespace google_breakpad {
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::wstring;
|
||||||
|
|
||||||
|
class WindowsStringUtils {
|
||||||
|
public:
|
||||||
|
// Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does
|
||||||
|
// not fail if source is longer than destination_size. The destination
|
||||||
|
// buffer is always 0-terminated.
|
||||||
|
static void safe_wcscpy(wchar_t *destination, size_t destination_size,
|
||||||
|
const wchar_t *source);
|
||||||
|
|
||||||
|
// Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot
|
||||||
|
// be passed directly, and pre-MSVC8, this will not fail if source or count
|
||||||
|
// are longer than destination_size. The destination buffer is always
|
||||||
|
// 0-terminated.
|
||||||
|
static void safe_wcsncpy(wchar_t *destination, size_t destination_size,
|
||||||
|
const wchar_t *source, size_t count);
|
||||||
|
|
||||||
|
// Performs multi-byte to wide character conversion on C++ strings, using
|
||||||
|
// mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure,
|
||||||
|
// without setting wcs.
|
||||||
|
static bool safe_mbstowcs(const string &mbs, wstring *wcs);
|
||||||
|
|
||||||
|
// The inverse of safe_mbstowcs.
|
||||||
|
static bool safe_wcstombs(const wstring &wcs, string *mbs);
|
||||||
|
|
||||||
|
// Returns the base name of a file, e.g. strips off the path.
|
||||||
|
static wstring GetBaseName(const wstring &filename);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Disallow instantiation and other object-based operations.
|
||||||
|
WindowsStringUtils();
|
||||||
|
WindowsStringUtils(const WindowsStringUtils&);
|
||||||
|
~WindowsStringUtils();
|
||||||
|
void operator=(const WindowsStringUtils&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// static
|
||||||
|
inline void WindowsStringUtils::safe_wcscpy(wchar_t *destination,
|
||||||
|
size_t destination_size,
|
||||||
|
const wchar_t *source) {
|
||||||
|
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||||
|
wcscpy_s(destination, destination_size, source);
|
||||||
|
#else // _MSC_VER >= 1400
|
||||||
|
// Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy.
|
||||||
|
// wcsncpy doesn't 0-terminate the destination buffer if the source string
|
||||||
|
// is longer than size. Ensure that the destination is 0-terminated.
|
||||||
|
wcsncpy(destination, source, destination_size);
|
||||||
|
if (destination && destination_size)
|
||||||
|
destination[destination_size - 1] = 0;
|
||||||
|
#endif // _MSC_VER >= 1400
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination,
|
||||||
|
size_t destination_size,
|
||||||
|
const wchar_t *source,
|
||||||
|
size_t count) {
|
||||||
|
#if _MSC_VER >= 1400 // MSVC 2005/8
|
||||||
|
wcsncpy_s(destination, destination_size, source, count);
|
||||||
|
#else // _MSC_VER >= 1400
|
||||||
|
// Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy.
|
||||||
|
// wcsncpy doesn't 0-terminate the destination buffer if the source string
|
||||||
|
// is longer than size. Ensure that the destination is 0-terminated.
|
||||||
|
if (destination_size < count)
|
||||||
|
count = destination_size;
|
||||||
|
|
||||||
|
wcsncpy(destination, source, count);
|
||||||
|
if (destination && count)
|
||||||
|
destination[count - 1] = 0;
|
||||||
|
#endif // _MSC_VER >= 1400
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace google_breakpad
|
||||||
|
|
||||||
|
#endif // COMMON_WINDOWS_STRING_UTILS_INL_H_
|
|
@ -0,0 +1,68 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* breakpad_types.h: Precise-width types
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file ensures that types uintN_t are defined for N = 8, 16, 32, and
|
||||||
|
* 64. Types of precise widths are crucial to the task of writing data
|
||||||
|
* structures on one platform and reading them on another.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai */
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
|
||||||
|
|
||||||
|
#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && \
|
||||||
|
!defined(__STDC_FORMAT_MACROS)
|
||||||
|
#error "inttypes.h has already been included before this header file, but "
|
||||||
|
#error "without __STDC_FORMAT_MACROS defined."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STDC_FORMAT_MACROS
|
||||||
|
#define __STDC_FORMAT_MACROS
|
||||||
|
#endif /* __STDC_FORMAT_MACROS */
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t high;
|
||||||
|
uint64_t low;
|
||||||
|
} uint128_struct;
|
||||||
|
|
||||||
|
typedef uint64_t breakpad_time_t;
|
||||||
|
|
||||||
|
/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to
|
||||||
|
* llx, which is the format string for "long long" - this is a 64-bit
|
||||||
|
* integral type on many systems. */
|
||||||
|
#ifndef PRIx64
|
||||||
|
#define PRIx64 "llx"
|
||||||
|
#endif /* !PRIx64 */
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */
|
|
@ -0,0 +1,235 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on amd64. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by ensuring
|
||||||
|
* ensuring that all members are aligned on their natural boundaries. In
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Change to split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AMD64 support, see WINNT.H
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t control_word;
|
||||||
|
uint16_t status_word;
|
||||||
|
uint8_t tag_word;
|
||||||
|
uint8_t reserved1;
|
||||||
|
uint16_t error_opcode;
|
||||||
|
uint32_t error_offset;
|
||||||
|
uint16_t error_selector;
|
||||||
|
uint16_t reserved2;
|
||||||
|
uint32_t data_offset;
|
||||||
|
uint16_t data_selector;
|
||||||
|
uint16_t reserved3;
|
||||||
|
uint32_t mx_csr;
|
||||||
|
uint32_t mx_csr_mask;
|
||||||
|
uint128_struct float_registers[8];
|
||||||
|
uint128_struct xmm_registers[16];
|
||||||
|
uint8_t reserved4[96];
|
||||||
|
} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */
|
||||||
|
|
||||||
|
#define MD_CONTEXT_AMD64_VR_COUNT 26
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/*
|
||||||
|
* Register parameter home addresses.
|
||||||
|
*/
|
||||||
|
uint64_t p1_home;
|
||||||
|
uint64_t p2_home;
|
||||||
|
uint64_t p3_home;
|
||||||
|
uint64_t p4_home;
|
||||||
|
uint64_t p5_home;
|
||||||
|
uint64_t p6_home;
|
||||||
|
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated */
|
||||||
|
uint32_t context_flags;
|
||||||
|
uint32_t mx_csr;
|
||||||
|
|
||||||
|
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
||||||
|
uint16_t cs;
|
||||||
|
|
||||||
|
/* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */
|
||||||
|
uint16_t ds;
|
||||||
|
uint16_t es;
|
||||||
|
uint16_t fs;
|
||||||
|
uint16_t gs;
|
||||||
|
|
||||||
|
/* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */
|
||||||
|
uint16_t ss;
|
||||||
|
uint32_t eflags;
|
||||||
|
|
||||||
|
/* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
|
||||||
|
uint64_t dr0;
|
||||||
|
uint64_t dr1;
|
||||||
|
uint64_t dr2;
|
||||||
|
uint64_t dr3;
|
||||||
|
uint64_t dr6;
|
||||||
|
uint64_t dr7;
|
||||||
|
|
||||||
|
/* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */
|
||||||
|
uint64_t rax;
|
||||||
|
uint64_t rcx;
|
||||||
|
uint64_t rdx;
|
||||||
|
uint64_t rbx;
|
||||||
|
|
||||||
|
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
||||||
|
uint64_t rsp;
|
||||||
|
|
||||||
|
/* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */
|
||||||
|
uint64_t rbp;
|
||||||
|
uint64_t rsi;
|
||||||
|
uint64_t rdi;
|
||||||
|
uint64_t r8;
|
||||||
|
uint64_t r9;
|
||||||
|
uint64_t r10;
|
||||||
|
uint64_t r11;
|
||||||
|
uint64_t r12;
|
||||||
|
uint64_t r13;
|
||||||
|
uint64_t r14;
|
||||||
|
uint64_t r15;
|
||||||
|
|
||||||
|
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
||||||
|
uint64_t rip;
|
||||||
|
|
||||||
|
/* The next set of registers are included with
|
||||||
|
* MD_CONTEXT_AMD64_FLOATING_POINT
|
||||||
|
*/
|
||||||
|
union {
|
||||||
|
MDXmmSaveArea32AMD64 flt_save;
|
||||||
|
struct {
|
||||||
|
uint128_struct header[2];
|
||||||
|
uint128_struct legacy[8];
|
||||||
|
uint128_struct xmm0;
|
||||||
|
uint128_struct xmm1;
|
||||||
|
uint128_struct xmm2;
|
||||||
|
uint128_struct xmm3;
|
||||||
|
uint128_struct xmm4;
|
||||||
|
uint128_struct xmm5;
|
||||||
|
uint128_struct xmm6;
|
||||||
|
uint128_struct xmm7;
|
||||||
|
uint128_struct xmm8;
|
||||||
|
uint128_struct xmm9;
|
||||||
|
uint128_struct xmm10;
|
||||||
|
uint128_struct xmm11;
|
||||||
|
uint128_struct xmm12;
|
||||||
|
uint128_struct xmm13;
|
||||||
|
uint128_struct xmm14;
|
||||||
|
uint128_struct xmm15;
|
||||||
|
} sse_registers;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint128_struct vector_register[MD_CONTEXT_AMD64_VR_COUNT];
|
||||||
|
uint64_t vector_control;
|
||||||
|
|
||||||
|
/* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
|
||||||
|
uint64_t debug_control;
|
||||||
|
uint64_t last_branch_to_rip;
|
||||||
|
uint64_t last_branch_from_rip;
|
||||||
|
uint64_t last_exception_to_rip;
|
||||||
|
uint64_t last_exception_from_rip;
|
||||||
|
|
||||||
|
} MDRawContextAMD64; /* CONTEXT */
|
||||||
|
|
||||||
|
/* For (MDRawContextAMD64).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. The high 24 bits identify the CPU, the
|
||||||
|
* low 8 bits identify the type of context saved. */
|
||||||
|
#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */
|
||||||
|
#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001)
|
||||||
|
/* CONTEXT_CONTROL */
|
||||||
|
#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002)
|
||||||
|
/* CONTEXT_INTEGER */
|
||||||
|
#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004)
|
||||||
|
/* CONTEXT_SEGMENTS */
|
||||||
|
#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008)
|
||||||
|
/* CONTEXT_FLOATING_POINT */
|
||||||
|
#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010)
|
||||||
|
/* CONTEXT_DEBUG_REGISTERS */
|
||||||
|
#define MD_CONTEXT_AMD64_XSTATE (MD_CONTEXT_AMD64 | 0x00000040)
|
||||||
|
/* CONTEXT_XSTATE */
|
||||||
|
|
||||||
|
/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it
|
||||||
|
* I think it really means CONTEXT_FLOATING_POINT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \
|
||||||
|
MD_CONTEXT_AMD64_INTEGER | \
|
||||||
|
MD_CONTEXT_AMD64_FLOATING_POINT)
|
||||||
|
/* CONTEXT_FULL */
|
||||||
|
|
||||||
|
#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \
|
||||||
|
MD_CONTEXT_AMD64_SEGMENTS | \
|
||||||
|
MD_CONTEXT_X86_DEBUG_REGISTERS)
|
||||||
|
/* CONTEXT_ALL */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */
|
|
@ -0,0 +1,151 @@
|
||||||
|
/* Copyright (c) 2009, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on ARM. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by
|
||||||
|
* ensuring that all members are aligned on their natural boundaries.
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file.
|
||||||
|
*
|
||||||
|
* Author: Julian Seward
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARM support
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
|
||||||
|
|
||||||
|
#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32
|
||||||
|
#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that these structures *do not* map directly to the CONTEXT
|
||||||
|
* structure defined in WinNT.h in the Windows Mobile SDK. That structure
|
||||||
|
* does not accomodate VFPv3, and I'm unsure if it was ever used in the
|
||||||
|
* wild anyway, as Windows CE only seems to produce "cedumps" which
|
||||||
|
* are not exactly minidumps.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint64_t fpscr; /* FPU status register */
|
||||||
|
|
||||||
|
/* 32 64-bit floating point registers, d0 .. d31. */
|
||||||
|
uint64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
|
||||||
|
|
||||||
|
/* Miscellaneous control words */
|
||||||
|
uint32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
|
||||||
|
} MDFloatingSaveAreaARM;
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM_GPR_COUNT 16
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated
|
||||||
|
*/
|
||||||
|
uint32_t context_flags;
|
||||||
|
|
||||||
|
/* 16 32-bit integer registers, r0 .. r15
|
||||||
|
* Note the following fixed uses:
|
||||||
|
* r13 is the stack pointer
|
||||||
|
* r14 is the link register
|
||||||
|
* r15 is the program counter
|
||||||
|
*/
|
||||||
|
uint32_t iregs[MD_CONTEXT_ARM_GPR_COUNT];
|
||||||
|
|
||||||
|
/* CPSR (flags, basically): 32 bits:
|
||||||
|
bit 31 - N (negative)
|
||||||
|
bit 30 - Z (zero)
|
||||||
|
bit 29 - C (carry)
|
||||||
|
bit 28 - V (overflow)
|
||||||
|
bit 27 - Q (saturation flag, sticky)
|
||||||
|
All other fields -- ignore */
|
||||||
|
uint32_t cpsr;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */
|
||||||
|
MDFloatingSaveAreaARM float_save;
|
||||||
|
|
||||||
|
} MDRawContextARM;
|
||||||
|
|
||||||
|
/* Indices into iregs for registers with a dedicated or conventional
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
enum MDARMRegisterNumbers {
|
||||||
|
MD_CONTEXT_ARM_REG_IOS_FP = 7,
|
||||||
|
MD_CONTEXT_ARM_REG_FP = 11,
|
||||||
|
MD_CONTEXT_ARM_REG_SP = 13,
|
||||||
|
MD_CONTEXT_ARM_REG_LR = 14,
|
||||||
|
MD_CONTEXT_ARM_REG_PC = 15
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For (MDRawContextARM).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. */
|
||||||
|
/* CONTEXT_ARM from the Windows CE 5.0 SDK. This value isn't correct
|
||||||
|
* because this bit can be used for flags. Presumably this value was
|
||||||
|
* never actually used in minidumps, but only in "CEDumps" which
|
||||||
|
* are a whole parallel minidump file format for Windows CE.
|
||||||
|
* Therefore, Breakpad defines its own value for ARM CPUs.
|
||||||
|
*/
|
||||||
|
#define MD_CONTEXT_ARM_OLD 0x00000040
|
||||||
|
/* This value was chosen to avoid likely conflicts with MD_CONTEXT_*
|
||||||
|
* for other CPUs. */
|
||||||
|
#define MD_CONTEXT_ARM 0x40000000
|
||||||
|
#define MD_CONTEXT_ARM_INTEGER (MD_CONTEXT_ARM | 0x00000002)
|
||||||
|
#define MD_CONTEXT_ARM_FLOATING_POINT (MD_CONTEXT_ARM | 0x00000004)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM_FULL (MD_CONTEXT_ARM_INTEGER | \
|
||||||
|
MD_CONTEXT_ARM_FLOATING_POINT)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM_ALL (MD_CONTEXT_ARM_INTEGER | \
|
||||||
|
MD_CONTEXT_ARM_FLOATING_POINT)
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */
|
|
@ -0,0 +1,140 @@
|
||||||
|
/* Copyright 2013 Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on ARM. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by
|
||||||
|
* ensuring that all members are aligned on their natural boundaries.
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file.
|
||||||
|
*
|
||||||
|
* Author: Colin Blundell
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARM64 support
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
|
||||||
|
|
||||||
|
#define MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t fpsr; /* FPU status register */
|
||||||
|
uint32_t fpcr; /* FPU control register */
|
||||||
|
|
||||||
|
/* 32 128-bit floating point registers, d0 .. d31. */
|
||||||
|
uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT];
|
||||||
|
} MDFloatingSaveAreaARM64;
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM64_GPR_COUNT 33
|
||||||
|
|
||||||
|
/* Use the same 32-bit alignment when accessing this structure from 64-bit code
|
||||||
|
* as is used natively in 32-bit code. */
|
||||||
|
#pragma pack(push, 4)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated
|
||||||
|
*/
|
||||||
|
uint64_t context_flags;
|
||||||
|
|
||||||
|
/* 33 64-bit integer registers, x0 .. x31 + the PC
|
||||||
|
* Note the following fixed uses:
|
||||||
|
* x29 is the frame pointer
|
||||||
|
* x30 is the link register
|
||||||
|
* x31 is the stack pointer
|
||||||
|
* The PC is effectively x32.
|
||||||
|
*/
|
||||||
|
uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT];
|
||||||
|
|
||||||
|
/* CPSR (flags, basically): 32 bits:
|
||||||
|
bit 31 - N (negative)
|
||||||
|
bit 30 - Z (zero)
|
||||||
|
bit 29 - C (carry)
|
||||||
|
bit 28 - V (overflow)
|
||||||
|
bit 27 - Q (saturation flag, sticky)
|
||||||
|
All other fields -- ignore */
|
||||||
|
uint32_t cpsr;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */
|
||||||
|
MDFloatingSaveAreaARM64 float_save;
|
||||||
|
|
||||||
|
} MDRawContextARM64;
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
/* Indices into iregs for registers with a dedicated or conventional
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
enum MDARM64RegisterNumbers {
|
||||||
|
MD_CONTEXT_ARM64_REG_FP = 29,
|
||||||
|
MD_CONTEXT_ARM64_REG_LR = 30,
|
||||||
|
MD_CONTEXT_ARM64_REG_SP = 31,
|
||||||
|
MD_CONTEXT_ARM64_REG_PC = 32
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For (MDRawContextARM64).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. MD_CONTEXT_ARM64 is Breakpad-defined.
|
||||||
|
* This value was chosen to avoid likely conflicts with MD_CONTEXT_*
|
||||||
|
* for other CPUs. */
|
||||||
|
#define MD_CONTEXT_ARM64 0x80000000
|
||||||
|
#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002)
|
||||||
|
#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_INTEGER | \
|
||||||
|
MD_CONTEXT_ARM64_FLOATING_POINT)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_INTEGER | \
|
||||||
|
MD_CONTEXT_ARM64_FLOATING_POINT)
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ */
|
|
@ -0,0 +1,160 @@
|
||||||
|
/* Copyright (c) 2013, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on MIPS. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by
|
||||||
|
* ensuring that all members are aligned on their natural boundaries.
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file.
|
||||||
|
*
|
||||||
|
* Author: Chris Dearman
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MIPS support
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
||||||
|
|
||||||
|
#define MD_CONTEXT_MIPS_GPR_COUNT 32
|
||||||
|
#define MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT 32
|
||||||
|
#define MD_CONTEXT_MIPS_DSP_COUNT 3
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that these structures *do not* map directly to the CONTEXT
|
||||||
|
* structure defined in WinNT.h in the Windows Mobile SDK. That structure
|
||||||
|
* does not accomodate VFPv3, and I'm unsure if it was ever used in the
|
||||||
|
* wild anyway, as Windows CE only seems to produce "cedumps" which
|
||||||
|
* are not exactly minidumps.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/* 32 64-bit floating point registers, f0..f31 */
|
||||||
|
uint64_t regs[MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT];
|
||||||
|
|
||||||
|
uint32_t fpcsr; /* FPU status register. */
|
||||||
|
uint32_t fir; /* FPU implementation register. */
|
||||||
|
} MDFloatingSaveAreaMIPS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated.
|
||||||
|
*/
|
||||||
|
uint32_t context_flags;
|
||||||
|
uint32_t _pad0;
|
||||||
|
|
||||||
|
/* 32 64-bit integer registers, r0..r31.
|
||||||
|
* Note the following fixed uses:
|
||||||
|
* r29 is the stack pointer.
|
||||||
|
* r31 is the return address.
|
||||||
|
*/
|
||||||
|
uint64_t iregs[MD_CONTEXT_MIPS_GPR_COUNT];
|
||||||
|
|
||||||
|
/* multiply/divide result. */
|
||||||
|
uint64_t mdhi, mdlo;
|
||||||
|
|
||||||
|
/* DSP accumulators. */
|
||||||
|
uint32_t hi[MD_CONTEXT_MIPS_DSP_COUNT];
|
||||||
|
uint32_t lo[MD_CONTEXT_MIPS_DSP_COUNT];
|
||||||
|
uint32_t dsp_control;
|
||||||
|
uint32_t _pad1;
|
||||||
|
|
||||||
|
uint64_t epc;
|
||||||
|
uint64_t badvaddr;
|
||||||
|
uint32_t status;
|
||||||
|
uint32_t cause;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT_MIPS_FLOATING_POINT. */
|
||||||
|
MDFloatingSaveAreaMIPS float_save;
|
||||||
|
|
||||||
|
} MDRawContextMIPS;
|
||||||
|
|
||||||
|
/* Indices into iregs for registers with a dedicated or conventional
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
enum MDMIPSRegisterNumbers {
|
||||||
|
MD_CONTEXT_MIPS_REG_S0 = 16,
|
||||||
|
MD_CONTEXT_MIPS_REG_S1 = 17,
|
||||||
|
MD_CONTEXT_MIPS_REG_S2 = 18,
|
||||||
|
MD_CONTEXT_MIPS_REG_S3 = 19,
|
||||||
|
MD_CONTEXT_MIPS_REG_S4 = 20,
|
||||||
|
MD_CONTEXT_MIPS_REG_S5 = 21,
|
||||||
|
MD_CONTEXT_MIPS_REG_S6 = 22,
|
||||||
|
MD_CONTEXT_MIPS_REG_S7 = 23,
|
||||||
|
MD_CONTEXT_MIPS_REG_GP = 28,
|
||||||
|
MD_CONTEXT_MIPS_REG_SP = 29,
|
||||||
|
MD_CONTEXT_MIPS_REG_FP = 30,
|
||||||
|
MD_CONTEXT_MIPS_REG_RA = 31,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For (MDRawContextMIPS).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. */
|
||||||
|
/* CONTEXT_MIPS from the Windows CE 5.0 SDK. This value isn't correct
|
||||||
|
* because this bit can be used for flags. Presumably this value was
|
||||||
|
* never actually used in minidumps, but only in "CEDumps" which
|
||||||
|
* are a whole parallel minidump file format for Windows CE.
|
||||||
|
* Therefore, Breakpad defines its own value for MIPS CPUs.
|
||||||
|
*/
|
||||||
|
#define MD_CONTEXT_MIPS 0x00040000
|
||||||
|
#define MD_CONTEXT_MIPS_INTEGER (MD_CONTEXT_MIPS | 0x00000002)
|
||||||
|
#define MD_CONTEXT_MIPS_FLOATING_POINT (MD_CONTEXT_MIPS | 0x00000004)
|
||||||
|
#define MD_CONTEXT_MIPS_DSP (MD_CONTEXT_MIPS | 0x00000008)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_MIPS_FULL (MD_CONTEXT_MIPS_INTEGER | \
|
||||||
|
MD_CONTEXT_MIPS_FLOATING_POINT | \
|
||||||
|
MD_CONTEXT_MIPS_DSP)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_MIPS_ALL (MD_CONTEXT_MIPS_INTEGER | \
|
||||||
|
MD_CONTEXT_MIPS_FLOATING_POINT \
|
||||||
|
MD_CONTEXT_MIPS_DSP)
|
||||||
|
|
||||||
|
#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
|
@ -0,0 +1,168 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on ppc. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by ensuring
|
||||||
|
* ensuring that all members are aligned on their natural boundaries. In
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Change to split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X'
|
||||||
|
* mach/ppc/_types.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__
|
||||||
|
|
||||||
|
#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* fpregs is a double[32] in mach/ppc/_types.h, but a uint64_t is used
|
||||||
|
* here for precise sizing. */
|
||||||
|
uint64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT];
|
||||||
|
uint32_t fpscr_pad;
|
||||||
|
uint32_t fpscr; /* Status/control */
|
||||||
|
} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */
|
||||||
|
|
||||||
|
|
||||||
|
#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h
|
||||||
|
* exposes them as four 32-bit quantities. */
|
||||||
|
uint128_struct save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT];
|
||||||
|
uint128_struct save_vscr; /* Status/control */
|
||||||
|
uint32_t save_pad5[4];
|
||||||
|
uint32_t save_vrvalid; /* Indicates which vector registers are saved */
|
||||||
|
uint32_t save_pad6[7];
|
||||||
|
} MDVectorSaveAreaPPC; /* ppc_vector_state */
|
||||||
|
|
||||||
|
|
||||||
|
#define MD_CONTEXT_PPC_GPR_COUNT 32
|
||||||
|
|
||||||
|
/* Use the same 32-bit alignment when accessing this structure from 64-bit code
|
||||||
|
* as is used natively in 32-bit code. #pragma pack is a MSVC extension
|
||||||
|
* supported by gcc. */
|
||||||
|
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
|
#pragma pack(4)
|
||||||
|
#else
|
||||||
|
#pragma pack(push, 4)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* context_flags is not present in ppc_thread_state, but it aids
|
||||||
|
* identification of MDRawContextPPC among other raw context types,
|
||||||
|
* and it guarantees alignment when we get to float_save. */
|
||||||
|
uint32_t context_flags;
|
||||||
|
|
||||||
|
uint32_t srr0; /* Machine status save/restore: stores pc
|
||||||
|
* (instruction) */
|
||||||
|
uint32_t srr1; /* Machine status save/restore: stores msr
|
||||||
|
* (ps, program/machine state) */
|
||||||
|
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
|
||||||
|
* used for brevity. */
|
||||||
|
uint32_t gpr[MD_CONTEXT_PPC_GPR_COUNT];
|
||||||
|
uint32_t cr; /* Condition */
|
||||||
|
uint32_t xer; /* Integer (fiXed-point) exception */
|
||||||
|
uint32_t lr; /* Link */
|
||||||
|
uint32_t ctr; /* Count */
|
||||||
|
uint32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */
|
||||||
|
uint32_t vrsave; /* Vector save */
|
||||||
|
|
||||||
|
/* float_save and vector_save aren't present in ppc_thread_state, but
|
||||||
|
* are represented in separate structures that still define a thread's
|
||||||
|
* context. */
|
||||||
|
MDFloatingSaveAreaPPC float_save;
|
||||||
|
MDVectorSaveAreaPPC vector_save;
|
||||||
|
} MDRawContextPPC; /* Based on ppc_thread_state */
|
||||||
|
|
||||||
|
/* Indices into gpr for registers with a dedicated or conventional purpose. */
|
||||||
|
enum MDPPCRegisterNumbers {
|
||||||
|
MD_CONTEXT_PPC_REG_SP = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
|
#pragma pack(0)
|
||||||
|
#else
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For (MDRawContextPPC).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its
|
||||||
|
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
||||||
|
* CPUs. */
|
||||||
|
#define MD_CONTEXT_PPC 0x20000000
|
||||||
|
#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001)
|
||||||
|
#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)
|
||||||
|
#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE
|
||||||
|
#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \
|
||||||
|
MD_CONTEXT_PPC_FLOATING_POINT | \
|
||||||
|
MD_CONTEXT_PPC_VECTOR)
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */
|
|
@ -0,0 +1,134 @@
|
||||||
|
/* Copyright (c) 2008, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on ppc64. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by ensuring
|
||||||
|
* ensuring that all members are aligned on their natural boundaries. In
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Neal Sidhwaney */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X'
|
||||||
|
* mach/ppc/_types.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__
|
||||||
|
|
||||||
|
#include "minidump_cpu_ppc.h"
|
||||||
|
|
||||||
|
// these types are the same in ppc64 & ppc
|
||||||
|
typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64;
|
||||||
|
typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64;
|
||||||
|
|
||||||
|
#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* context_flags is not present in ppc_thread_state, but it aids
|
||||||
|
* identification of MDRawContextPPC among other raw context types,
|
||||||
|
* and it guarantees alignment when we get to float_save. */
|
||||||
|
uint64_t context_flags;
|
||||||
|
|
||||||
|
uint64_t srr0; /* Machine status save/restore: stores pc
|
||||||
|
* (instruction) */
|
||||||
|
uint64_t srr1; /* Machine status save/restore: stores msr
|
||||||
|
* (ps, program/machine state) */
|
||||||
|
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
|
||||||
|
* used for brevity. */
|
||||||
|
uint64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT];
|
||||||
|
uint64_t cr; /* Condition */
|
||||||
|
uint64_t xer; /* Integer (fiXed-point) exception */
|
||||||
|
uint64_t lr; /* Link */
|
||||||
|
uint64_t ctr; /* Count */
|
||||||
|
uint64_t vrsave; /* Vector save */
|
||||||
|
|
||||||
|
/* float_save and vector_save aren't present in ppc_thread_state, but
|
||||||
|
* are represented in separate structures that still define a thread's
|
||||||
|
* context. */
|
||||||
|
MDFloatingSaveAreaPPC float_save;
|
||||||
|
MDVectorSaveAreaPPC vector_save;
|
||||||
|
} MDRawContextPPC64; /* Based on ppc_thread_state */
|
||||||
|
|
||||||
|
/* Indices into gpr for registers with a dedicated or conventional purpose. */
|
||||||
|
enum MDPPC64RegisterNumbers {
|
||||||
|
MD_CONTEXT_PPC64_REG_SP = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For (MDRawContextPPC).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its
|
||||||
|
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
||||||
|
* CPUs. */
|
||||||
|
#define MD_CONTEXT_PPC64 0x01000000
|
||||||
|
#define MD_CONTEXT_PPC64_BASE (MD_CONTEXT_PPC64 | 0x00000001)
|
||||||
|
#define MD_CONTEXT_PPC64_FLOATING_POINT (MD_CONTEXT_PPC64 | 0x00000008)
|
||||||
|
#define MD_CONTEXT_PPC64_VECTOR (MD_CONTEXT_PPC64 | 0x00000020)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_PPC64_FULL MD_CONTEXT_PPC64_BASE
|
||||||
|
#define MD_CONTEXT_PPC64_ALL (MD_CONTEXT_PPC64_FULL | \
|
||||||
|
MD_CONTEXT_PPC64_FLOATING_POINT | \
|
||||||
|
MD_CONTEXT_PPC64_VECTOR)
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */
|
|
@ -0,0 +1,163 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on sparc. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by ensuring
|
||||||
|
* ensuring that all members are aligned on their natural boundaries. In
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Change to split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPARC support, see (solaris)sys/procfs_isa.h also
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__
|
||||||
|
|
||||||
|
#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
/* FPU floating point regs */
|
||||||
|
uint64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT];
|
||||||
|
|
||||||
|
uint64_t filler;
|
||||||
|
uint64_t fsr; /* FPU status register */
|
||||||
|
} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */
|
||||||
|
|
||||||
|
#define MD_CONTEXT_SPARC_GPR_COUNT 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated
|
||||||
|
*/
|
||||||
|
uint32_t context_flags;
|
||||||
|
uint32_t flag_pad;
|
||||||
|
/*
|
||||||
|
* General register access (SPARC).
|
||||||
|
* Don't confuse definitions here with definitions in <sys/regset.h>.
|
||||||
|
* Registers are 32 bits for ILP32, 64 bits for LP64.
|
||||||
|
* SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 32 Integer working registers */
|
||||||
|
|
||||||
|
/* g_r[0-7] global registers(g0-g7)
|
||||||
|
* g_r[8-15] out registers(o0-o7)
|
||||||
|
* g_r[16-23] local registers(l0-l7)
|
||||||
|
* g_r[24-31] in registers(i0-i7)
|
||||||
|
*/
|
||||||
|
uint64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT];
|
||||||
|
|
||||||
|
/* several control registers */
|
||||||
|
|
||||||
|
/* Processor State register(PSR) for SPARC V7/V8
|
||||||
|
* Condition Code register (CCR) for SPARC V9
|
||||||
|
*/
|
||||||
|
uint64_t ccr;
|
||||||
|
|
||||||
|
uint64_t pc; /* Program Counter register (PC) */
|
||||||
|
uint64_t npc; /* Next Program Counter register (nPC) */
|
||||||
|
uint64_t y; /* Y register (Y) */
|
||||||
|
|
||||||
|
/* Address Space Identifier register (ASI) for SPARC V9
|
||||||
|
* WIM for SPARC V7/V8
|
||||||
|
*/
|
||||||
|
uint64_t asi;
|
||||||
|
|
||||||
|
/* Floating-Point Registers State register (FPRS) for SPARC V9
|
||||||
|
* TBR for for SPARC V7/V8
|
||||||
|
*/
|
||||||
|
uint64_t fprs;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */
|
||||||
|
MDFloatingSaveAreaSPARC float_save;
|
||||||
|
|
||||||
|
} MDRawContextSPARC; /* CONTEXT_SPARC */
|
||||||
|
|
||||||
|
/* Indices into g_r for registers with a dedicated or conventional purpose. */
|
||||||
|
enum MDSPARCRegisterNumbers {
|
||||||
|
MD_CONTEXT_SPARC_REG_SP = 14
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For (MDRawContextSPARC).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its
|
||||||
|
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
||||||
|
* CPUs. */
|
||||||
|
#define MD_CONTEXT_SPARC 0x10000000
|
||||||
|
#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001)
|
||||||
|
#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002)
|
||||||
|
#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004)
|
||||||
|
#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \
|
||||||
|
MD_CONTEXT_SPARC_INTEGER)
|
||||||
|
|
||||||
|
#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \
|
||||||
|
MD_CONTEXT_SAPARC_FLOATING_POINT | \
|
||||||
|
MD_CONTEXT_SAPARC_EXTRA)
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */
|
|
@ -0,0 +1,174 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* This file contains the necessary definitions to read minidump files
|
||||||
|
* produced on x86. These files may be read on any platform provided
|
||||||
|
* that the alignments of these structures on the processing system are
|
||||||
|
* identical to the alignments of these structures on the producing system.
|
||||||
|
* For this reason, precise-sized types are used. The structures defined
|
||||||
|
* by this file have been laid out to minimize alignment problems by ensuring
|
||||||
|
* ensuring that all members are aligned on their natural boundaries. In
|
||||||
|
* In some cases, tail-padding may be significant when different ABIs specify
|
||||||
|
* different tail-padding behaviors. To avoid problems when reading or
|
||||||
|
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
||||||
|
* containing the useful size of the structures without padding.
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai */
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__
|
||||||
|
|
||||||
|
#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80
|
||||||
|
/* SIZE_OF_80387_REGISTERS */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t control_word;
|
||||||
|
uint32_t status_word;
|
||||||
|
uint32_t tag_word;
|
||||||
|
uint32_t error_offset;
|
||||||
|
uint32_t error_selector;
|
||||||
|
uint32_t data_offset;
|
||||||
|
uint32_t data_selector;
|
||||||
|
|
||||||
|
/* register_area contains eight 80-bit (x87 "long double") quantities for
|
||||||
|
* floating-point registers %st0 (%mm0) through %st7 (%mm7). */
|
||||||
|
uint8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE];
|
||||||
|
uint32_t cr0_npx_state;
|
||||||
|
} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */
|
||||||
|
|
||||||
|
|
||||||
|
#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512
|
||||||
|
/* MAXIMUM_SUPPORTED_EXTENSION */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next field determines the layout of the structure, and which parts
|
||||||
|
* of it are populated */
|
||||||
|
uint32_t context_flags;
|
||||||
|
|
||||||
|
/* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */
|
||||||
|
uint32_t dr0;
|
||||||
|
uint32_t dr1;
|
||||||
|
uint32_t dr2;
|
||||||
|
uint32_t dr3;
|
||||||
|
uint32_t dr6;
|
||||||
|
uint32_t dr7;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */
|
||||||
|
MDFloatingSaveAreaX86 float_save;
|
||||||
|
|
||||||
|
/* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */
|
||||||
|
uint32_t gs;
|
||||||
|
uint32_t fs;
|
||||||
|
uint32_t es;
|
||||||
|
uint32_t ds;
|
||||||
|
/* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */
|
||||||
|
uint32_t edi;
|
||||||
|
uint32_t esi;
|
||||||
|
uint32_t ebx;
|
||||||
|
uint32_t edx;
|
||||||
|
uint32_t ecx;
|
||||||
|
uint32_t eax;
|
||||||
|
|
||||||
|
/* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */
|
||||||
|
uint32_t ebp;
|
||||||
|
uint32_t eip;
|
||||||
|
uint32_t cs; /* WinNT.h says "must be sanitized" */
|
||||||
|
uint32_t eflags; /* WinNT.h says "must be sanitized" */
|
||||||
|
uint32_t esp;
|
||||||
|
uint32_t ss;
|
||||||
|
|
||||||
|
/* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS.
|
||||||
|
* It contains vector (MMX/SSE) registers. It it laid out in the
|
||||||
|
* format used by the fxsave and fsrstor instructions, so it includes
|
||||||
|
* a copy of the x87 floating-point registers as well. See FXSAVE in
|
||||||
|
* "Intel Architecture Software Developer's Manual, Volume 2." */
|
||||||
|
uint8_t extended_registers[
|
||||||
|
MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE];
|
||||||
|
} MDRawContextX86; /* CONTEXT */
|
||||||
|
|
||||||
|
/* For (MDRawContextX86).context_flags. These values indicate the type of
|
||||||
|
* context stored in the structure. The high 24 bits identify the CPU, the
|
||||||
|
* low 8 bits identify the type of context saved. */
|
||||||
|
#define MD_CONTEXT_X86 0x00010000
|
||||||
|
/* CONTEXT_i386, CONTEXT_i486: identifies CPU */
|
||||||
|
#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001)
|
||||||
|
/* CONTEXT_CONTROL */
|
||||||
|
#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002)
|
||||||
|
/* CONTEXT_INTEGER */
|
||||||
|
#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004)
|
||||||
|
/* CONTEXT_SEGMENTS */
|
||||||
|
#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008)
|
||||||
|
/* CONTEXT_FLOATING_POINT */
|
||||||
|
#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010)
|
||||||
|
/* CONTEXT_DEBUG_REGISTERS */
|
||||||
|
#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020)
|
||||||
|
/* CONTEXT_EXTENDED_REGISTERS */
|
||||||
|
#define MD_CONTEXT_X86_XSTATE (MD_CONTEXT_X86 | 0x00000040)
|
||||||
|
/* CONTEXT_XSTATE */
|
||||||
|
|
||||||
|
#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \
|
||||||
|
MD_CONTEXT_X86_INTEGER | \
|
||||||
|
MD_CONTEXT_X86_SEGMENTS)
|
||||||
|
/* CONTEXT_FULL */
|
||||||
|
|
||||||
|
#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \
|
||||||
|
MD_CONTEXT_X86_FLOATING_POINT | \
|
||||||
|
MD_CONTEXT_X86_DEBUG_REGISTERS | \
|
||||||
|
MD_CONTEXT_X86_EXTENDED_REGISTERS)
|
||||||
|
/* CONTEXT_ALL */
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */
|
87
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_linux.h
vendored
Normal file
87
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_linux.h
vendored
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_exception_linux.h: A definition of exception codes for
|
||||||
|
* Linux
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "google_breakpad/common/breakpad_types.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* For (MDException).exception_code. These values come from bits/signum.h.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGURG = 23,
|
||||||
|
/* Urgent condition on socket (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25,
|
||||||
|
/* File size limit exceeded (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */
|
||||||
|
MD_EXCEPTION_CODE_LIN_SIGSYS = 31, /* Bad system call */
|
||||||
|
MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED = 0xFFFFFFFF /* No exception,
|
||||||
|
dump requested. */
|
||||||
|
} MDExceptionCodeLinux;
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */
|
205
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_mac.h
vendored
Normal file
205
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_mac.h
vendored
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_exception_mac.h: A definition of exception codes for Mac
|
||||||
|
* OS X
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "google_breakpad/common/breakpad_types.h"
|
||||||
|
|
||||||
|
/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X
|
||||||
|
* support. Based on Darwin/Mac OS X' mach/exception_types.h. This is
|
||||||
|
* what Mac OS X calls an "exception", not a "code". */
|
||||||
|
typedef enum {
|
||||||
|
/* Exception code. The high 16 bits of exception_code contains one of
|
||||||
|
* these values. */
|
||||||
|
MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */
|
||||||
|
/* EXC_BAD_ACCESS */
|
||||||
|
MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */
|
||||||
|
/* EXC_BAD_INSTRUCTION */
|
||||||
|
MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */
|
||||||
|
/* EXC_ARITHMETIC */
|
||||||
|
MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */
|
||||||
|
/* EXC_EMULATION */
|
||||||
|
MD_EXCEPTION_MAC_SOFTWARE = 5,
|
||||||
|
/* EXC_SOFTWARE */
|
||||||
|
MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */
|
||||||
|
/* EXC_BREAKPOINT */
|
||||||
|
MD_EXCEPTION_MAC_SYSCALL = 7,
|
||||||
|
/* EXC_SYSCALL */
|
||||||
|
MD_EXCEPTION_MAC_MACH_SYSCALL = 8,
|
||||||
|
/* EXC_MACH_SYSCALL */
|
||||||
|
MD_EXCEPTION_MAC_RPC_ALERT = 9
|
||||||
|
/* EXC_RPC_ALERT */
|
||||||
|
} MDExceptionMac;
|
||||||
|
|
||||||
|
/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X
|
||||||
|
* support. Based on Darwin/Mac OS X' mach/ppc/exception.h and
|
||||||
|
* mach/i386/exception.h. This is what Mac OS X calls a "code". */
|
||||||
|
typedef enum {
|
||||||
|
/* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values
|
||||||
|
* from mach/kern_return.h. */
|
||||||
|
MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1,
|
||||||
|
/* KERN_INVALID_ADDRESS */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2,
|
||||||
|
/* KERN_PROTECTION_FAILURE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8,
|
||||||
|
/* KERN_NO_ACCESS */
|
||||||
|
MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9,
|
||||||
|
/* KERN_MEMORY_FAILURE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10,
|
||||||
|
/* KERN_MEMORY_ERROR */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_SOFTWARE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */
|
||||||
|
MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */
|
||||||
|
/* Custom values */
|
||||||
|
MD_EXCEPTION_CODE_MAC_NS_EXCEPTION = 0xDEADC0DE, /* uncaught NSException */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_ACCESS on arm */
|
||||||
|
MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN = 0x0101, /* EXC_ARM_DA_ALIGN */
|
||||||
|
MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG = 0x0102, /* EXC_ARM_DA_DEBUG */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on arm */
|
||||||
|
MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED = 1, /* EXC_ARM_UNDEFINED */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BREAKPOINT on arm */
|
||||||
|
MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT = 1, /* EXC_ARM_BREAKPOINT */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101,
|
||||||
|
/* EXC_PPC_VM_PROT_READ */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102,
|
||||||
|
/* EXC_PPC_BADSPACE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103,
|
||||||
|
/* EXC_PPC_UNALIGNED */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1,
|
||||||
|
/* EXC_PPC_INVALID_SYSCALL */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2,
|
||||||
|
/* EXC_PPC_UNIPL_INST */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3,
|
||||||
|
/* EXC_PPC_PRIVINST */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4,
|
||||||
|
/* EXC_PPC_PRIVREG */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5,
|
||||||
|
/* EXC_PPC_TRACE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6,
|
||||||
|
/* EXC_PPC_PERFMON */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1,
|
||||||
|
/* EXC_PPC_OVERFLOW */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2,
|
||||||
|
/* EXC_PPC_ZERO_DIVIDE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3,
|
||||||
|
/* EXC_FLT_INEXACT */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4,
|
||||||
|
/* EXC_PPC_FLT_ZERO_DIVIDE */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5,
|
||||||
|
/* EXC_PPC_FLT_UNDERFLOW */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6,
|
||||||
|
/* EXC_PPC_FLT_OVERFLOW */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7,
|
||||||
|
/* EXC_PPC_FLT_NOT_A_NUMBER */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_EMULATION on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8,
|
||||||
|
/* EXC_PPC_NOEMULATION */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9,
|
||||||
|
/* EXC_PPC_ALTIVECASSIST */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_SOFTWARE on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */
|
||||||
|
MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt
|
||||||
|
* values below. */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */
|
||||||
|
|
||||||
|
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw
|
||||||
|
* x86 interrupt codes. Most of these are mapped to other Mach
|
||||||
|
* exceptions and codes, are handled, or should not occur in user space.
|
||||||
|
* A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */
|
||||||
|
/* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */
|
||||||
|
/* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */
|
||||||
|
/* EXC_I386_NMIFLT = 2: should not occur in user space */
|
||||||
|
/* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */
|
||||||
|
/* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */
|
||||||
|
/* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */
|
||||||
|
/* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */
|
||||||
|
/* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */
|
||||||
|
/* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */
|
||||||
|
/* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10,
|
||||||
|
/* EXC_INVTSSFLT */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11,
|
||||||
|
/* EXC_SEGNPFLT */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12,
|
||||||
|
/* EXC_STKFLT */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13,
|
||||||
|
/* EXC_GPFLT */
|
||||||
|
/* EXC_I386_PGFLT = 14: should not occur in user space */
|
||||||
|
/* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */
|
||||||
|
MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17
|
||||||
|
/* EXC_ALIGNFLT (for vector operations) */
|
||||||
|
/* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */
|
||||||
|
/* EXC_I386_ENDPERR = 33: should not occur */
|
||||||
|
} MDExceptionCodeMac;
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */
|
67
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_ps3.h
vendored
Normal file
67
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_ps3.h
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/* Copyright (c) 2013, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_exception_ps3.h: A definition of exception codes for
|
||||||
|
* PS3 */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "google_breakpad/common/breakpad_types.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MD_EXCEPTION_CODE_PS3_UNKNOWN = 0,
|
||||||
|
MD_EXCEPTION_CODE_PS3_TRAP_EXCEP = 1,
|
||||||
|
MD_EXCEPTION_CODE_PS3_PRIV_INSTR = 2,
|
||||||
|
MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR = 3,
|
||||||
|
MD_EXCEPTION_CODE_PS3_INSTR_STORAGE = 4,
|
||||||
|
MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT = 5,
|
||||||
|
MD_EXCEPTION_CODE_PS3_DATA_STORAGE = 6,
|
||||||
|
MD_EXCEPTION_CODE_PS3_DATA_SEGMENT = 7,
|
||||||
|
MD_EXCEPTION_CODE_PS3_FLOAT_POINT = 8,
|
||||||
|
MD_EXCEPTION_CODE_PS3_DABR_MATCH = 9,
|
||||||
|
MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP = 10,
|
||||||
|
MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS = 11,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_ALIGN = 12,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM = 13,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_ERR = 14,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_FIR = 15,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT = 16,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE = 17,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR = 18,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR = 19,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN = 20,
|
||||||
|
MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS = 21,
|
||||||
|
MD_EXCEPTION_CODE_PS3_GRAPHIC = 22
|
||||||
|
} MDExceptionCodePS3;
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ */
|
94
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_solaris.h
vendored
Normal file
94
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_solaris.h
vendored
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_exception_solaris.h: A definition of exception codes for
|
||||||
|
* Solaris
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai
|
||||||
|
* Split into its own file: Neal Sidhwaney */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "google_breakpad/common/breakpad_types.h"
|
||||||
|
|
||||||
|
/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occurred */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */
|
||||||
|
MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */
|
||||||
|
} MDExceptionCodeSolaris;
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */
|
2261
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_win32.h
vendored
Normal file
2261
Telegram/ThirdParty/breakpad/google_breakpad/common/minidump_exception_win32.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,972 @@
|
||||||
|
/* Copyright (c) 2006, Google Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
||||||
|
* portions of DbgHelp.h from the Windows Platform SDK.
|
||||||
|
*
|
||||||
|
* (This is C99 source, please don't corrupt it with C++.)
|
||||||
|
*
|
||||||
|
* Structures that are defined by Microsoft to contain a zero-length array
|
||||||
|
* are instead defined here to contain an array with one element, as
|
||||||
|
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
||||||
|
* *_minsize constants are provided to be used in place of sizeof. For a
|
||||||
|
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
||||||
|
*
|
||||||
|
* These structures are also sufficient to populate minidump files.
|
||||||
|
*
|
||||||
|
* These definitions may be extended to support handling minidump files
|
||||||
|
* for other CPUs and other operating systems.
|
||||||
|
*
|
||||||
|
* Because precise data type sizes are crucial for this implementation to
|
||||||
|
* function properly and portably in terms of interoperability with minidumps
|
||||||
|
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
||||||
|
* are used as the basis of each structure defined by this file. DbgHelp
|
||||||
|
* on Windows is assumed to be the reference implementation; this file
|
||||||
|
* seeks to provide a cross-platform compatible implementation. To avoid
|
||||||
|
* collisions with the types and values defined and used by DbgHelp in the
|
||||||
|
* event that this implementation is used on Windows, each type and value
|
||||||
|
* defined here is given a new name, beginning with "MD". Names of the
|
||||||
|
* equivalent types and values in the Windows Platform SDK are given in
|
||||||
|
* comments.
|
||||||
|
*
|
||||||
|
* Author: Mark Mentovai */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__
|
||||||
|
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "google_breakpad/common/breakpad_types.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
/* Disable "zero-sized array in struct/union" warnings when compiling in
|
||||||
|
* MSVC. DbgHelp.h does this too. */
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4200)
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* guiddef.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t data1;
|
||||||
|
uint16_t data2;
|
||||||
|
uint16_t data3;
|
||||||
|
uint8_t data4[8];
|
||||||
|
} MDGUID; /* GUID */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WinNT.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Non-x86 CPU identifiers found in the high 24 bits of
|
||||||
|
* (MDRawContext*).context_flags. These aren't used by Breakpad, but are
|
||||||
|
* defined here for reference, to avoid assigning values that conflict
|
||||||
|
* (although some values already conflict). */
|
||||||
|
#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */
|
||||||
|
/* Additional values from winnt.h in the Windows CE 5.0 SDK: */
|
||||||
|
#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */
|
||||||
|
#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */
|
||||||
|
|
||||||
|
/* As of Windows 7 SP1, the number of flag bits has increased to
|
||||||
|
* include 0x40 (CONTEXT_XSTATE):
|
||||||
|
* http://msdn.microsoft.com/en-us/library/hh134238%28v=vs.85%29.aspx */
|
||||||
|
#define MD_CONTEXT_CPU_MASK 0xffffff00
|
||||||
|
|
||||||
|
|
||||||
|
/* This is a base type for MDRawContextX86 and MDRawContextPPC. This
|
||||||
|
* structure should never be allocated directly. The actual structure type
|
||||||
|
* can be determined by examining the context_flags field. */
|
||||||
|
typedef struct {
|
||||||
|
uint32_t context_flags;
|
||||||
|
} MDRawContextBase;
|
||||||
|
|
||||||
|
#include "minidump_cpu_amd64.h"
|
||||||
|
#include "minidump_cpu_arm.h"
|
||||||
|
#include "minidump_cpu_arm64.h"
|
||||||
|
#include "minidump_cpu_mips.h"
|
||||||
|
#include "minidump_cpu_ppc.h"
|
||||||
|
#include "minidump_cpu_ppc64.h"
|
||||||
|
#include "minidump_cpu_sparc.h"
|
||||||
|
#include "minidump_cpu_x86.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WinVer.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t signature;
|
||||||
|
uint32_t struct_version;
|
||||||
|
uint32_t file_version_hi;
|
||||||
|
uint32_t file_version_lo;
|
||||||
|
uint32_t product_version_hi;
|
||||||
|
uint32_t product_version_lo;
|
||||||
|
uint32_t file_flags_mask; /* Identifies valid bits in fileFlags */
|
||||||
|
uint32_t file_flags;
|
||||||
|
uint32_t file_os;
|
||||||
|
uint32_t file_type;
|
||||||
|
uint32_t file_subtype;
|
||||||
|
uint32_t file_date_hi;
|
||||||
|
uint32_t file_date_lo;
|
||||||
|
} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).signature */
|
||||||
|
#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd
|
||||||
|
/* VS_FFI_SIGNATURE */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).version */
|
||||||
|
#define MD_VSFIXEDFILEINFO_VERSION 0x00010000
|
||||||
|
/* VS_FFI_STRUCVERSION */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).file_flags_mask and
|
||||||
|
* (MDVSFixedFileInfo).file_flags */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001
|
||||||
|
/* VS_FF_DEBUG */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002
|
||||||
|
/* VS_FF_PRERELEASE */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004
|
||||||
|
/* VS_FF_PATCHED */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008
|
||||||
|
/* VS_FF_PRIVATEBUILD */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010
|
||||||
|
/* VS_FF_INFOINFERRED */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020
|
||||||
|
/* VS_FF_SPECIALBUILD */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).file_os: high 16 bits */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */
|
||||||
|
/* Low 16 bits */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).file_type */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */
|
||||||
|
|
||||||
|
/* For (MDVSFixedFileInfo).file_subtype */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0
|
||||||
|
/* VFT2_UNKNOWN */
|
||||||
|
/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1
|
||||||
|
/* VFT2_DRV_PRINTER */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2
|
||||||
|
/* VFT2_DRV_KEYBOARD */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3
|
||||||
|
/* VFT2_DRV_LANGUAGE */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4
|
||||||
|
/* VFT2_DRV_DISPLAY */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5
|
||||||
|
/* VFT2_DRV_MOUSE */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6
|
||||||
|
/* VFT2_DRV_NETWORK */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7
|
||||||
|
/* VFT2_DRV_SYSTEM */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8
|
||||||
|
/* VFT2_DRV_INSTALLABLE */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9
|
||||||
|
/* VFT2_DRV_SOUND */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10
|
||||||
|
/* VFT2_DRV_COMM */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11
|
||||||
|
/* VFT2_DRV_INPUTMETHOD */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12
|
||||||
|
/* VFT2_DRV_VERSIONED_PRINTER */
|
||||||
|
/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1
|
||||||
|
/* VFT2_FONT_RASTER */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2
|
||||||
|
/* VFT2_FONT_VECTOR */
|
||||||
|
#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3
|
||||||
|
/* VFT2_FONT_TRUETYPE */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DbgHelp.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* An MDRVA is an offset into the minidump file. The beginning of the
|
||||||
|
* MDRawHeader is at offset 0. */
|
||||||
|
typedef uint32_t MDRVA; /* RVA */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t data_size;
|
||||||
|
MDRVA rva;
|
||||||
|
} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The base address of the memory range on the host that produced the
|
||||||
|
* minidump. */
|
||||||
|
uint64_t start_of_memory_range;
|
||||||
|
|
||||||
|
MDLocationDescriptor memory;
|
||||||
|
} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t signature;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t stream_count;
|
||||||
|
MDRVA stream_directory_rva; /* A |stream_count|-sized array of
|
||||||
|
* MDRawDirectory structures. */
|
||||||
|
uint32_t checksum; /* Can be 0. In fact, that's all that's
|
||||||
|
* been found in minidump files. */
|
||||||
|
uint32_t time_date_stamp; /* time_t */
|
||||||
|
uint64_t flags;
|
||||||
|
} MDRawHeader; /* MINIDUMP_HEADER */
|
||||||
|
|
||||||
|
/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the
|
||||||
|
* low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the
|
||||||
|
* documentation, the high 16 bits are implementation-specific. */
|
||||||
|
#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */
|
||||||
|
/* MINIDUMP_SIGNATURE */
|
||||||
|
#define MD_HEADER_VERSION 0x0000a793 /* 42899 */
|
||||||
|
/* MINIDUMP_VERSION */
|
||||||
|
|
||||||
|
/* For (MDRawHeader).flags: */
|
||||||
|
typedef enum {
|
||||||
|
/* MD_NORMAL is the standard type of minidump. It includes full
|
||||||
|
* streams for the thread list, module list, exception, system info,
|
||||||
|
* and miscellaneous info. A memory list stream is also present,
|
||||||
|
* pointing to the same stack memory contained in the thread list,
|
||||||
|
* as well as a 256-byte region around the instruction address that
|
||||||
|
* was executing when the exception occurred. Stack memory is from
|
||||||
|
* 4 bytes below a thread's stack pointer up to the top of the
|
||||||
|
* memory region encompassing the stack. */
|
||||||
|
MD_NORMAL = 0x00000000,
|
||||||
|
MD_WITH_DATA_SEGS = 0x00000001,
|
||||||
|
MD_WITH_FULL_MEMORY = 0x00000002,
|
||||||
|
MD_WITH_HANDLE_DATA = 0x00000004,
|
||||||
|
MD_FILTER_MEMORY = 0x00000008,
|
||||||
|
MD_SCAN_MEMORY = 0x00000010,
|
||||||
|
MD_WITH_UNLOADED_MODULES = 0x00000020,
|
||||||
|
MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040,
|
||||||
|
MD_FILTER_MODULE_PATHS = 0x00000080,
|
||||||
|
MD_WITH_PROCESS_THREAD_DATA = 0x00000100,
|
||||||
|
MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200,
|
||||||
|
MD_WITHOUT_OPTIONAL_DATA = 0x00000400,
|
||||||
|
MD_WITH_FULL_MEMORY_INFO = 0x00000800,
|
||||||
|
MD_WITH_THREAD_INFO = 0x00001000,
|
||||||
|
MD_WITH_CODE_SEGS = 0x00002000,
|
||||||
|
MD_WITHOUT_AUXILLIARY_SEGS = 0x00004000,
|
||||||
|
MD_WITH_FULL_AUXILLIARY_STATE = 0x00008000,
|
||||||
|
MD_WITH_PRIVATE_WRITE_COPY_MEMORY = 0x00010000,
|
||||||
|
MD_IGNORE_INACCESSIBLE_MEMORY = 0x00020000,
|
||||||
|
MD_WITH_TOKEN_INFORMATION = 0x00040000
|
||||||
|
} MDType; /* MINIDUMP_TYPE */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t stream_type;
|
||||||
|
MDLocationDescriptor location;
|
||||||
|
} MDRawDirectory; /* MINIDUMP_DIRECTORY */
|
||||||
|
|
||||||
|
/* For (MDRawDirectory).stream_type */
|
||||||
|
typedef enum {
|
||||||
|
MD_UNUSED_STREAM = 0,
|
||||||
|
MD_RESERVED_STREAM_0 = 1,
|
||||||
|
MD_RESERVED_STREAM_1 = 2,
|
||||||
|
MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */
|
||||||
|
MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */
|
||||||
|
MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */
|
||||||
|
MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */
|
||||||
|
MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */
|
||||||
|
MD_THREAD_EX_LIST_STREAM = 8,
|
||||||
|
MD_MEMORY_64_LIST_STREAM = 9,
|
||||||
|
MD_COMMENT_STREAM_A = 10,
|
||||||
|
MD_COMMENT_STREAM_W = 11,
|
||||||
|
MD_HANDLE_DATA_STREAM = 12,
|
||||||
|
MD_FUNCTION_TABLE_STREAM = 13,
|
||||||
|
MD_UNLOADED_MODULE_LIST_STREAM = 14,
|
||||||
|
MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */
|
||||||
|
MD_MEMORY_INFO_LIST_STREAM = 16, /* MDRawMemoryInfoList */
|
||||||
|
MD_THREAD_INFO_LIST_STREAM = 17,
|
||||||
|
MD_HANDLE_OPERATION_LIST_STREAM = 18,
|
||||||
|
MD_LAST_RESERVED_STREAM = 0x0000ffff,
|
||||||
|
|
||||||
|
/* Breakpad extension types. 0x4767 = "Gg" */
|
||||||
|
MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */
|
||||||
|
MD_ASSERTION_INFO_STREAM = 0x47670002, /* MDRawAssertionInfo */
|
||||||
|
/* These are additional minidump stream values which are specific to
|
||||||
|
* the linux breakpad implementation. */
|
||||||
|
MD_LINUX_CPU_INFO = 0x47670003, /* /proc/cpuinfo */
|
||||||
|
MD_LINUX_PROC_STATUS = 0x47670004, /* /proc/$x/status */
|
||||||
|
MD_LINUX_LSB_RELEASE = 0x47670005, /* /etc/lsb-release */
|
||||||
|
MD_LINUX_CMD_LINE = 0x47670006, /* /proc/$x/cmdline */
|
||||||
|
MD_LINUX_ENVIRON = 0x47670007, /* /proc/$x/environ */
|
||||||
|
MD_LINUX_AUXV = 0x47670008, /* /proc/$x/auxv */
|
||||||
|
MD_LINUX_MAPS = 0x47670009, /* /proc/$x/maps */
|
||||||
|
MD_LINUX_DSO_DEBUG = 0x4767000A /* MDRawDebug{32,64} */
|
||||||
|
} MDStreamType; /* MINIDUMP_STREAM_TYPE */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t length; /* Length of buffer in bytes (not characters),
|
||||||
|
* excluding 0-terminator */
|
||||||
|
uint16_t buffer[1]; /* UTF-16-encoded, 0-terminated */
|
||||||
|
} MDString; /* MINIDUMP_STRING */
|
||||||
|
|
||||||
|
static const size_t MDString_minsize = offsetof(MDString, buffer[0]);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t thread_id;
|
||||||
|
uint32_t suspend_count;
|
||||||
|
uint32_t priority_class;
|
||||||
|
uint32_t priority;
|
||||||
|
uint64_t teb; /* Thread environment block */
|
||||||
|
MDMemoryDescriptor stack;
|
||||||
|
MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
|
||||||
|
} MDRawThread; /* MINIDUMP_THREAD */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t number_of_threads;
|
||||||
|
MDRawThread threads[1];
|
||||||
|
} MDRawThreadList; /* MINIDUMP_THREAD_LIST */
|
||||||
|
|
||||||
|
static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList,
|
||||||
|
threads[0]);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t base_of_image;
|
||||||
|
uint32_t size_of_image;
|
||||||
|
uint32_t checksum; /* 0 if unknown */
|
||||||
|
uint32_t time_date_stamp; /* time_t */
|
||||||
|
MDRVA module_name_rva; /* MDString, pathname or filename */
|
||||||
|
MDVSFixedFileInfo version_info;
|
||||||
|
|
||||||
|
/* The next field stores a CodeView record and is populated when a module's
|
||||||
|
* debug information resides in a PDB file. It identifies the PDB file. */
|
||||||
|
MDLocationDescriptor cv_record;
|
||||||
|
|
||||||
|
/* The next field is populated when a module's debug information resides
|
||||||
|
* in a DBG file. It identifies the DBG file. This field is effectively
|
||||||
|
* obsolete with modules built by recent toolchains. */
|
||||||
|
MDLocationDescriptor misc_record;
|
||||||
|
|
||||||
|
/* Alignment problem: reserved0 and reserved1 are defined by the platform
|
||||||
|
* SDK as 64-bit quantities. However, that results in a structure whose
|
||||||
|
* alignment is unpredictable on different CPUs and ABIs. If the ABI
|
||||||
|
* specifies full alignment of 64-bit quantities in structures (as ppc
|
||||||
|
* does), there will be padding between miscRecord and reserved0. If
|
||||||
|
* 64-bit quantities can be aligned on 32-bit boundaries (as on x86),
|
||||||
|
* this padding will not exist. (Note that the structure up to this point
|
||||||
|
* contains 1 64-bit member followed by 21 32-bit members.)
|
||||||
|
* As a workaround, reserved0 and reserved1 are instead defined here as
|
||||||
|
* four 32-bit quantities. This should be harmless, as there are
|
||||||
|
* currently no known uses for these fields. */
|
||||||
|
uint32_t reserved0[2];
|
||||||
|
uint32_t reserved1[2];
|
||||||
|
} MDRawModule; /* MINIDUMP_MODULE */
|
||||||
|
|
||||||
|
/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to
|
||||||
|
* be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC).
|
||||||
|
* This doesn't occur on systems that don't tail-pad in this manner. Define
|
||||||
|
* this macro to be the usable size of the MDRawModule struct, and use it in
|
||||||
|
* place of sizeof(MDRawModule). */
|
||||||
|
#define MD_MODULE_SIZE 108
|
||||||
|
|
||||||
|
|
||||||
|
/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70.
|
||||||
|
* Ref.: http://www.debuginfo.com/articles/debuginfomatch.html
|
||||||
|
* MDCVInfoPDB70 is the expected structure type with recent toolchains. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t signature;
|
||||||
|
uint32_t offset; /* Offset to debug data (expect 0 in minidump) */
|
||||||
|
} MDCVHeader;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
MDCVHeader cv_header;
|
||||||
|
uint32_t signature; /* time_t debug information created */
|
||||||
|
uint32_t age; /* revision of PDB file */
|
||||||
|
uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file */
|
||||||
|
} MDCVInfoPDB20;
|
||||||
|
|
||||||
|
static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20,
|
||||||
|
pdb_file_name[0]);
|
||||||
|
|
||||||
|
#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t cv_signature;
|
||||||
|
MDGUID signature; /* GUID, identifies PDB file */
|
||||||
|
uint32_t age; /* Identifies incremental changes to PDB file */
|
||||||
|
uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file,
|
||||||
|
* 0-terminated 8-bit character data (UTF-8?) */
|
||||||
|
} MDCVInfoPDB70;
|
||||||
|
|
||||||
|
static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70,
|
||||||
|
pdb_file_name[0]);
|
||||||
|
|
||||||
|
#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t data1[2];
|
||||||
|
uint32_t data2;
|
||||||
|
uint32_t data3;
|
||||||
|
uint32_t data4;
|
||||||
|
uint32_t data5[3];
|
||||||
|
uint8_t extra[2];
|
||||||
|
} MDCVInfoELF;
|
||||||
|
|
||||||
|
/* In addition to the two CodeView record formats above, used for linking
|
||||||
|
* to external pdb files, it is possible for debugging data to be carried
|
||||||
|
* directly in the CodeView record itself. These signature values will
|
||||||
|
* be found in the first 4 bytes of the CodeView record. Additional values
|
||||||
|
* not commonly experienced in the wild are given by "Microsoft Symbol and
|
||||||
|
* Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section
|
||||||
|
* 7.2. An in-depth description of the CodeView 4.1 format is given by
|
||||||
|
* "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/
|
||||||
|
* Microsoft Symbol File Internals/CodeView Subsections,
|
||||||
|
* http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf
|
||||||
|
*/
|
||||||
|
#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */
|
||||||
|
#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0,
|
||||||
|
* MS C7-format (/Z7). */
|
||||||
|
|
||||||
|
#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */
|
||||||
|
|
||||||
|
/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows
|
||||||
|
* structure is actually defined in WinNT.h. This structure is effectively
|
||||||
|
* obsolete with modules built by recent toolchains. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because
|
||||||
|
* this debug record type is mostly obsolete. */
|
||||||
|
uint32_t length; /* Length of entire MDImageDebugMisc structure */
|
||||||
|
uint8_t unicode; /* True if data is multibyte */
|
||||||
|
uint8_t reserved[3];
|
||||||
|
uint8_t data[1];
|
||||||
|
} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */
|
||||||
|
|
||||||
|
static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc,
|
||||||
|
data[0]);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t number_of_modules;
|
||||||
|
MDRawModule modules[1];
|
||||||
|
} MDRawModuleList; /* MINIDUMP_MODULE_LIST */
|
||||||
|
|
||||||
|
static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList,
|
||||||
|
modules[0]);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t number_of_memory_ranges;
|
||||||
|
MDMemoryDescriptor memory_ranges[1];
|
||||||
|
} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */
|
||||||
|
|
||||||
|
static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList,
|
||||||
|
memory_ranges[0]);
|
||||||
|
|
||||||
|
|
||||||
|
#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t exception_code; /* Windows: MDExceptionCodeWin,
|
||||||
|
* Mac OS X: MDExceptionMac,
|
||||||
|
* Linux: MDExceptionCodeLinux. */
|
||||||
|
uint32_t exception_flags; /* Windows: 1 if noncontinuable,
|
||||||
|
Mac OS X: MDExceptionCodeMac. */
|
||||||
|
uint64_t exception_record; /* Address (in the minidump-producing host's
|
||||||
|
* memory) of another MDException, for
|
||||||
|
* nested exceptions. */
|
||||||
|
uint64_t exception_address; /* The address that caused the exception.
|
||||||
|
* Mac OS X: exception subcode (which is
|
||||||
|
* typically the address). */
|
||||||
|
uint32_t number_parameters; /* Number of valid elements in
|
||||||
|
* exception_information. */
|
||||||
|
uint32_t __align;
|
||||||
|
uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS];
|
||||||
|
} MDException; /* MINIDUMP_EXCEPTION */
|
||||||
|
|
||||||
|
#include "minidump_exception_linux.h"
|
||||||
|
#include "minidump_exception_mac.h"
|
||||||
|
#include "minidump_exception_ps3.h"
|
||||||
|
#include "minidump_exception_solaris.h"
|
||||||
|
#include "minidump_exception_win32.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t thread_id; /* Thread in which the exception
|
||||||
|
* occurred. Corresponds to
|
||||||
|
* (MDRawThread).thread_id. */
|
||||||
|
uint32_t __align;
|
||||||
|
MDException exception_record;
|
||||||
|
MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
|
||||||
|
} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */
|
||||||
|
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
uint32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
|
||||||
|
uint32_t version_information; /* cpuid 1: eax */
|
||||||
|
uint32_t feature_information; /* cpuid 1: edx */
|
||||||
|
uint32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
|
||||||
|
} x86_cpu_info;
|
||||||
|
struct {
|
||||||
|
uint32_t cpuid;
|
||||||
|
uint32_t elf_hwcaps; /* linux specific, 0 otherwise */
|
||||||
|
} arm_cpu_info;
|
||||||
|
struct {
|
||||||
|
uint64_t processor_features[2];
|
||||||
|
} other_cpu_info;
|
||||||
|
} MDCPUInformation; /* CPU_INFORMATION */
|
||||||
|
|
||||||
|
/* For (MDCPUInformation).arm_cpu_info.elf_hwcaps.
|
||||||
|
* This matches the Linux kernel definitions from <asm/hwcaps.h> */
|
||||||
|
typedef enum {
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_SWP = (1 << 0),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_HALF = (1 << 1),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_THUMB = (1 << 2),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_26BIT = (1 << 3),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_FAST_MULT = (1 << 4),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_FPA = (1 << 5),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_VFP = (1 << 6),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_EDSP = (1 << 7),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_JAVA = (1 << 8),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_IWMMXT = (1 << 9),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_CRUNCH = (1 << 10),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_THUMBEE = (1 << 11),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_NEON = (1 << 12),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_VFPv3 = (1 << 13),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_VFPv3D16 = (1 << 14),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_TLS = (1 << 15),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_VFPv4 = (1 << 16),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_IDIVA = (1 << 17),
|
||||||
|
MD_CPU_ARM_ELF_HWCAP_IDIVT = (1 << 18),
|
||||||
|
} MDCPUInformationARMElfHwCaps;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO
|
||||||
|
* structure as returned by GetSystemInfo */
|
||||||
|
uint16_t processor_architecture;
|
||||||
|
uint16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */
|
||||||
|
/* ARM: 6 = ARMv6, 7 = ARMv7 ... */
|
||||||
|
uint16_t processor_revision; /* x86: 0xMMSS, where MM=model,
|
||||||
|
* SS=stepping */
|
||||||
|
/* ARM: 0 */
|
||||||
|
|
||||||
|
uint8_t number_of_processors;
|
||||||
|
uint8_t product_type; /* Windows: VER_NT_* from WinNT.h */
|
||||||
|
|
||||||
|
/* The next 5 fields are from the OSVERSIONINFO structure as returned
|
||||||
|
* by GetVersionEx */
|
||||||
|
uint32_t major_version;
|
||||||
|
uint32_t minor_version;
|
||||||
|
uint32_t build_number;
|
||||||
|
uint32_t platform_id;
|
||||||
|
MDRVA csd_version_rva; /* MDString further identifying the
|
||||||
|
* host OS.
|
||||||
|
* Windows: name of the installed OS
|
||||||
|
* service pack.
|
||||||
|
* Mac OS X: the Apple OS build number
|
||||||
|
* (sw_vers -buildVersion).
|
||||||
|
* Linux: uname -srvmo */
|
||||||
|
|
||||||
|
uint16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */
|
||||||
|
uint16_t reserved2;
|
||||||
|
|
||||||
|
MDCPUInformation cpu;
|
||||||
|
} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */
|
||||||
|
|
||||||
|
/* For (MDRawSystemInfo).processor_architecture: */
|
||||||
|
typedef enum {
|
||||||
|
MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */
|
||||||
|
MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */
|
||||||
|
MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */
|
||||||
|
MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */
|
||||||
|
MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX
|
||||||
|
* (Super-H) */
|
||||||
|
MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */
|
||||||
|
MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */
|
||||||
|
MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */
|
||||||
|
MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL
|
||||||
|
* (Microsoft Intermediate Language) */
|
||||||
|
MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */
|
||||||
|
MD_CPU_ARCHITECTURE_X86_WIN64 = 10,
|
||||||
|
/* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
|
||||||
|
MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */
|
||||||
|
MD_CPU_ARCHITECTURE_PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */
|
||||||
|
MD_CPU_ARCHITECTURE_ARM64 = 0x8003, /* Breakpad-defined value for ARM64 */
|
||||||
|
MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
|
||||||
|
} MDCPUArchitecture;
|
||||||
|
|
||||||
|
/* For (MDRawSystemInfo).platform_id: */
|
||||||
|
typedef enum {
|
||||||
|
MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */
|
||||||
|
MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */
|
||||||
|
MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */
|
||||||
|
MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH
|
||||||
|
* (Windows CE, Windows Mobile, "Handheld") */
|
||||||
|
|
||||||
|
/* The following values are Breakpad-defined. */
|
||||||
|
MD_OS_UNIX = 0x8000, /* Generic Unix-ish */
|
||||||
|
MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */
|
||||||
|
MD_OS_IOS = 0x8102, /* iOS */
|
||||||
|
MD_OS_LINUX = 0x8201, /* Linux */
|
||||||
|
MD_OS_SOLARIS = 0x8202, /* Solaris */
|
||||||
|
MD_OS_ANDROID = 0x8203, /* Android */
|
||||||
|
MD_OS_PS3 = 0x8204, /* PS3 */
|
||||||
|
MD_OS_NACL = 0x8205 /* Native Client (NaCl) */
|
||||||
|
} MDOSPlatform;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t year;
|
||||||
|
uint16_t month;
|
||||||
|
uint16_t day_of_week;
|
||||||
|
uint16_t day;
|
||||||
|
uint16_t hour;
|
||||||
|
uint16_t minute;
|
||||||
|
uint16_t second;
|
||||||
|
uint16_t milliseconds;
|
||||||
|
} MDSystemTime; /* SYSTEMTIME */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* Required field. The bias is the difference, in minutes, between
|
||||||
|
* Coordinated Universal Time (UTC) and local time.
|
||||||
|
* Formula: UTC = local time + bias */
|
||||||
|
int32_t bias;
|
||||||
|
/* A description for standard time. For example, "EST" could indicate Eastern
|
||||||
|
* Standard Time. In practice this contains the full time zone names. This
|
||||||
|
* string can be empty. */
|
||||||
|
uint16_t standard_name[32]; /* UTF-16-encoded, 0-terminated */
|
||||||
|
/* A MDSystemTime structure that contains a date and local time when the
|
||||||
|
* transition from daylight saving time to standard time occurs on this
|
||||||
|
* operating system. If the time zone does not support daylight saving time,
|
||||||
|
* the month member in the MDSystemTime structure is zero. */
|
||||||
|
MDSystemTime standard_date;
|
||||||
|
/* The bias value to be used during local time translations that occur during
|
||||||
|
* standard time. */
|
||||||
|
int32_t standard_bias;
|
||||||
|
/* A description for daylight saving time. For example, "PDT" could indicate
|
||||||
|
* Pacific Daylight Time. In practice this contains the full time zone names.
|
||||||
|
* This string can be empty. */
|
||||||
|
uint16_t daylight_name[32]; /* UTF-16-encoded, 0-terminated */
|
||||||
|
/* A MDSystemTime structure that contains a date and local time when the
|
||||||
|
* transition from standard time to daylight saving time occurs on this
|
||||||
|
* operating system. If the time zone does not support daylight saving time,
|
||||||
|
* the month member in the MDSystemTime structure is zero.*/
|
||||||
|
MDSystemTime daylight_date;
|
||||||
|
/* The bias value to be used during local time translations that occur during
|
||||||
|
* daylight saving time. */
|
||||||
|
int32_t daylight_bias;
|
||||||
|
} MDTimeZoneInformation; /* TIME_ZONE_INFORMATION */
|
||||||
|
|
||||||
|
/* MAX_PATH from windef.h */
|
||||||
|
#define MD_MAX_PATH 260
|
||||||
|
|
||||||
|
/* The miscellaneous information stream contains a variety
|
||||||
|
* of small pieces of information. A member is valid if
|
||||||
|
* it's within the available size and its corresponding
|
||||||
|
* bit is set. */
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */
|
||||||
|
uint32_t flags1;
|
||||||
|
|
||||||
|
/* The next field is only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROCESS_ID. */
|
||||||
|
uint32_t process_id;
|
||||||
|
|
||||||
|
/* The next 3 fields are only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROCESS_TIMES. */
|
||||||
|
uint32_t process_create_time; /* time_t process started */
|
||||||
|
uint32_t process_user_time; /* seconds of user CPU time */
|
||||||
|
uint32_t process_kernel_time; /* seconds of kernel CPU time */
|
||||||
|
|
||||||
|
/* The following fields are not present in MINIDUMP_MISC_INFO but are
|
||||||
|
* in MINIDUMP_MISC_INFO_2. When this struct is populated, these values
|
||||||
|
* may not be set. Use flags1 and size_of_info to determine whether these
|
||||||
|
* values are present. These are only valid when flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */
|
||||||
|
uint32_t processor_max_mhz;
|
||||||
|
uint32_t processor_current_mhz;
|
||||||
|
uint32_t processor_mhz_limit;
|
||||||
|
uint32_t processor_max_idle_state;
|
||||||
|
uint32_t processor_current_idle_state;
|
||||||
|
|
||||||
|
/* The following fields are not present in MINIDUMP_MISC_INFO_2 but are
|
||||||
|
* in MINIDUMP_MISC_INFO_3. When this struct is populated, these values
|
||||||
|
* may not be set. Use flags1 and size_of_info to determine whether these
|
||||||
|
* values are present. */
|
||||||
|
|
||||||
|
/* The following field is only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY. */
|
||||||
|
uint32_t process_integrity_level;
|
||||||
|
|
||||||
|
/* The following field is only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS. */
|
||||||
|
uint32_t process_execute_flags;
|
||||||
|
|
||||||
|
/* The following field is only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_PROTECTED_PROCESS. */
|
||||||
|
uint32_t protected_process;
|
||||||
|
|
||||||
|
/* The following 2 fields are only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_TIMEZONE. */
|
||||||
|
uint32_t time_zone_id;
|
||||||
|
MDTimeZoneInformation time_zone;
|
||||||
|
|
||||||
|
/* The following fields are not present in MINIDUMP_MISC_INFO_3 but are
|
||||||
|
* in MINIDUMP_MISC_INFO_4. When this struct is populated, these values
|
||||||
|
* may not be set. Use flags1 and size_of_info to determine whether these
|
||||||
|
* values are present. */
|
||||||
|
|
||||||
|
/* The following 2 fields are only valid if flags1 contains
|
||||||
|
* MD_MISCINFO_FLAGS1_BUILDSTRING. */
|
||||||
|
uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */
|
||||||
|
uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */
|
||||||
|
} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2,
|
||||||
|
* MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4,
|
||||||
|
* MINIDUMP_MISC_INFO_N */
|
||||||
|
|
||||||
|
static const size_t MD_MISCINFO_SIZE =
|
||||||
|
offsetof(MDRawMiscInfo, processor_max_mhz);
|
||||||
|
static const size_t MD_MISCINFO2_SIZE =
|
||||||
|
offsetof(MDRawMiscInfo, process_integrity_level);
|
||||||
|
static const size_t MD_MISCINFO3_SIZE =
|
||||||
|
offsetof(MDRawMiscInfo, build_string[0]);
|
||||||
|
static const size_t MD_MISCINFO4_SIZE = sizeof(MDRawMiscInfo);
|
||||||
|
|
||||||
|
/* For (MDRawMiscInfo).flags1. These values indicate which fields in the
|
||||||
|
* MDRawMiscInfoStructure are valid. */
|
||||||
|
typedef enum {
|
||||||
|
MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001,
|
||||||
|
/* MINIDUMP_MISC1_PROCESS_ID */
|
||||||
|
MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002,
|
||||||
|
/* MINIDUMP_MISC1_PROCESS_TIMES */
|
||||||
|
MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004,
|
||||||
|
/* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */
|
||||||
|
MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY = 0x00000010,
|
||||||
|
/* MINIDUMP_MISC3_PROCESS_INTEGRITY */
|
||||||
|
MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS = 0x00000020,
|
||||||
|
/* MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS */
|
||||||
|
MD_MISCINFO_FLAGS1_TIMEZONE = 0x00000040,
|
||||||
|
/* MINIDUMP_MISC3_TIMEZONE */
|
||||||
|
MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080,
|
||||||
|
/* MINIDUMP_MISC3_PROTECTED_PROCESS */
|
||||||
|
MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100,
|
||||||
|
/* MINIDUMP_MISC4_BUILDSTRING */
|
||||||
|
} MDMiscInfoFlags1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Around DbgHelp version 6.0, the style of new LIST structures changed
|
||||||
|
* from including an array of length 1 at the end of the struct to
|
||||||
|
* represent the variable-length data to including explicit
|
||||||
|
* "size of header", "size of entry" and "number of entries" fields
|
||||||
|
* in the header, presumably to allow backwards-compatibly-extending
|
||||||
|
* the structures in the future. The actual list entries follow the
|
||||||
|
* header data directly in this case.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size_of_header; /* sizeof(MDRawMemoryInfoList) */
|
||||||
|
uint32_t size_of_entry; /* sizeof(MDRawMemoryInfo) */
|
||||||
|
uint64_t number_of_entries;
|
||||||
|
} MDRawMemoryInfoList; /* MINIDUMP_MEMORY_INFO_LIST */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t base_address; /* Base address of a region of pages */
|
||||||
|
uint64_t allocation_base; /* Base address of a range of pages
|
||||||
|
* within this region. */
|
||||||
|
uint32_t allocation_protection; /* Memory protection when this region
|
||||||
|
* was originally allocated:
|
||||||
|
* MDMemoryProtection */
|
||||||
|
uint32_t __alignment1;
|
||||||
|
uint64_t region_size;
|
||||||
|
uint32_t state; /* MDMemoryState */
|
||||||
|
uint32_t protection; /* MDMemoryProtection */
|
||||||
|
uint32_t type; /* MDMemoryType */
|
||||||
|
uint32_t __alignment2;
|
||||||
|
} MDRawMemoryInfo; /* MINIDUMP_MEMORY_INFO */
|
||||||
|
|
||||||
|
/* For (MDRawMemoryInfo).state */
|
||||||
|
typedef enum {
|
||||||
|
MD_MEMORY_STATE_COMMIT = 0x1000, /* physical storage has been allocated */
|
||||||
|
MD_MEMORY_STATE_RESERVE = 0x2000, /* reserved, but no physical storage */
|
||||||
|
MD_MEMORY_STATE_FREE = 0x10000 /* available to be allocated */
|
||||||
|
} MDMemoryState;
|
||||||
|
|
||||||
|
/* For (MDRawMemoryInfo).allocation_protection and .protection */
|
||||||
|
typedef enum {
|
||||||
|
MD_MEMORY_PROTECT_NOACCESS = 0x01, /* PAGE_NOACCESS */
|
||||||
|
MD_MEMORY_PROTECT_READONLY = 0x02, /* PAGE_READONLY */
|
||||||
|
MD_MEMORY_PROTECT_READWRITE = 0x04, /* PAGE_READWRITE */
|
||||||
|
MD_MEMORY_PROTECT_WRITECOPY = 0x08, /* PAGE_WRITECOPY */
|
||||||
|
MD_MEMORY_PROTECT_EXECUTE = 0x10, /* PAGE_EXECUTE */
|
||||||
|
MD_MEMORY_PROTECT_EXECUTE_READ = 0x20, /* PAGE_EXECUTE_READ */
|
||||||
|
MD_MEMORY_PROTECT_EXECUTE_READWRITE = 0x40, /* PAGE_EXECUTE_READWRITE */
|
||||||
|
MD_MEMORY_PROTECT_EXECUTE_WRITECOPY = 0x80, /* PAGE_EXECUTE_WRITECOPY */
|
||||||
|
/* These options can be combined with the previous flags. */
|
||||||
|
MD_MEMORY_PROTECT_GUARD = 0x100, /* PAGE_GUARD */
|
||||||
|
MD_MEMORY_PROTECT_NOCACHE = 0x200, /* PAGE_NOCACHE */
|
||||||
|
MD_MEMORY_PROTECT_WRITECOMBINE = 0x400, /* PAGE_WRITECOMBINE */
|
||||||
|
} MDMemoryProtection;
|
||||||
|
|
||||||
|
/* Used to mask the mutually exclusive options from the combinable flags. */
|
||||||
|
const uint32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF;
|
||||||
|
|
||||||
|
/* For (MDRawMemoryInfo).type */
|
||||||
|
typedef enum {
|
||||||
|
MD_MEMORY_TYPE_PRIVATE = 0x20000, /* not shared by other processes */
|
||||||
|
MD_MEMORY_TYPE_MAPPED = 0x40000, /* mapped into the view of a section */
|
||||||
|
MD_MEMORY_TYPE_IMAGE = 0x1000000 /* mapped into the view of an image */
|
||||||
|
} MDMemoryType;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Breakpad extension types
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* validity is a bitmask with values from MDBreakpadInfoValidity, indicating
|
||||||
|
* which of the other fields in the structure are valid. */
|
||||||
|
uint32_t validity;
|
||||||
|
|
||||||
|
/* Thread ID of the handler thread. dump_thread_id should correspond to
|
||||||
|
* the thread_id of an MDRawThread in the minidump's MDRawThreadList if
|
||||||
|
* a dedicated thread in that list was used to produce the minidump. If
|
||||||
|
* the MDRawThreadList does not contain a dedicated thread used to produce
|
||||||
|
* the minidump, this field should be set to 0 and the validity field
|
||||||
|
* must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */
|
||||||
|
uint32_t dump_thread_id;
|
||||||
|
|
||||||
|
/* Thread ID of the thread that requested the minidump be produced. As
|
||||||
|
* with dump_thread_id, requesting_thread_id should correspond to the
|
||||||
|
* thread_id of an MDRawThread in the minidump's MDRawThreadList. For
|
||||||
|
* minidumps produced as a result of an exception, requesting_thread_id
|
||||||
|
* will be the same as the MDRawExceptionStream's thread_id field. For
|
||||||
|
* minidumps produced "manually" at the program's request,
|
||||||
|
* requesting_thread_id will indicate which thread caused the dump to be
|
||||||
|
* written. If the minidump was produced at the request of something
|
||||||
|
* other than a thread in the MDRawThreadList, this field should be set
|
||||||
|
* to 0 and the validity field must not contain
|
||||||
|
* MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */
|
||||||
|
uint32_t requesting_thread_id;
|
||||||
|
} MDRawBreakpadInfo;
|
||||||
|
|
||||||
|
/* For (MDRawBreakpadInfo).validity: */
|
||||||
|
typedef enum {
|
||||||
|
/* When set, the dump_thread_id field is valid. */
|
||||||
|
MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0,
|
||||||
|
|
||||||
|
/* When set, the requesting_thread_id field is valid. */
|
||||||
|
MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1
|
||||||
|
} MDBreakpadInfoValidity;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* expression, function, and file are 0-terminated UTF-16 strings. They
|
||||||
|
* may be truncated if necessary, but should always be 0-terminated when
|
||||||
|
* written to a file.
|
||||||
|
* Fixed-length strings are used because MiniDumpWriteDump doesn't offer
|
||||||
|
* a way for user streams to point to arbitrary RVAs for strings. */
|
||||||
|
uint16_t expression[128]; /* Assertion that failed... */
|
||||||
|
uint16_t function[128]; /* ...within this function... */
|
||||||
|
uint16_t file[128]; /* ...in this file... */
|
||||||
|
uint32_t line; /* ...at this line. */
|
||||||
|
uint32_t type;
|
||||||
|
} MDRawAssertionInfo;
|
||||||
|
|
||||||
|
/* For (MDRawAssertionInfo).type: */
|
||||||
|
typedef enum {
|
||||||
|
MD_ASSERTION_INFO_TYPE_UNKNOWN = 0,
|
||||||
|
|
||||||
|
/* Used for assertions that would be raised by the MSVC CRT but are
|
||||||
|
* directed to an invalid parameter handler instead. */
|
||||||
|
MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER,
|
||||||
|
|
||||||
|
/* Used for assertions that would be raised by the MSVC CRT but are
|
||||||
|
* directed to a pure virtual call handler instead. */
|
||||||
|
MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL
|
||||||
|
} MDAssertionInfoData;
|
||||||
|
|
||||||
|
/* These structs are used to store the DSO debug data in Linux minidumps,
|
||||||
|
* which is necessary for converting minidumps to usable coredumps.
|
||||||
|
* Because of a historical accident, several fields are variably encoded
|
||||||
|
* according to client word size, so tools potentially need to support both. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t addr;
|
||||||
|
MDRVA name;
|
||||||
|
uint32_t ld;
|
||||||
|
} MDRawLinkMap32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t version;
|
||||||
|
MDRVA map; /* array of MDRawLinkMap32 */
|
||||||
|
uint32_t dso_count;
|
||||||
|
uint32_t brk;
|
||||||
|
uint32_t ldbase;
|
||||||
|
uint32_t dynamic;
|
||||||
|
} MDRawDebug32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t addr;
|
||||||
|
MDRVA name;
|
||||||
|
uint64_t ld;
|
||||||
|
} MDRawLinkMap64;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t version;
|
||||||
|
MDRVA map; /* array of MDRawLinkMap64 */
|
||||||
|
uint32_t dso_count;
|
||||||
|
uint64_t brk;
|
||||||
|
uint64_t ldbase;
|
||||||
|
uint64_t dynamic;
|
||||||
|
} MDRawDebug64;
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */
|
Loading…
Reference in New Issue