mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-19 19:13:22 +08:00
git-svn-id: https://pykd.svn.codeplex.com/svn@50344 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
457e39a970
commit
9e57e58b88
5
kdar/cmd.py
Normal file
5
kdar/cmd.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
s = dbgCommand( "dt nt!_DRIVER_OBJECT" )
|
||||||
|
|
||||||
|
dprintln( s )
|
11
kdar/drvobj.py
Normal file
11
kdar/drvobj.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
|
||||||
|
drvObj = typedVar( "nt", "_DRIVER_OBJECT", addr64( 0x82000c08 ) )
|
||||||
|
|
||||||
|
dprintln( "DriverName.Length = %(1)d" % { "1" : drvObj.DriverName.Length } )
|
||||||
|
|
||||||
|
for i,f in drvObj.MajorFunction.iteritems():
|
||||||
|
|
||||||
|
dprintln( "MajorFunction[%(1)d] = " % { "1" : i } + findSymbol( addr64( f ) ) )
|
||||||
|
|
62
kdar/idt.py
Normal file
62
kdar/idt.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
|
||||||
|
if not is64bitSystem():
|
||||||
|
|
||||||
|
dprintln( "check interrupt handlers...\n" )
|
||||||
|
|
||||||
|
idtr = reg( "idtr" )
|
||||||
|
|
||||||
|
nt = loadModule( "nt" )
|
||||||
|
nt.KiInterruptDispatch = getOffset( "nt", "KiInterruptDispatch" )
|
||||||
|
nt.KiChainedDispatch = getOffset( "nt", "KiChainedDispatch" )
|
||||||
|
nt.KiInterruptTemplate = getOffset( "nt", "KiInterruptTemplate" )
|
||||||
|
|
||||||
|
hal = loadModule( "hal" )
|
||||||
|
|
||||||
|
|
||||||
|
ErrorCount = 0
|
||||||
|
|
||||||
|
for i in range(0,255):
|
||||||
|
|
||||||
|
idtEntry = typedVar( "nt", "_KIDTENTRY", idtr + i*8 )
|
||||||
|
|
||||||
|
if idtEntry.Selector == 8:
|
||||||
|
|
||||||
|
InterruptHandler = ( idtEntry.ExtendedOffset * 0x10000 ) + idtEntry.Offset
|
||||||
|
|
||||||
|
if InterruptHandler != 0 and not nt.contain( InterruptHandler ) and not hal.contain( InterruptHandler ):
|
||||||
|
|
||||||
|
kinterrupt = containingRecord( InterruptHandler, "nt", "_KINTERRUPT", "DispatchCode" )
|
||||||
|
|
||||||
|
dprintln ( "KINTERRUPT: %(1)x" % { "1" : kinterrupt.getAddress() } )
|
||||||
|
|
||||||
|
if addr64( kinterrupt.DispatchAddress ) != nt.KiInterruptDispatch and addr64( kinterrupt.DispatchAddress ) != nt.KiChainedDispatch:
|
||||||
|
dprintln ( "Threat!!! KINTERRUPT::DispatchAddress PATCHED" )
|
||||||
|
ErrorCount += 1
|
||||||
|
|
||||||
|
if findModule( kinterrupt.ServiceRoutine ) == None:
|
||||||
|
dprintln ( "Threat!!! KINTERRUPT::ServiceRoutine (%(1)x) out of any module" % { "1" : kinterrupt.ServiceRoutine } )
|
||||||
|
ErrorCount += 1
|
||||||
|
|
||||||
|
if not compareMemory( nt.KiInterruptTemplate, InterruptHandler, 98 ):
|
||||||
|
dprintln ( "Threat!!! KINTERRUPT::DispatchCode area PATCHED" )
|
||||||
|
ErrorCount += 1
|
||||||
|
|
||||||
|
|
||||||
|
dprintln ( "" )
|
||||||
|
|
||||||
|
|
||||||
|
dprintln( "check end: %(1)d threats" % { "1" : ErrorCount } )
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
dprintln( "x64 is not supported" )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
30
pykd.sln
Normal file
30
pykd.sln
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pykd", "pykd\pykd.vcproj", "{C0A12E93-4B76-4B17-B837-37020F957AD2}"
|
||||||
|
ProjectSection(WebsiteProperties) = preProject
|
||||||
|
Debug.AspNetCompiler.Debug = "True"
|
||||||
|
Release.AspNetCompiler.Debug = "False"
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{C0A12E93-4B76-4B17-B837-37020F957AD2}.Release|x64.Build.0 = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
127
pykd/dbgcmd.cpp
Normal file
127
pykd/dbgcmd.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgcmd.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// êëàññ äëÿ ïåðåõâàòà âûâîäà â îòëàä÷èê
|
||||||
|
|
||||||
|
class OutputReader : public IDebugOutputCallbacks {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
OutputReader( IDebugClient *debugClient )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
m_debugClient = debugClient;
|
||||||
|
m_debugClient->AddRef();
|
||||||
|
|
||||||
|
hres = m_debugClient->GetOutputCallbacks( &m_previousCallback );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
{
|
||||||
|
throw hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = m_debugClient->SetOutputCallbacks( this );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
{
|
||||||
|
throw hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch( ... )
|
||||||
|
{
|
||||||
|
m_debugClient->Release();
|
||||||
|
m_debugClient = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~OutputReader()
|
||||||
|
{
|
||||||
|
if ( m_debugClient )
|
||||||
|
{
|
||||||
|
m_debugClient->SetOutputCallbacks( m_previousCallback );
|
||||||
|
m_debugClient->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string&
|
||||||
|
Line() const {
|
||||||
|
return m_readLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// IUnknown.
|
||||||
|
STDMETHOD(QueryInterface)(
|
||||||
|
__in REFIID InterfaceId,
|
||||||
|
__out PVOID* Interface ) {
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHOD_(ULONG, AddRef)() {
|
||||||
|
return 1L;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STDMETHOD_(ULONG, Release)() {
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHOD(Output)(
|
||||||
|
__in ULONG Mask,
|
||||||
|
__in PCSTR Text )
|
||||||
|
{
|
||||||
|
if ( Mask == DEBUG_OUTPUT_NORMAL )
|
||||||
|
{
|
||||||
|
m_readLine += std::string( Text );
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::string m_readLine;
|
||||||
|
|
||||||
|
IDebugClient *m_debugClient;
|
||||||
|
|
||||||
|
IDebugOutputCallbacks *m_previousCallback;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::string
|
||||||
|
dbgCommand( const std::string &command )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
OutputReader outReader( g_Ext->m_Client );
|
||||||
|
|
||||||
|
hres = g_Ext->m_Control->Execute( DEBUG_OUTCTL_THIS_CLIENT, command.c_str(), 0 );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugControl::Execute failed" );
|
||||||
|
|
||||||
|
return std::string( outReader.Line() );
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return "error";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
16
pykd/dbgcmd.h
Normal file
16
pykd/dbgcmd.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/object.hpp>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::string
|
||||||
|
dbgCommand( const std::string &command );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
16
pykd/dbgexcept.h
Normal file
16
pykd/dbgexcept.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class DbgException : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DbgException( const char* desc ) :
|
||||||
|
std::exception( desc )
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
143
pykd/dbgext.cpp
Normal file
143
pykd/dbgext.cpp
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/def.hpp>
|
||||||
|
|
||||||
|
#include "dbgprint.h"
|
||||||
|
#include "dbgreg.h"
|
||||||
|
#include "dbgtype.h"
|
||||||
|
#include "dbgmodule.h"
|
||||||
|
#include "dbgsym.h"
|
||||||
|
#include "dbgmem.h"
|
||||||
|
#include "dbgsystem.h"
|
||||||
|
#include "dbgcmd.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE( pykd )
|
||||||
|
{
|
||||||
|
boost::python::def( "dprint", &DbgPrint::dprint );
|
||||||
|
boost::python::def( "dprintln", &DbgPrint::dprintln );
|
||||||
|
boost::python::def( "dbgCommand", &dbgCommand );
|
||||||
|
boost::python::def( "is64bitSystem", is64bitSystem );
|
||||||
|
boost::python::def( "reg", &loadRegister );
|
||||||
|
boost::python::def( "typedVar", &loadTypedVar );
|
||||||
|
boost::python::def( "containingRecord", &containingRecord );
|
||||||
|
boost::python::def( "loadModule", &loadModule );
|
||||||
|
boost::python::def( "findSymbol", &findSymbolForAddress );
|
||||||
|
boost::python::def( "getOffset", &findAddressForSymbol );
|
||||||
|
boost::python::def( "findModule", &findModule );
|
||||||
|
boost::python::def( "addr64", &addr64 );
|
||||||
|
boost::python::def( "compareMemory", &compareMemory );
|
||||||
|
boost::python::class_<typedVarClass>( "typedVarClass" )
|
||||||
|
.def("getAddress", &typedVarClass::getAddress );
|
||||||
|
boost::python::class_<dbgModuleClass>( "dbgModuleClass" )
|
||||||
|
.add_property("begin", &dbgModuleClass::getBegin )
|
||||||
|
.add_property("end", &dbgModuleClass::getEnd )
|
||||||
|
.def("contain", &dbgModuleClass::contain );
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class EXT_CLASS : public ExtExtension
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual HRESULT Initialize(void) {
|
||||||
|
|
||||||
|
HRESULT hr = ExtExtension::Initialize();
|
||||||
|
if ( FAILED( hr ) )
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
Py_Initialize();
|
||||||
|
|
||||||
|
PyImport_AppendInittab("pykd",initpykd );
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Uninitialize(void) {
|
||||||
|
|
||||||
|
Py_Finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
EXT_COMMAND_METHOD( info );
|
||||||
|
EXT_COMMAND_METHOD( exec );
|
||||||
|
};
|
||||||
|
|
||||||
|
EXT_DECLARE_GLOBALS();
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
EXT_COMMAND(
|
||||||
|
info,
|
||||||
|
"Python Info",
|
||||||
|
"" )
|
||||||
|
{
|
||||||
|
Out( "Python Info" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
EXT_COMMAND(
|
||||||
|
exec,
|
||||||
|
"Execute python code",
|
||||||
|
"{f;b;;quite mode}{;x}" )
|
||||||
|
{
|
||||||
|
bool fromFile = false;
|
||||||
|
|
||||||
|
if ( HasArg( "f" ) )
|
||||||
|
fromFile = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
|
||||||
|
boost::python::object main = boost::python::import("__main__");
|
||||||
|
|
||||||
|
boost::python::object global(main.attr("__dict__"));
|
||||||
|
|
||||||
|
boost::python::object result;
|
||||||
|
|
||||||
|
if ( fromFile )
|
||||||
|
{
|
||||||
|
result = boost::python::exec_file( GetUnnamedArgStr( 0 ), global, global );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = boost::python::exec( GetUnnamedArgStr( 0 ), global, global );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( boost::python::error_already_set const & )
|
||||||
|
{
|
||||||
|
// îøèáêà â ñêðèïòå
|
||||||
|
PyObject *errtype = NULL, *errvalue = NULL, *traceback = NULL;
|
||||||
|
|
||||||
|
PyErr_Fetch( &errtype, &errvalue, &traceback );
|
||||||
|
|
||||||
|
if(errvalue != NULL)
|
||||||
|
{
|
||||||
|
PyObject *s = PyObject_Str(errvalue);
|
||||||
|
|
||||||
|
DbgPrint::dprintln( PyString_AS_STRING( s ) );
|
||||||
|
|
||||||
|
Py_DECREF(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(errvalue);
|
||||||
|
Py_XDECREF(errtype);
|
||||||
|
Py_XDECREF(traceback);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
92
pykd/dbgmem.cpp
Normal file
92
pykd/dbgmem.cpp
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
#include "dbgmem.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
loadMemory( ULONG64 address, PVOID dest, ULONG length )
|
||||||
|
{
|
||||||
|
address = addr64( address );
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
HRESULT hres = g_Ext->m_Data->ReadVirtual( address, dest, length, NULL );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugDataSpace::ReadVirtual failed" );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "Kd2Lua unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
addr64( ULONG64 addr )
|
||||||
|
{
|
||||||
|
if ( *( (ULONG*)&addr + 1 ) == 0 )
|
||||||
|
*( (ULONG*)&addr + 1 ) = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
addr1 = addr64( addr1 );
|
||||||
|
addr2 = addr64( addr2 );
|
||||||
|
|
||||||
|
char* m1 = new char[length];
|
||||||
|
char* m2 = new char[length];
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
hres = g_Ext->m_Data->ReadVirtual( addr1, m1, length, NULL );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugDataSpace::ReadVirtual failed" );
|
||||||
|
|
||||||
|
hres = g_Ext->m_Data->ReadVirtual( addr2, m2, length, NULL );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugDataSpace::ReadVirtual failed" );
|
||||||
|
|
||||||
|
result = memcmp( m1, m2, length ) == 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "Kd2Lua unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] m1;
|
||||||
|
delete[] m2;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
14
pykd/dbgmem.h
Normal file
14
pykd/dbgmem.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
loadMemory( ULONG64 address, PVOID dest, ULONG length );
|
||||||
|
|
||||||
|
bool
|
||||||
|
compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length );
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
addr64( ULONG64 addr );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
84
pykd/dbgmodule.cpp
Normal file
84
pykd/dbgmodule.cpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgmodule.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
#include "dbgmem.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadModule( const std::string &moduleName )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
ULONG64 moduleBase;
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &moduleBase );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetModuleByModuleName failed" );
|
||||||
|
|
||||||
|
DEBUG_MODULE_PARAMETERS moduleParam = { 0 };
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleParameters( 1, &moduleBase, 0, &moduleParam );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetModuleParameters failed" );
|
||||||
|
|
||||||
|
|
||||||
|
return boost::python::object( dbgModuleClass( moduleBase, moduleParam.Size ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
findModule( ULONG64 addr )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
addr = addr64( addr );
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
ULONG moduleIndex;
|
||||||
|
ULONG64 moduleBase;
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleByOffset( addr, 0, &moduleIndex, &moduleBase );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
{
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_MODULE_PARAMETERS moduleParam = { 0 };
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleParameters( 1, &moduleBase, 0, &moduleParam );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetModuleParameters failed" );
|
||||||
|
|
||||||
|
|
||||||
|
return boost::python::object( dbgModuleClass( moduleBase, moduleParam.Size ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
58
pykd/dbgmodule.h
Normal file
58
pykd/dbgmodule.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/object.hpp>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class dbgModuleClass {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
dbgModuleClass() :
|
||||||
|
m_base( 0 ),
|
||||||
|
m_end( 0 )
|
||||||
|
{}
|
||||||
|
|
||||||
|
dbgModuleClass( ULONG64 base, ULONG size ) :
|
||||||
|
m_base( base ),
|
||||||
|
m_end( base + size )
|
||||||
|
{}
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
getBegin() const {
|
||||||
|
return m_base;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
getEnd() const {
|
||||||
|
return m_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
contain( ULONG64 addr ) const {
|
||||||
|
if ( *( (ULONG*)&addr + 1 ) == 0 )
|
||||||
|
*( (ULONG*)&addr + 1 ) = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
return m_base <= addr && addr <= m_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
ULONG64 m_base;
|
||||||
|
ULONG64 m_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadModule( const std::string &moduleName );
|
||||||
|
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
findModule( ULONG64 addr );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
16
pykd/dbgprint.cpp
Normal file
16
pykd/dbgprint.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "dbgprint.h"
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void DbgPrint::dprint( const string& str )
|
||||||
|
{
|
||||||
|
g_Ext->Out( str.c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void DbgPrint::dprintln( const std::string& str )
|
||||||
|
{
|
||||||
|
g_Ext->Out( str.c_str() );
|
||||||
|
g_Ext->Out( "\r\n" );
|
||||||
|
}
|
15
pykd/dbgprint.h
Normal file
15
pykd/dbgprint.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// âûâîä èíôîðìàöèè â îòëàä÷èê
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class DbgPrint {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static void dprint( const std::string& str );
|
||||||
|
|
||||||
|
static void dprintln( const std::string& str );
|
||||||
|
};
|
||||||
|
|
62
pykd/dbgreg.cpp
Normal file
62
pykd/dbgreg.cpp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgreg.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadRegister( const std::string ®isterName )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
ULONG registerIndex = 0;
|
||||||
|
|
||||||
|
hres = g_Ext->m_Registers->GetIndexByName( registerName.c_str(), ®isterIndex );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugRegister::GetIndexByName failed" );
|
||||||
|
|
||||||
|
DEBUG_VALUE debugValue;
|
||||||
|
hres = g_Ext->m_Registers->GetValue( registerIndex, &debugValue );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugRegister::GetValue failed" );
|
||||||
|
|
||||||
|
switch( debugValue.Type )
|
||||||
|
{
|
||||||
|
case DEBUG_VALUE_INT8:
|
||||||
|
return boost::python::long_( debugValue.I8 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEBUG_VALUE_INT16:
|
||||||
|
return boost::python::long_( debugValue.I16 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEBUG_VALUE_INT32:
|
||||||
|
return boost::python::long_( debugValue.I32 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEBUG_VALUE_INT64:
|
||||||
|
return boost::python::long_(debugValue.I64 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::str( "REG_ERR" );
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
13
pykd/dbgreg.h
Normal file
13
pykd/dbgreg.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/object.hpp>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadRegister( const std::string ®isterName );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
105
pykd/dbgsym.cpp
Normal file
105
pykd/dbgsym.cpp
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgsym.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
findSymbolForAddress( ULONG64 addr )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
DEBUG_MODULE_AND_ID debugId;
|
||||||
|
ULONG64 displace = 0;
|
||||||
|
|
||||||
|
if ( *( (ULONG*)&addr + 1 ) == 0 )
|
||||||
|
*( (ULONG*)&addr + 1 ) = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
ULONG moduleIndex;
|
||||||
|
ULONG64 moduleBase;
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleByOffset( addr, 0, &moduleIndex, &moduleBase );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
{
|
||||||
|
return boost::python::object( "out of module" );
|
||||||
|
}
|
||||||
|
|
||||||
|
char moduleName[0x100];
|
||||||
|
hres = g_Ext->m_Symbols2->GetModuleNameString( DEBUG_MODNAME_MODULE, moduleIndex, moduleBase,
|
||||||
|
moduleName, sizeof( moduleName ), NULL );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol2::GetModuleNameString failed" );
|
||||||
|
|
||||||
|
ULONG entries = 0;
|
||||||
|
hres = g_Ext->m_Symbols3->GetSymbolEntriesByOffset( addr, 0, &debugId, &displace, 1, &entries );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol3::GetSymbolEntriesByOffset failed" );
|
||||||
|
|
||||||
|
std::stringstream ss;
|
||||||
|
|
||||||
|
if ( entries == 0 )
|
||||||
|
{
|
||||||
|
ss << moduleName << "+" << std::hex << ( addr - moduleBase );
|
||||||
|
return boost::python::object( ss.str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
char symbolName[0x100];
|
||||||
|
hres = g_Ext->m_Symbols3->GetSymbolEntryString( &debugId, 0, symbolName, sizeof(symbolName ), NULL );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol3::GetSymbolEntryString failed" );
|
||||||
|
|
||||||
|
ss << moduleName << "!" << symbolName;
|
||||||
|
return boost::python::object( ss.str() );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::object( addr );
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
findAddressForSymbol( const std::string &moduleName, const std::string &symbolName )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
std::string ModuleSymName = moduleName;
|
||||||
|
ModuleSymName += "!";
|
||||||
|
ModuleSymName += symbolName;
|
||||||
|
|
||||||
|
ULONG64 offset = 0ULL;
|
||||||
|
hres = g_Ext->m_Symbols->GetOffsetByName( ModuleSymName.c_str(), &offset );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetOffsetByName failed" );
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ULONG64)~0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
16
pykd/dbgsym.h
Normal file
16
pykd/dbgsym.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/object.hpp>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
findSymbolForAddress( ULONG64 addr );
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
findAddressForSymbol( const std::string &moduleName, const std::string &symbolName );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
33
pykd/dbgsystem.cpp
Normal file
33
pykd/dbgsystem.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
#include "dbgsystem.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
is64bitSystem()
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
hres = g_Ext->m_Control->IsPointer64Bit();
|
||||||
|
|
||||||
|
return hres == S_OK;
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
14
pykd/dbgsystem.h
Normal file
14
pykd/dbgsystem.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
is64bitSystem();
|
||||||
|
|
||||||
|
inline
|
||||||
|
int
|
||||||
|
ptrSize() {
|
||||||
|
return is64bitSystem() ? 8 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
266
pykd/dbgtype.cpp
Normal file
266
pykd/dbgtype.cpp
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <engextcpp.hpp>
|
||||||
|
|
||||||
|
#include "dbgtype.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
#include "dbgmem.h"
|
||||||
|
#include "dbgsystem.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
bool
|
||||||
|
isBaseType( const std::string &typeName );
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadBaseType( const std::string &typeName, ULONG64 address, ULONG size );
|
||||||
|
|
||||||
|
typedef
|
||||||
|
boost::python::object
|
||||||
|
(*basicTypeLoader)( ULONG64 address, ULONG size );
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
voidLoader( ULONG64 address, ULONG size ) {
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename valType>
|
||||||
|
boost::python::object
|
||||||
|
valueLoader( ULONG64 address, ULONG size );
|
||||||
|
|
||||||
|
template<>
|
||||||
|
boost::python::object
|
||||||
|
valueLoader<void*>( ULONG64 address, ULONG size )
|
||||||
|
{
|
||||||
|
if ( is64bitSystem() )
|
||||||
|
return valueLoader<__int64>( address, size );
|
||||||
|
else
|
||||||
|
return valueLoader<long>( address, size );
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char*
|
||||||
|
basicTypeNames[] = {
|
||||||
|
"unsigned char",
|
||||||
|
"char",
|
||||||
|
"unsigned short",
|
||||||
|
"short",
|
||||||
|
"unsigned long",
|
||||||
|
"long",
|
||||||
|
"<function>",
|
||||||
|
"void"
|
||||||
|
};
|
||||||
|
|
||||||
|
basicTypeLoader basicTypeLoaders[] = {
|
||||||
|
valueLoader<unsigned char>,
|
||||||
|
valueLoader<char>,
|
||||||
|
valueLoader<unsigned short>,
|
||||||
|
valueLoader<short>,
|
||||||
|
valueLoader<unsigned long>,
|
||||||
|
valueLoader<long>,
|
||||||
|
valueLoader<void*>,
|
||||||
|
voidLoader };
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
boost::python::object
|
||||||
|
loadTypedVar( const std::string &moduleName, const std::string &typeName, ULONG64 address )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
ULONG64 moduleBase;
|
||||||
|
|
||||||
|
if ( typeName.find("*") < typeName.size() )
|
||||||
|
{
|
||||||
|
return valueLoader<void*>( address, ptrSize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &moduleBase );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetModuleByModuleName failed" );
|
||||||
|
|
||||||
|
ULONG typeId;
|
||||||
|
hres = g_Ext->m_Symbols->GetTypeId( moduleBase, typeName.c_str(), &typeId );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetTypeId failed" );
|
||||||
|
|
||||||
|
typedVarClass temp( address );
|
||||||
|
boost::python::object var( temp );
|
||||||
|
|
||||||
|
for ( ULONG i = 0; ; ++i )
|
||||||
|
{
|
||||||
|
char fieldName[100];
|
||||||
|
hres = g_Ext->m_Symbols2->GetFieldName( moduleBase, typeId, i, fieldName, sizeof(fieldName), NULL );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
break;
|
||||||
|
|
||||||
|
ULONG fieldTypeId;
|
||||||
|
ULONG fieldOffset;
|
||||||
|
hres = g_Ext->m_Symbols3->GetFieldTypeAndOffset( moduleBase, typeId, fieldName, &fieldTypeId, &fieldOffset );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol3::GetFieldTypeAndOffset failed" );
|
||||||
|
|
||||||
|
char fieldTypeName[100];
|
||||||
|
hres = g_Ext->m_Symbols->GetTypeName( moduleBase, fieldTypeId, fieldTypeName, sizeof(fieldTypeName), NULL );
|
||||||
|
|
||||||
|
ULONG fieldSize;
|
||||||
|
hres = g_Ext->m_Symbols->GetTypeSize( moduleBase, fieldTypeId, &fieldSize );
|
||||||
|
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetTypeName failed" );
|
||||||
|
|
||||||
|
if ( isBaseType( fieldTypeName ) )
|
||||||
|
{
|
||||||
|
var.attr( fieldName ) = loadBaseType( fieldTypeName, address + fieldOffset, fieldSize );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var.attr( fieldName ) = loadTypedVar( moduleName, fieldTypeName, address + fieldOffset );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::str( "VAR_ERR" );
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
containingRecord( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &fieldName )
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
ULONG64 moduleBase;
|
||||||
|
|
||||||
|
hres = g_Ext->m_Symbols->GetModuleByModuleName( moduleName.c_str(), 0, NULL, &moduleBase );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetModuleByModuleName failed" );
|
||||||
|
|
||||||
|
ULONG typeId;
|
||||||
|
hres = g_Ext->m_Symbols->GetTypeId( moduleBase, typeName.c_str(), &typeId );
|
||||||
|
if ( FAILED( hres ) )
|
||||||
|
throw DbgException( "IDebugSymbol::GetTypeId failed" );
|
||||||
|
|
||||||
|
ULONG fieldTypeId;
|
||||||
|
ULONG fieldOffset;
|
||||||
|
hres = g_Ext->m_Symbols3->GetFieldTypeAndOffset( moduleBase, typeId, fieldName.c_str(), &fieldTypeId, &fieldOffset );
|
||||||
|
|
||||||
|
return loadTypedVar( moduleName, typeName, address - fieldOffset );
|
||||||
|
}
|
||||||
|
|
||||||
|
catch( std::exception &e )
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd error: %s\n", e.what() );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
g_Ext->Out( "pykd unexpected error\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::str( "VAR_ERR" );
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool
|
||||||
|
isBaseType( const std::string &typeName )
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < sizeof( basicTypeNames ) / sizeof( char* ); ++i )
|
||||||
|
{
|
||||||
|
if ( typeName == basicTypeNames[i] )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "*" ) )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "[]" ) )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "*[]" ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadBaseType( const std::string &typeName, ULONG64 address, ULONG size )
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < sizeof( basicTypeNames ) / sizeof( char* ); ++i )
|
||||||
|
{
|
||||||
|
if ( typeName == basicTypeNames[i] )
|
||||||
|
return basicTypeLoaders[i]( address, size );
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "*" ) )
|
||||||
|
return valueLoader<void*>( address, size );
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "[]" ) )
|
||||||
|
return basicTypeLoaders[i]( address, size );
|
||||||
|
|
||||||
|
if ( typeName == ( std::string( basicTypeNames[i] ) + "*[]" ) )
|
||||||
|
return valueLoader<void*>( address, size );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template< typename valType>
|
||||||
|
boost::python::object
|
||||||
|
valueLoader( ULONG64 address, ULONG size )
|
||||||
|
{
|
||||||
|
if ( size == sizeof(valType) )
|
||||||
|
{
|
||||||
|
valType v;
|
||||||
|
if ( loadMemory( address, &v, sizeof(v) ) )
|
||||||
|
return boost::python::long_( (unsigned __int64)v );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boost::python::dict arr;
|
||||||
|
|
||||||
|
for ( int i = 0; i < size / sizeof(valType); ++i )
|
||||||
|
{
|
||||||
|
valType v;
|
||||||
|
if ( !loadMemory( address + i * sizeof(valType), &v, sizeof(v) ) )
|
||||||
|
return boost::python::object();
|
||||||
|
|
||||||
|
arr[i] = boost::python::long_( (unsigned __int64)v );
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadComplexType( const std::string &typeName, ULONG64 address, ULONG size )
|
||||||
|
{
|
||||||
|
return boost::python::object();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
41
pykd/dbgtype.h
Normal file
41
pykd/dbgtype.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
#include <boost/python/object.hpp>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class typedVarClass {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedVarClass()
|
||||||
|
{}
|
||||||
|
|
||||||
|
typedVarClass( ULONG64 addr ) :
|
||||||
|
m_addr( addr )
|
||||||
|
{}
|
||||||
|
|
||||||
|
ULONG64
|
||||||
|
getAddress() const {
|
||||||
|
return m_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
ULONG64 m_addr;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
loadTypedVar( const std::string &moduleName, const std::string &typeName, ULONG64 address );
|
||||||
|
|
||||||
|
boost::python::object
|
||||||
|
containingRecord( ULONG64 address, const std::string &moduleName, const std::string &typeName, const std::string &fieldName );
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
0
pykd/pykd.cpp
Normal file
0
pykd/pykd.cpp
Normal file
6
pykd/pykd.def
Normal file
6
pykd/pykd.def
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
EXPORTS
|
||||||
|
DebugExtensionInitialize
|
||||||
|
DebugExtensionUninitialize
|
||||||
|
|
||||||
|
info
|
||||||
|
exec
|
BIN
pykd/pykd.suo
Normal file
BIN
pykd/pykd.suo
Normal file
Binary file not shown.
488
pykd/pykd.vcproj
Normal file
488
pykd/pykd.vcproj
Normal file
@ -0,0 +1,488 @@
|
|||||||
|
<?xml version="1.0" encoding="windows-1251"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8,00"
|
||||||
|
Name="pykd"
|
||||||
|
ProjectGUID="{C0A12E93-4B76-4B17-B837-37020F957AD2}"
|
||||||
|
RootNamespace="pykd"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
<Platform
|
||||||
|
Name="x64"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=""$(DBG_SDK_ROOT)\inc";"$(BOOST_ROOT)";"$(PYTHON_ROOT)\include""
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS"
|
||||||
|
GeneratePreprocessedFile="0"
|
||||||
|
KeepComments="false"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="dbgeng.lib engextcpp.lib"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories=""$(DBG_SDK_ROOT)\lib\i386";"$(PYTHON_ROOT)\libs";"$(BOOST_ROOT)\stage\lib""
|
||||||
|
ModuleDefinitionFile="pykd.def"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|x64"
|
||||||
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=""$(DBG_SDK_ROOT)\inc";"$(BOOST_ROOT)";"$(PYTHON_ROOT)\include""
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS"
|
||||||
|
GeneratePreprocessedFile="0"
|
||||||
|
KeepComments="false"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="dbgeng.lib engextcpp.lib"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories=""$(DBG_SDK_ROOT)\lib\amd64";"$(PYTHON_ROOT)\libs";"$(BOOST_ROOT)\stage64\lib""
|
||||||
|
ModuleDefinitionFile="pykd.def"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
TargetMachine="17"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(DBG_SDK_ROOT)\inc";"$(BOOST_ROOT)";"$(PYTHON_ROOT)\include""
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="dbgeng.lib engextcpp.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories=""$(DBG_SDK_ROOT)\lib\i386";"$(PYTHON_ROOT)\libs";"$(BOOST_ROOT)\stage\lib""
|
||||||
|
ModuleDefinitionFile="pykd.def"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|x64"
|
||||||
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="2"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(DBG_SDK_ROOT)\inc";"$(BOOST_ROOT)";"$(PYTHON_ROOT)\include""
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="dbgeng.lib engextcpp.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories=""$(DBG_SDK_ROOT)\lib\amd64";"$(PYTHON_ROOT)\libs";"$(BOOST_ROOT)\stage64\lib""
|
||||||
|
ModuleDefinitionFile="pykd.def"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="17"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgcmd.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgext.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgmem.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgmodule.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgprint.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgreg.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgsym.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgsystem.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgtype.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\pykd.def"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\stdafx.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgcmd.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgexcept.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgmem.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgmodule.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgprint.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgreg.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgsym.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgsystem.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\dbgtype.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\stdafx.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ReadMe.txt"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
8
pykd/stdafx.cpp
Normal file
8
pykd/stdafx.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// stdafx.cpp : source file that includes just the standard includes
|
||||||
|
// pykd.pch will be the pre-compiled header
|
||||||
|
// stdafx.obj will contain the pre-compiled type information
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
// TODO: reference any additional headers you need in STDAFX.H
|
||||||
|
// and not in this file
|
35
pykd/stdafx.h
Normal file
35
pykd/stdafx.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// stdafx.h : include file for standard system include files,
|
||||||
|
// or project specific include files that are used frequently, but
|
||||||
|
// are changed infrequently
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
||||||
|
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
||||||
|
#ifndef WINVER // Allow use of features specific to Windows XP or later.
|
||||||
|
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
|
||||||
|
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
|
||||||
|
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
|
||||||
|
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
// Windows Header Files:
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define __field_ecount_opt(x)
|
||||||
|
|
||||||
|
|
||||||
|
#define BOOST_PYTHON_STATIC_LIB
|
||||||
|
|
||||||
|
// TODO: reference additional headers your program requires here
|
8
test/print.py
Normal file
8
test/print.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
dprint ( "hello windbg!\n" )
|
||||||
|
dprintln ( "hello windbg!" )
|
||||||
|
hello = "hello windbg!"
|
||||||
|
dprintln( hello )
|
||||||
|
dprintln( hello + " from python" )
|
||||||
|
|
16
test/regs.py
Normal file
16
test/regs.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
|
||||||
|
dprintln( "regs tests begin" )
|
||||||
|
|
||||||
|
al = reg("al")
|
||||||
|
ax = reg("ax")
|
||||||
|
eax = reg("eax")
|
||||||
|
|
||||||
|
|
||||||
|
dprintln( "al: " + str(al) )
|
||||||
|
dprintln( "ax: " + str(ax) )
|
||||||
|
dprintln( "eax: " + str(eax) )
|
||||||
|
|
||||||
|
|
||||||
|
dprintln( "regs tests end" )
|
13
test/type.py
Normal file
13
test/type.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from pykd import *
|
||||||
|
|
||||||
|
dprintln( "type test begin" )
|
||||||
|
|
||||||
|
idtr=reg("idtr")
|
||||||
|
|
||||||
|
var = typedVar( "nt", "_KIDTENTRY", idtr )
|
||||||
|
|
||||||
|
for t, v in var.iteritems():
|
||||||
|
dprintln( t + " : " + str(v) )
|
||||||
|
|
||||||
|
|
||||||
|
dprintln( "type test end" )
|
Loading…
Reference in New Issue
Block a user