mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 03:23:23 +08:00
[+] added addr64Ex(...) with IDebugControl
[~] work-around for secondary DebugExtensionInitialize call [~] addr64(...) in events filter replaced to addr64Ex(...) git-svn-id: https://pykd.svn.codeplex.com/svn@63271 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
30bbc70403
commit
946f6cdc1f
@ -11,6 +11,7 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DbgEventCallbacks *DbgEventCallbacks::dbgEventCallbacks = NULL;
|
||||
volatile LONG DbgEventCallbacks::dbgEventCallbacksStartCount = 0;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -19,8 +20,11 @@ HRESULT DbgEventCallbacks::Start()
|
||||
HRESULT hres;
|
||||
try
|
||||
{
|
||||
Stop();
|
||||
dbgEventCallbacks = new DbgEventCallbacks;
|
||||
if (1 == InterlockedIncrement(&dbgEventCallbacksStartCount))
|
||||
{
|
||||
_ASSERT(!dbgEventCallbacks);
|
||||
dbgEventCallbacks = new DbgEventCallbacks;
|
||||
}
|
||||
hres = S_OK;
|
||||
}
|
||||
catch (HRESULT _hres)
|
||||
@ -38,8 +42,12 @@ HRESULT DbgEventCallbacks::Start()
|
||||
|
||||
void DbgEventCallbacks::Stop()
|
||||
{
|
||||
if (dbgEventCallbacks)
|
||||
dbgEventCallbacks->Deregister();
|
||||
if (0 == InterlockedDecrement(&dbgEventCallbacksStartCount))
|
||||
{
|
||||
_ASSERT(dbgEventCallbacks);
|
||||
if (dbgEventCallbacks)
|
||||
dbgEventCallbacks->Deregister();
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
@ -48,6 +56,7 @@ DbgEventCallbacks::DbgEventCallbacks()
|
||||
: m_ReferenceCount(1)
|
||||
, m_dbgClient(NULL)
|
||||
, m_dbgSymbols3(NULL)
|
||||
, m_dbgControl(NULL)
|
||||
{
|
||||
HRESULT hres;
|
||||
try
|
||||
@ -65,6 +74,12 @@ DbgEventCallbacks::DbgEventCallbacks()
|
||||
if (FAILED(hres))
|
||||
throw hres;
|
||||
|
||||
hres = m_dbgClient->QueryInterface(
|
||||
__uuidof(IDebugControl),
|
||||
reinterpret_cast<PVOID *>(&m_dbgControl));
|
||||
if (FAILED(hres))
|
||||
throw hres;
|
||||
|
||||
hres = m_dbgClient->SetEventCallbacks(this);
|
||||
if (FAILED(hres))
|
||||
throw hres;
|
||||
@ -95,6 +110,11 @@ void DbgEventCallbacks::Deregister()
|
||||
m_dbgSymbols3->Release();
|
||||
m_dbgSymbols3 = NULL;
|
||||
}
|
||||
if (m_dbgControl)
|
||||
{
|
||||
m_dbgControl->Release();
|
||||
m_dbgControl = NULL;
|
||||
}
|
||||
if (m_dbgClient)
|
||||
{
|
||||
m_dbgClient->Release();
|
||||
@ -146,7 +166,7 @@ HRESULT DbgEventCallbacks::ChangeSymbolState(
|
||||
return doSymbolsLoaded(Argument);
|
||||
|
||||
// f.e. is case ".reload /f image.exe", if for image.exe no symbols
|
||||
restoreSyntheticSymbolForAllModules(m_dbgSymbols3);
|
||||
restoreSyntheticSymbolForAllModules(m_dbgSymbols3, m_dbgControl);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@ -169,7 +189,7 @@ HRESULT DbgEventCallbacks::doSymbolsLoaded(
|
||||
&dbgModuleParameters);
|
||||
if (SUCCEEDED(hres))
|
||||
{
|
||||
ModuleInfo moduleInfo(dbgModuleParameters);
|
||||
ModuleInfo moduleInfo(dbgModuleParameters, m_dbgControl);
|
||||
restoreSyntheticSymbolForModule(moduleInfo, m_dbgSymbols3);
|
||||
}
|
||||
}
|
||||
|
@ -45,11 +45,13 @@ private:
|
||||
|
||||
IDebugClient *m_dbgClient;
|
||||
IDebugSymbols3 *m_dbgSymbols3;
|
||||
IDebugControl *m_dbgControl;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
// global singleton
|
||||
|
||||
static DbgEventCallbacks *dbgEventCallbacks;
|
||||
static volatile LONG dbgEventCallbacksStartCount;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
};
|
||||
|
@ -52,14 +52,14 @@ loadMemory( ULONG64 address, PVOID dest, ULONG length, BOOLEAN phyAddr )
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG64
|
||||
addr64( ULONG64 addr )
|
||||
addr64Ex( ULONG64 addr, IDebugControl *control )
|
||||
{
|
||||
HRESULT hres;
|
||||
|
||||
try {
|
||||
|
||||
ULONG processorMode;
|
||||
hres = dbgExt->control->GetActualProcessorType( &processorMode );
|
||||
hres = control->GetActualProcessorType( &processorMode );
|
||||
if ( FAILED( hres ) )
|
||||
throw DbgException( "IDebugControl::GetEffectiveProcessorType failed" );
|
||||
|
||||
@ -91,6 +91,13 @@ addr64( ULONG64 addr )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG64 addr64( ULONG64 addr )
|
||||
{
|
||||
return addr64Ex(addr, dbgExt->control);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool
|
||||
compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length, BOOLEAN phyAddr )
|
||||
{
|
||||
|
@ -79,6 +79,9 @@ loadWStrToBuffer( ULONG64 address, PWCHAR buffer, ULONG bufferLen );
|
||||
bool
|
||||
compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length, BOOLEAN phyAddr = FALSE );
|
||||
|
||||
ULONG64
|
||||
addr64Ex( ULONG64 addr, IDebugControl *control );
|
||||
|
||||
ULONG64
|
||||
addr64( ULONG64 addr );
|
||||
|
||||
|
@ -27,15 +27,17 @@ struct ModuleInfo
|
||||
{
|
||||
}
|
||||
ModuleInfo(
|
||||
const IMAGEHLP_MODULEW64 &dbgImageHelperInfo
|
||||
const IMAGEHLP_MODULEW64 &dbgImageHelperInfo,
|
||||
IDebugControl *control = dbgExt->control
|
||||
) : m_base(addr64(dbgImageHelperInfo.BaseOfImage))
|
||||
, m_timeDataStamp(dbgImageHelperInfo.TimeDateStamp)
|
||||
, m_checkSumm(dbgImageHelperInfo.CheckSum)
|
||||
{
|
||||
}
|
||||
ModuleInfo(
|
||||
const DEBUG_MODULE_PARAMETERS &dbgModuleParameters
|
||||
) : m_base(addr64(dbgModuleParameters.Base))
|
||||
const DEBUG_MODULE_PARAMETERS &dbgModuleParameters,
|
||||
IDebugControl *control = dbgExt->control
|
||||
) : m_base(addr64Ex(dbgModuleParameters.Base, control))
|
||||
, m_timeDataStamp(dbgModuleParameters.TimeDateStamp)
|
||||
, m_checkSumm(dbgModuleParameters.Checksum)
|
||||
{
|
||||
|
@ -615,7 +615,8 @@ void restoreSyntheticSymbolForModule(
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void restoreSyntheticSymbolForAllModules(
|
||||
IDebugSymbols3 *symbols3
|
||||
IDebugSymbols3 *symbols3,
|
||||
IDebugControl *control
|
||||
)
|
||||
{
|
||||
try
|
||||
@ -642,7 +643,7 @@ void restoreSyntheticSymbolForAllModules(
|
||||
{
|
||||
for (ULONG i = 0; i < arrModules.size(); ++i)
|
||||
{
|
||||
ModuleInfo moduleInfo(arrModules[i]);
|
||||
ModuleInfo moduleInfo(arrModules[i], control);
|
||||
restoreSyntheticSymbolForModuleNoLock(moduleInfo, symbols3);
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,8 @@ void restoreSyntheticSymbolForModule(
|
||||
);
|
||||
|
||||
void restoreSyntheticSymbolForAllModules(
|
||||
IDebugSymbols3 *symbols3
|
||||
IDebugSymbols3 *symbols3,
|
||||
IDebugControl *control
|
||||
);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
Loading…
Reference in New Issue
Block a user