mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 11:43:23 +08:00
197 lines
5.6 KiB
C++
197 lines
5.6 KiB
C++
#include "stdafx.h"
|
|
|
|
#include "kdlib/dbgengine.h"
|
|
#include "kdlib/typeinfo.h"
|
|
|
|
#include "pydbgeng.h"
|
|
#include "stladaptor.h"
|
|
#include "variant.h"
|
|
|
|
namespace pykd {
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::object evaluate( const std::wstring &expression, bool cplusplus )
|
|
{
|
|
kdlib::NumVariant var;
|
|
|
|
do {
|
|
AutoRestorePyState pystate;
|
|
var = kdlib::evaluate(expression, cplusplus );
|
|
} while(false);
|
|
|
|
return pykd::NumVariantAdaptor::convertToPython( var );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::tuple getSourceLine( kdlib::MEMOFFSET_64 offset )
|
|
{
|
|
std::wstring fileName;
|
|
unsigned long lineno;
|
|
long displacement;
|
|
|
|
do {
|
|
AutoRestorePyState pystate;
|
|
kdlib::getSourceLine( fileName, lineno, displacement, offset );
|
|
} while(false);
|
|
|
|
return python::make_tuple( fileName, lineno, displacement );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
kdlib::SystemInfo getSystemVersion()
|
|
{
|
|
AutoRestorePyState pystate;
|
|
|
|
kdlib::SystemInfo sysInfo;
|
|
kdlib::getSystemInfo( sysInfo );
|
|
return sysInfo;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo )
|
|
{
|
|
std::wstringstream sstr;
|
|
|
|
sstr << L"Major Version: " << sysInfo.majorVersion << std::endl;
|
|
sstr << L"Minor Version: " << sysInfo.minorVersion << std::endl;
|
|
sstr << L"Build: " << sysInfo.buildNumber << std::endl;
|
|
sstr << L"Description: " << sysInfo.buildDescription << std::endl;
|
|
|
|
return sstr.str();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::list getExceptionInfoParameters( kdlib::ExceptionInfo& exceptionInfo )
|
|
{
|
|
python::list lst;
|
|
for ( unsigned long i = 0; i < exceptionInfo.parameterCount; ++i )
|
|
lst.append( exceptionInfo.parameters[i] );
|
|
return lst;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
std::wstring printExceptionInfo( kdlib::ExceptionInfo& exceptionInfo )
|
|
{
|
|
std::wstringstream sstream;
|
|
|
|
sstream << L"FirstChance= " << (exceptionInfo.firstChance ? "True" : "False") << std::endl;
|
|
|
|
sstream << L"ExceptionCode= 0x" << std::hex << exceptionInfo.exceptionCode << std::endl;
|
|
sstream << L"ExceptionFlags= 0x" << std::hex << exceptionInfo.exceptionFlags << std::endl;
|
|
sstream << L"ExceptionRecord= 0x" << std::hex << exceptionInfo.exceptionRecord << std::endl;
|
|
sstream << L"ExceptionAddress= 0x" << std::hex << exceptionInfo.exceptionAddress << std::endl;
|
|
|
|
for (ULONG i = 0; i < exceptionInfo.parameterCount; ++i)
|
|
{
|
|
sstream << L"Param[" << std::dec << i << L"]= 0x";
|
|
sstream << std::hex << exceptionInfo.parameters[i] << std::endl;
|
|
}
|
|
|
|
return sstream.str();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::list getProcessThreads()
|
|
{
|
|
std::vector<kdlib::MEMOFFSET_64> threadList;
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
unsigned long threadNumber = kdlib::getNumberThreads();
|
|
|
|
for ( unsigned long i = 0; i < threadNumber; ++i )
|
|
{
|
|
kdlib::THREAD_DEBUG_ID threadId = kdlib::getThreadIdByIndex(i);
|
|
threadList.push_back( kdlib::getThreadOffset(threadId) );
|
|
}
|
|
|
|
} while(false);
|
|
|
|
return vectorToList(threadList);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::list getTargetProcesses()
|
|
{
|
|
std::vector<kdlib::PROCESS_DEBUG_ID> processList;
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
|
|
unsigned long processNumber = kdlib::getNumberProcesses();
|
|
|
|
for ( unsigned long i = 0; i < processNumber; ++i )
|
|
{
|
|
processList.push_back( kdlib::getProcessIdByIndex(i) );
|
|
}
|
|
|
|
} while(false);
|
|
|
|
return vectorToList(processList);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
python::tuple getBugCheckData()
|
|
{
|
|
kdlib::SystemCrashInfo crashInfo = {};
|
|
|
|
do {
|
|
|
|
AutoRestorePyState pystate;
|
|
kdlib::getSystemCrashInfo( crashInfo );
|
|
|
|
} while(false);
|
|
|
|
python::list lst;
|
|
lst.append(crashInfo.code);
|
|
|
|
for ( unsigned long i = 0; i < crashInfo.paramterCount; ++i)
|
|
lst.append(crashInfo.parameters[i]);
|
|
|
|
return python::tuple(lst);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
kdlib::SyntheticSymbol addSyntheticSymbol( kdlib::MEMOFFSET_64 offset, unsigned long size, const std::wstring &name )
|
|
{
|
|
AutoRestorePyState pystate;
|
|
return kdlib::addSyntheticSymbol(offset, size, name);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void removeSyntheticSymbol(const kdlib::SyntheticSymbol& syntheticSymbol)
|
|
{
|
|
AutoRestorePyState pystate;
|
|
return kdlib::removeSyntheticSymbol(syntheticSymbol);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
std::wstring printSyntheticSymbol(const kdlib::SyntheticSymbol& syntheticSymbol)
|
|
{
|
|
std::wstringstream sstream;
|
|
|
|
sstream << L"moduleBase=0x" << std::hex << syntheticSymbol.moduleBase << std::endl;
|
|
sstream << L"symbolId= 0x" << std::hex << syntheticSymbol.symbolId << std::endl;
|
|
|
|
return sstream.str();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
} //end namespace pykd
|