2011-03-02 21:16:42 +08:00
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "dbgext.h"
|
|
|
|
#include "dbgmem.h"
|
|
|
|
#include "dbgmodule.h"
|
|
|
|
#include "dbgexcept.h"
|
|
|
|
#include "dbgsynsym.h"
|
|
|
|
#include "dbgeventcb.h"
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 03:58:41 +08:00
|
|
|
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();
|
|
|
|
}
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 02:37:42 +08:00
|
|
|
DbgEventCallbacks::DbgEventCallbacks()
|
|
|
|
: m_ReferenceCount(1)
|
|
|
|
, m_dbgClient(NULL)
|
|
|
|
, m_dbgSymbols3(NULL)
|
2011-03-02 21:16:42 +08:00
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// monitor "global" WinDbg events
|
|
|
|
hres = DebugCreate(
|
2011-03-03 00:28:33 +08:00
|
|
|
__uuidof(IDebugClient),
|
|
|
|
reinterpret_cast<PVOID *>(&m_dbgClient));
|
|
|
|
if (FAILED(hres))
|
|
|
|
throw hres;
|
|
|
|
|
|
|
|
hres = m_dbgClient->QueryInterface(
|
2011-03-02 21:16:42 +08:00
|
|
|
__uuidof(IDebugSymbols3),
|
|
|
|
reinterpret_cast<PVOID *>(&m_dbgSymbols3));
|
|
|
|
if (FAILED(hres))
|
|
|
|
throw hres;
|
|
|
|
|
|
|
|
hres = m_dbgClient->SetEventCallbacks(this);
|
|
|
|
if (FAILED(hres))
|
|
|
|
throw hres;
|
|
|
|
|
|
|
|
hres = S_OK;
|
|
|
|
}
|
|
|
|
catch(HRESULT _hres)
|
|
|
|
{
|
|
|
|
hres = _hres;
|
|
|
|
}
|
|
|
|
catch(...)
|
|
|
|
{
|
|
|
|
hres = S_FALSE;
|
|
|
|
}
|
|
|
|
if (S_OK != hres)
|
2011-03-03 02:37:42 +08:00
|
|
|
{
|
2011-03-02 21:16:42 +08:00
|
|
|
Deregister();
|
2011-03-03 02:37:42 +08:00
|
|
|
throw hres;
|
|
|
|
}
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
void DbgEventCallbacks::Deregister()
|
|
|
|
{
|
2011-03-03 00:28:33 +08:00
|
|
|
if (m_dbgSymbols3)
|
2011-03-02 21:16:42 +08:00
|
|
|
{
|
2011-03-03 00:28:33 +08:00
|
|
|
m_dbgSymbols3->Release();
|
|
|
|
m_dbgSymbols3 = NULL;
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
2011-03-03 00:28:33 +08:00
|
|
|
if (m_dbgClient)
|
2011-03-02 21:16:42 +08:00
|
|
|
{
|
2011-03-03 00:28:33 +08:00
|
|
|
m_dbgClient->Release();
|
|
|
|
m_dbgClient = NULL;
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
2011-03-03 02:37:42 +08:00
|
|
|
Release();
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 02:37:42 +08:00
|
|
|
ULONG DbgEventCallbacks::AddRef()
|
2011-03-02 21:16:42 +08:00
|
|
|
{
|
2011-03-03 02:37:42 +08:00
|
|
|
return InterlockedIncrement(&m_ReferenceCount);
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 02:37:42 +08:00
|
|
|
ULONG DbgEventCallbacks::Release()
|
2011-03-02 21:16:42 +08:00
|
|
|
{
|
2011-03-03 02:37:42 +08:00
|
|
|
ULONG nResult = InterlockedDecrement(&m_ReferenceCount);
|
|
|
|
if (!nResult)
|
|
|
|
{
|
|
|
|
dbgEventCallbacks = NULL;
|
|
|
|
delete this;
|
|
|
|
}
|
|
|
|
return nResult;
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 02:37:42 +08:00
|
|
|
HRESULT DbgEventCallbacks::GetInterestMask(
|
|
|
|
__out PULONG Mask
|
2011-03-02 21:16:42 +08:00
|
|
|
)
|
|
|
|
{
|
2011-03-03 02:37:42 +08:00
|
|
|
*Mask = DEBUG_EVENT_CHANGE_SYMBOL_STATE;
|
|
|
|
return S_OK;
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-03-03 00:28:33 +08:00
|
|
|
HRESULT DbgEventCallbacks::ChangeSymbolState(
|
2011-03-02 21:16:42 +08:00
|
|
|
__in ULONG Flags,
|
|
|
|
__in ULONG64 Argument
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if ((DEBUG_CSS_LOADS & Flags))
|
|
|
|
{
|
|
|
|
if (Argument)
|
|
|
|
return doSymbolsLoaded(Argument);
|
|
|
|
|
|
|
|
// f.e. is case ".reload /f image.exe", if for image.exe no symbols
|
2011-03-03 02:37:42 +08:00
|
|
|
restoreSyntheticSymbolForAllModules(m_dbgSymbols3);
|
2011-03-02 21:16:42 +08:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2011-03-03 02:37:42 +08:00
|
|
|
return S_OK;
|
2011-03-02 21:16:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
HRESULT DbgEventCallbacks::doSymbolsLoaded(
|
|
|
|
ULONG64 moduleBase
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
DEBUG_MODULE_PARAMETERS dbgModuleParameters;
|
2011-03-03 02:37:42 +08:00
|
|
|
HRESULT hres = m_dbgSymbols3->GetModuleParameters(
|
2011-03-02 21:16:42 +08:00
|
|
|
1,
|
|
|
|
&moduleBase,
|
|
|
|
0,
|
|
|
|
&dbgModuleParameters);
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
ModuleInfo moduleInfo(dbgModuleParameters);
|
|
|
|
restoreSyntheticSymbolForModule(moduleInfo, m_dbgSymbols3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|