diff --git a/pykd/dbgeventcb.cpp b/pykd/dbgeventcb.cpp index dbb065a..73d0450 100644 --- a/pykd/dbgeventcb.cpp +++ b/pykd/dbgeventcb.cpp @@ -10,7 +10,37 @@ ///////////////////////////////////////////////////////////////////////////////// -DbgEventCallbacks *dbgEventCallbacks = NULL; +DbgEventCallbacks *DbgEventCallbacks::dbgEventCallbacks = NULL; + +///////////////////////////////////////////////////////////////////////////////// + +HRESULT DbgEventCallbacks::Start() +{ + HRESULT hres; + try + { + Stop(); + dbgEventCallbacks = new DbgEventCallbacks; + hres = S_OK; + } + catch (HRESULT _hres) + { + hres = _hres; + } + catch (...) + { + hres = E_OUTOFMEMORY; + } + return hres; +} + +///////////////////////////////////////////////////////////////////////////////// + +void DbgEventCallbacks::Stop() +{ + if (dbgEventCallbacks) + dbgEventCallbacks->Deregister(); +} ///////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/dbgeventcb.h b/pykd/dbgeventcb.h index eb9863f..08e4989 100644 --- a/pykd/dbgeventcb.h +++ b/pykd/dbgeventcb.h @@ -6,12 +6,15 @@ class DbgEventCallbacks : public DebugBaseEventCallbacks { public: + static HRESULT Start(); + static void Stop(); + +private: + // may generate HRESULT exception if not registered DbgEventCallbacks(); void Deregister(); -private: - ///////////////////////////////////////////////////////////////////////////////// // IUnknown interface implementation @@ -42,11 +45,11 @@ private: IDebugClient *m_dbgClient; IDebugSymbols3 *m_dbgSymbols3; + + ///////////////////////////////////////////////////////////////////////////////// + // global singleton + + static DbgEventCallbacks *dbgEventCallbacks; + + ///////////////////////////////////////////////////////////////////////////////// }; - -///////////////////////////////////////////////////////////////////////////////// -// global singleton - -extern DbgEventCallbacks *dbgEventCallbacks; - -///////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 1f81a92..6ee2ab6 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -227,7 +227,7 @@ VOID CALLBACK DebugExtensionUninitialize() { - stopDbgEventMonotoring(); + DbgEventCallbacks::Stop(); delete windbgGlobalSession; windbgGlobalSession = NULL; diff --git a/pykd/dbgsession.h b/pykd/dbgsession.h index 21a4d16..64f9d5b 100644 --- a/pykd/dbgsession.h +++ b/pykd/dbgsession.h @@ -6,29 +6,9 @@ dbgCreateSession(); extern bool dbgSessionStarted; -inline void stopDbgEventMonotoring() -{ - if (dbgEventCallbacks) - dbgEventCallbacks->Deregister(); -} - inline HRESULT setDbgSessionStarted() { - HRESULT hres; - try - { - stopDbgEventMonotoring(); - dbgEventCallbacks = new DbgEventCallbacks; - hres = S_OK; - } - catch (HRESULT _hres) - { - hres = _hres; - } - catch (...) - { - hres = E_OUTOFMEMORY; - } + HRESULT hres = DbgEventCallbacks::Start(); if (SUCCEEDED(hres)) dbgSessionStarted = true; return hres;