diff --git a/pykd/dbgeventcb.cpp b/pykd/dbgeventcb.cpp index 73d0450..837ed45 100644 --- a/pykd/dbgeventcb.cpp +++ b/pykd/dbgeventcb.cpp @@ -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(&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); } } diff --git a/pykd/dbgeventcb.h b/pykd/dbgeventcb.h index 08e4989..30836b2 100644 --- a/pykd/dbgeventcb.h +++ b/pykd/dbgeventcb.h @@ -45,11 +45,13 @@ private: IDebugClient *m_dbgClient; IDebugSymbols3 *m_dbgSymbols3; + IDebugControl *m_dbgControl; ///////////////////////////////////////////////////////////////////////////////// // global singleton static DbgEventCallbacks *dbgEventCallbacks; + static volatile LONG dbgEventCallbacksStartCount; ///////////////////////////////////////////////////////////////////////////////// }; diff --git a/pykd/dbgmem.cpp b/pykd/dbgmem.cpp index 61c3305..89379ec 100644 --- a/pykd/dbgmem.cpp +++ b/pykd/dbgmem.cpp @@ -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 ) { diff --git a/pykd/dbgmem.h b/pykd/dbgmem.h index 6d1e40b..0312ffa 100644 --- a/pykd/dbgmem.h +++ b/pykd/dbgmem.h @@ -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 ); diff --git a/pykd/dbgmodule.h b/pykd/dbgmodule.h index a3c8b7d..e1d3e90 100644 --- a/pykd/dbgmodule.h +++ b/pykd/dbgmodule.h @@ -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) { diff --git a/pykd/dbgsynsym.cpp b/pykd/dbgsynsym.cpp index 3bdb269..baa273a 100644 --- a/pykd/dbgsynsym.cpp +++ b/pykd/dbgsynsym.cpp @@ -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); } } diff --git a/pykd/dbgsynsym.h b/pykd/dbgsynsym.h index 4708d6d..d04e5af 100644 --- a/pykd/dbgsynsym.h +++ b/pykd/dbgsynsym.h @@ -54,7 +54,8 @@ void restoreSyntheticSymbolForModule( ); void restoreSyntheticSymbolForAllModules( - IDebugSymbols3 *symbols3 + IDebugSymbols3 *symbols3, + IDebugControl *control ); /////////////////////////////////////////////////////////////////////////////////