You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
4.6 KiB

/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
/*****************************************************************************
*
* $/Plasma20/Sources/Plasma/NucleusLib/pnCrashExe/pnCreTools.cpp
*
***/
#include "../Pch.h"
#pragma hdrstop
//============================================================================
namespace Crash {
//============================================================================
/*****************************************************************************
*
* Internal functions
*
***/
//===========================================================================
static BOOL MYIMAGEAPI iSymGetModuleInfo (
HANDLE,
DWORD,
IMAGEHLP_MODULE * ModuleInfo
) {
ZEROPTR(ModuleInfo);
return false;
}
//===========================================================================
static BOOL MYIMAGEAPI iStackWalk (
DWORD,
HANDLE,
HANDLE,
LPSTACKFRAME,
LPVOID,
PREAD_PROCESS_MEMORY_ROUTINE,
PFUNCTION_TABLE_ACCESS_ROUTINE,
PGET_MODULE_BASE_ROUTINE,
PTRANSLATE_ADDRESS_ROUTINE
) {
return false;
}
//===========================================================================
static LPVOID MYIMAGEAPI iSymFunctionTableAccess (
HANDLE,
DWORD
) {
return nil;
}
//===========================================================================
static DWORD MYIMAGEAPI iSymGetModuleBase (
HANDLE,
DWORD
) {
return 0;
}
//===========================================================================
static BOOL MYIMAGEAPI iSymGetSymFromAddr (
HANDLE,
DWORD,
LPDWORD Displacement,
PIMAGEHLP_SYMBOL Symbol
) {
*Displacement = 0;
ZEROPTR(Symbol);
return false;
}
/*****************************************************************************
*
* CImageHelp
*
***/
//============================================================================
CImageHelp::CImageHelp (HINSTANCE instance)
: m_libInst(nil),
m_process(nil)
{
// get program directory and filename
if (!GetModuleFileNameA(instance, m_appPath, arrsize(m_appPath)))
m_appPath[0] = 0;
if (nil != (m_appName = StrChrR(m_appPath, '\\')))
*m_appName++ = '\0';
else
m_appName = m_appPath;
// initialize symbols
for (;;) {
if (nil == (m_libInst = LoadLibrary("ImageHlp.dll")))
break;
// initialize symbols for this process
BOOL (MYIMAGEAPI * SymInitialize)(HANDLE hProcess, char * path, BOOL fInvade);
* (FARPROC *) &SymInitialize = GetProcAddress(m_libInst, "SymInitialize");
if (!SymInitialize)
break;
HANDLE hProcess = GetCurrentProcess();
if (!SymInitialize(hProcess, m_appPath, false))
break;
// import functions
FARPROC proc;
#define BIND(x) * (FARPROC *) &(x) = ((proc = GetProcAddress(m_libInst, #x)) != nil) ? proc : (FARPROC) i##x
BIND(SymGetModuleInfo);
BIND(StackWalk);
BIND(SymFunctionTableAccess);
BIND(SymGetModuleBase);
BIND(SymGetSymFromAddr);
#undef BIND
// success
m_process = hProcess;
return;
}
// failure!
if (m_libInst) {
FreeLibrary(m_libInst);
m_libInst = nil;
}
#define INIT(x) x = i##x
INIT(SymGetModuleInfo);
INIT(StackWalk);
INIT(SymFunctionTableAccess);
INIT(SymGetModuleBase);
INIT(SymGetSymFromAddr);
#undef INIT
}
//============================================================================
CImageHelp::~CImageHelp () {
if (m_process) {
BOOL (MYIMAGEAPI * SymCleanup)(HANDLE hProcess);
* (FARPROC *) &SymCleanup = GetProcAddress(m_libInst, "SymCleanup");
if (SymCleanup)
SymCleanup(m_process);
m_process = 0;
}
if (m_libInst) {
FreeLibrary(m_libInst);
m_libInst = 0;
}
}
//============================================================================
} // namespace Crash
//============================================================================