Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion library/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ elseif(UNIX)
set(PROJECT_LIBS rt dl dfhack-md5 ${DFHACK_TINYXML})
else(WIN32)
# FIXME: do we really need psapi?
set(PROJECT_LIBS psapi dfhack-md5 ${DFHACK_TINYXML})
set(PROJECT_LIBS psapi dbghelp dfhack-md5 ${DFHACK_TINYXML})
endif()

set(VERSION_SRCS DFHackVersion.cpp)
Expand Down Expand Up @@ -418,6 +418,9 @@ target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_static dfhack-ve
set_target_properties(dfhack PROPERTIES INTERFACE_LINK_LIBRARIES "")

target_link_libraries(dfhack-client protobuf-lite clsocket jsoncpp_static)
if(WIN32)
target_link_libraries(dfhack-client dbghelp)
endif()
target_link_libraries(dfhack-run dfhack-client)

if(APPLE)
Expand Down
34 changes: 30 additions & 4 deletions library/MiscUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ distribution.
// We don't want min and max macros
#define NOMINMAX
#include <Windows.h>
#include <DbgHelp.h>
#else
#include <sys/time.h>
#include <ctime>
Expand Down Expand Up @@ -687,10 +688,35 @@ DFHACK_EXPORT std::string cxx_demangle(const std::string &mangled_name, std::str
else *status_out = "unknown error";
}
return out;
#else
if (status_out) {
*status_out = "not implemented on this platform";
#elif defined(_WIN32)
const char* mangled_cstr = mangled_name.c_str();

char demangledBuf[MAX_SYM_NAME];
DWORD flags = UNDNAME_NAME_ONLY;

if (mangled_cstr[0] == '.') {
// Symbol is a type, demangle as such
// Flag is actually "UNDNAME_TYPE_ONLY", but hasn't been renamed for this method yet.
flags |= UNDNAME_NO_ARGUMENTS;
mangled_cstr++;
}
return "";

DWORD res = UnDecorateSymbolName(mangled_cstr, (char*)&demangledBuf, MAX_SYM_NAME, flags);

std::string out;
if (res == 0) {
// Demangling failed
*status_out = "demangling failed";
return out;
}
if (demangledBuf[0] == '?') {
// Wine failed to demangle symbol
*status_out = "wine demangling failed";
return out;
}
out = (char*)&demangledBuf;
return out;
#else
#error Platform does not support symbol demangling
#endif
}
14 changes: 10 additions & 4 deletions library/Process-darwin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ distribution.
#include "Internal.h"
#include "MemAccess.h"
#include "Memory.h"
#include "MiscUtils.h"
#include "VersionInfo.h"
#include "VersionInfoFactory.h"
#include "md5wrapper.h"
Expand Down Expand Up @@ -122,13 +123,18 @@ Process::~Process()

string Process::doReadClassName (void * vptr)
{
//FIXME: BAD!!!!!
char * typeinfo = Process::readPtr(((char *)vptr - sizeof(void*)));
char * typestring = Process::readPtr(typeinfo + sizeof(void*));
string raw = readCString(typestring);
size_t start = raw.find_first_of("abcdefghijklmnopqrstuvwxyz");// trim numbers
size_t end = raw.length();
return raw.substr(start,end-start);

string status;
string demangled = cxx_demangle(raw, &status);

if (demangled.length() == 0) {
return "dummy";
}

return demangled;
}

const char *
Expand Down
18 changes: 12 additions & 6 deletions library/Process-linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ distribution.
#include "Internal.h"
#include "MemAccess.h"
#include "Memory.h"
#include "MiscUtils.h"
#include "VersionInfo.h"
#include "VersionInfoFactory.h"
#include "modules/Filesystem.h"
Expand Down Expand Up @@ -120,13 +121,18 @@ Process::~Process()

string Process::doReadClassName (void * vptr)
{
//FIXME: BAD!!!!!
char * typeinfo = Process::readPtr(((char *)vptr - sizeof(void*)));
char * typestring = Process::readPtr(typeinfo + sizeof(void*));
char* typeinfo = Process::readPtr(((char *)vptr - sizeof(void*)));
char* typestring = Process::readPtr(typeinfo + sizeof(void*));
string raw = readCString(typestring);
size_t start = raw.find_first_of("abcdefghijklmnopqrstuvwxyz");// trim numbers
size_t end = raw.length();
return raw.substr(start,end-start);

string status;
string demangled = cxx_demangle(raw, &status);

if (demangled.length() == 0) {
return "dummy";
}

return demangled;
}

//FIXME: cross-reference with ELF segment entries?
Expand Down
26 changes: 17 additions & 9 deletions library/Process-windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ distribution.
#include "Internal.h"
#include "MemAccess.h"
#include "Memory.h"
#include "MiscUtils.h"
#include "VersionInfo.h"
#include "VersionInfoFactory.h"

Expand Down Expand Up @@ -128,21 +129,28 @@ Process::~Process()

string Process::doReadClassName (void * vptr)
{
char * rtti = readPtr((char *)vptr - sizeof(void*));
char* rtti = readPtr((char *)vptr - sizeof(void*));
#ifdef DFHACK64
void *base;
void* base;
if (!RtlPcToFileHeader(rtti, &base))
return "dummy";
char * typeinfo = (char *)base + readDWord(rtti + 0xC);
string raw = readCString(typeinfo + 0x10+4); // skips the .?AV
char* typeinfo = (char *)base + readDWord(rtti + 0xC);
std::string raw = readCString(typeinfo + 0x10);
#else
char * typeinfo = readPtr(rtti + 0xC);
string raw = readCString(typeinfo + 0xC); // skips the .?AV
char* typeinfo = readPtr(rtti + 0xC);
std::string raw = readCString(typeinfo + 0x8);
#endif
if (!raw.length())
if (raw.length() == 0)
return "dummy";
raw.resize(raw.length() - 2);// trim @@ from end
return raw;

string status;
string demangled = cxx_demangle(raw, &status);

if (demangled.length() == 0) {
return "dummy";
}

return demangled;
}

/*
Expand Down
Loading