split out memory.xml reading functionality out of the processenumerator
parent
30d80debfb
commit
29c0932ff7
@ -0,0 +1,46 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/dfhack
|
||||
Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
#ifndef MEMINFO_MANAGER_H_INCLUDED
|
||||
#define MEMINFO_MANAGER_H_INCLUDED
|
||||
|
||||
namespace DFHack
|
||||
{
|
||||
class MemInfoManager
|
||||
{
|
||||
friend class ProcessEnumerator;
|
||||
public:
|
||||
MemInfoManager(string path_to_xml);
|
||||
// memory info entries loaded from a file
|
||||
bool loadFile( string path_to_xml);
|
||||
bool isInErrorState() const {return error;};
|
||||
private:
|
||||
std::vector<memory_info> meminfo;
|
||||
void ParseVTable(TiXmlElement* vtable, memory_info& mem);
|
||||
void ParseEntry (TiXmlElement* entry, memory_info& mem, map <string ,TiXmlElement *>& knownEntries);
|
||||
bool error;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,116 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/dfhack
|
||||
Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
#include "DFCommonInternal.h"
|
||||
using namespace DFHack;
|
||||
|
||||
/// HACK: global variables (only one process can be attached at the same time.)
|
||||
Process * DFHack::g_pProcess; ///< current process. non-NULL when picked
|
||||
ProcessHandle DFHack::g_ProcessHandle; ///< cache of handle to current process. used for speed reasons
|
||||
int DFHack::g_ProcessMemFile; ///< opened /proc/PID/mem, valid when attached
|
||||
|
||||
class DFHack::ProcessEnumerator::Private
|
||||
{
|
||||
public:
|
||||
Private(){};
|
||||
MemInfoManager *meminfo;
|
||||
std::vector<Process *> processes;
|
||||
};
|
||||
|
||||
bool ProcessEnumerator::findProcessess()
|
||||
{
|
||||
DIR *dir_p;
|
||||
struct dirent *dir_entry_p;
|
||||
string dir_name;
|
||||
string exe_link;
|
||||
string cwd_link;
|
||||
string cmdline_path;
|
||||
string cmdline;
|
||||
|
||||
// ALERT: buffer overrun potential
|
||||
|
||||
int errorcount;
|
||||
int result;
|
||||
|
||||
errorcount=0;
|
||||
result=0;
|
||||
// Open /proc/ directory
|
||||
dir_p = opendir("/proc/");
|
||||
// Reading /proc/ entries
|
||||
while(NULL != (dir_entry_p = readdir(dir_p)))
|
||||
{
|
||||
// Only PID folders (numbers)
|
||||
if (strspn(dir_entry_p->d_name, "0123456789") != strlen(dir_entry_p->d_name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Process *p = new Process(atoi(dir_entry_p->d_name),d->meminfo->meminfo);
|
||||
if(p->isIdentified())
|
||||
{
|
||||
d->processes.push_back(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
closedir(dir_p);
|
||||
// return value depends on if we found some DF processes
|
||||
if(d->processes.size())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t ProcessEnumerator::size()
|
||||
{
|
||||
return d->processes.size();
|
||||
};
|
||||
|
||||
|
||||
Process * ProcessEnumerator::operator[](uint32_t index)
|
||||
{
|
||||
assert(index < d->processes.size());
|
||||
return d->processes[index];
|
||||
};
|
||||
|
||||
|
||||
ProcessEnumerator::ProcessEnumerator( string path_to_xml )
|
||||
: d(new Private())
|
||||
{
|
||||
d->meminfo = new MemInfoManager(path_to_xml);
|
||||
}
|
||||
|
||||
|
||||
ProcessEnumerator::~ProcessEnumerator()
|
||||
{
|
||||
// delete all processes
|
||||
for(uint32_t i = 0;i < d->processes.size();i++)
|
||||
{
|
||||
delete d->processes[i];
|
||||
}
|
||||
delete d->meminfo;
|
||||
delete d;
|
||||
}
|
@ -0,0 +1,129 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/dfhack
|
||||
Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
#include "DFCommonInternal.h"
|
||||
using namespace DFHack;
|
||||
|
||||
/// HACK: global variables (only one process can be attached at the same time.)
|
||||
Process * DFHack::g_pProcess; ///< current process. non-NULL when picked
|
||||
ProcessHandle DFHack::g_ProcessHandle; ///< cache of handle to current process. used for speed reasons
|
||||
int DFHack::g_ProcessMemFile; ///< opened /proc/PID/mem, valid when attached
|
||||
|
||||
class DFHack::ProcessEnumerator::Private
|
||||
{
|
||||
public:
|
||||
Private(){};
|
||||
MemInfoManager *meminfo;
|
||||
std::vector<Process *> processes;
|
||||
};
|
||||
|
||||
// some magic - will come in handy when we start doing debugger stuff on Windows
|
||||
bool EnableDebugPriv()
|
||||
{
|
||||
bool bRET = FALSE;
|
||||
TOKEN_PRIVILEGES tp;
|
||||
HANDLE hToken;
|
||||
|
||||
if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
|
||||
{
|
||||
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
|
||||
{
|
||||
if (hToken != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
||||
tp.PrivilegeCount = 1;
|
||||
if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, 0, 0))
|
||||
{
|
||||
bRET = TRUE;
|
||||
}
|
||||
CloseHandle(hToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
return bRET;
|
||||
}
|
||||
|
||||
// WINDOWS version of the process finder
|
||||
bool ProcessEnumerator::findProcessess()
|
||||
{
|
||||
// Get the list of process identifiers.
|
||||
DWORD ProcArray[2048], memoryNeeded, numProccesses;
|
||||
|
||||
EnableDebugPriv();
|
||||
if ( !EnumProcesses( ProcArray, sizeof(ProcArray), &memoryNeeded ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Calculate how many process identifiers were returned.
|
||||
numProccesses = memoryNeeded / sizeof(DWORD);
|
||||
|
||||
// iterate through processes
|
||||
for ( int i = 0; i < (int)numProccesses; i++ )
|
||||
{
|
||||
Process *p = new Process(ProcArray[i],d->meminfo->meminfo);
|
||||
if(p->isIdentified())
|
||||
{
|
||||
d->processes.push_back(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
if(d->processes.size())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t ProcessEnumerator::size()
|
||||
{
|
||||
return d->processes.size();
|
||||
};
|
||||
|
||||
|
||||
Process * ProcessEnumerator::operator[](uint32_t index)
|
||||
{
|
||||
assert(index < d->processes.size());
|
||||
return d->processes[index];
|
||||
};
|
||||
|
||||
|
||||
ProcessEnumerator::ProcessEnumerator( string path_to_xml )
|
||||
: d(new Private())
|
||||
{
|
||||
d->meminfo = new MemInfoManager(path_to_xml);
|
||||
}
|
||||
|
||||
|
||||
ProcessEnumerator::~ProcessEnumerator()
|
||||
{
|
||||
// delete all processes
|
||||
for(uint32_t i = 0;i < d->processes.size();i++)
|
||||
{
|
||||
delete d->processes[i];
|
||||
}
|
||||
delete d->meminfo;
|
||||
delete d;
|
||||
}
|
Loading…
Reference in New Issue