123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #if MPT_COMPILER_MSVC
- #pragma warning(push)
- #pragma warning(disable:4091)
- #endif
- #include <dbghelp.h>
- #if MPT_COMPILER_MSVC
- #pragma warning(pop)
- #endif
- OPENMPT_NAMESPACE_BEGIN
- typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(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
- );
- static bool WriteMemoryDump(_EXCEPTION_POINTERS *pExceptionInfo, const TCHAR *filename, bool fullMemDump)
- {
- bool result = false;
- HMODULE hDll = ::LoadLibrary(_T("DBGHELP.DLL"));
- if (hDll)
- {
- MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");
- if (pDump)
- {
- HANDLE hFile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
- if(pExceptionInfo)
- {
- ExInfo.ThreadId = ::GetCurrentThreadId();
- ExInfo.ExceptionPointers = pExceptionInfo;
- ExInfo.ClientPointers = NULL;
- }
- pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,
- fullMemDump ?
- (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithThreadInfo | MiniDumpWithProcessThreadData | MiniDumpWithFullMemoryInfo
- #if MPT_COMPILER_MSVC
- | MiniDumpIgnoreInaccessibleMemory | MiniDumpWithTokenInformation
- #endif
- )
- :
- MiniDumpNormal,
- pExceptionInfo ? &ExInfo : NULL, NULL, NULL);
- ::CloseHandle(hFile);
- result = true;
- }
- }
- ::FreeLibrary(hDll);
- }
- return result;
- }
- OPENMPT_NAMESPACE_END
|