2011-03-02 21:16:42 +08:00
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
2011-04-08 15:53:37 +08:00
|
|
|
|
#include "dbgeng.h"
|
2011-03-02 21:16:42 +08:00
|
|
|
|
#include "dbgext.h"
|
2011-04-08 15:53:37 +08:00
|
|
|
|
#include "dbgeventcb.h"
|
2011-03-02 21:16:42 +08:00
|
|
|
|
#include "dbgexcept.h"
|
2011-04-08 15:53:37 +08:00
|
|
|
|
#include "dbgmodule.h"
|
2011-03-02 21:16:42 +08:00
|
|
|
|
#include "dbgsynsym.h"
|
2011-04-08 15:53:37 +08:00
|
|
|
|
#include "dbgcmd.h"
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
DbgEventCallbacksManager::DbgEventCallbacksManager( IDebugClient *client )
|
|
|
|
|
{
|
|
|
|
|
HRESULT hres;
|
2011-03-03 03:58:41 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
m_debugClient = NULL;
|
|
|
|
|
|
|
|
|
|
try {
|
2011-03-03 03:58:41 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
if ( client == NULL )
|
2011-03-30 20:57:53 +08:00
|
|
|
|
{
|
2011-04-08 15:53:37 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> windbg. <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
hres = DebugCreate( __uuidof(IDebugClient4), reinterpret_cast<PVOID*>(&m_debugClient));
|
|
|
|
|
if (FAILED(hres))
|
|
|
|
|
throw DbgException( "DebugCreate failed" );
|
2011-03-30 20:57:53 +08:00
|
|
|
|
}
|
2011-04-08 15:53:37 +08:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
hres =client->QueryInterface( __uuidof(IDebugClient4), reinterpret_cast<PVOID*>(&m_debugClient));
|
|
|
|
|
if (FAILED(hres))
|
|
|
|
|
throw DbgException( "DebugCreate failed" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hres = m_debugClient->SetEventCallbacks(this);
|
2011-03-02 21:16:42 +08:00
|
|
|
|
if (FAILED(hres))
|
2011-04-08 15:53:37 +08:00
|
|
|
|
throw DbgException( "IDebugClient::SetEventCallbacks" );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch( std::exception& )
|
|
|
|
|
{
|
|
|
|
|
//dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() );
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
//dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" );
|
|
|
|
|
}
|
2011-03-02 21:16:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
DbgEventCallbacksManager::~DbgEventCallbacksManager()
|
2011-03-02 21:16:42 +08:00
|
|
|
|
{
|
2011-04-08 15:53:37 +08:00
|
|
|
|
if ( m_debugClient )
|
|
|
|
|
m_debugClient->Release();
|
2011-03-02 21:16:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
HRESULT DbgEventCallbacksManager::GetInterestMask(
|
2011-03-03 02:37:42 +08:00
|
|
|
|
__out PULONG Mask
|
2011-03-02 21:16:42 +08:00
|
|
|
|
)
|
|
|
|
|
{
|
2011-04-08 15:53:37 +08:00
|
|
|
|
*Mask = DEBUG_EVENT_CHANGE_SYMBOL_STATE | DEBUG_EVENT_BREAKPOINT;
|
2011-03-03 02:37:42 +08:00
|
|
|
|
return S_OK;
|
2011-03-02 21:16:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
HRESULT DbgEventCallbacksManager::ChangeSymbolState(
|
2011-03-02 21:16:42 +08:00
|
|
|
|
__in ULONG Flags,
|
|
|
|
|
__in ULONG64 Argument
|
|
|
|
|
)
|
|
|
|
|
{
|
2011-04-08 15:53:37 +08:00
|
|
|
|
DbgExt ext( m_debugClient );
|
|
|
|
|
|
2011-03-02 21:16:42 +08:00
|
|
|
|
if ((DEBUG_CSS_LOADS & Flags))
|
|
|
|
|
{
|
|
|
|
|
if (Argument)
|
2011-04-08 15:53:37 +08:00
|
|
|
|
{
|
|
|
|
|
DEBUG_MODULE_PARAMETERS dbgModuleParameters={};
|
|
|
|
|
|
|
|
|
|
HRESULT hres = dbgExt->symbols3->GetModuleParameters(
|
|
|
|
|
1,
|
|
|
|
|
&Argument,
|
|
|
|
|
0,
|
|
|
|
|
&dbgModuleParameters);
|
|
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
|
{
|
|
|
|
|
ModuleInfo moduleInfo(dbgModuleParameters);
|
|
|
|
|
|
|
|
|
|
restoreSyntheticSymbolForModule(moduleInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
|
}
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
//// f.e. is case ".reload /f image.exe", if for image.exe no symbols
|
|
|
|
|
restoreSyntheticSymbolForAllModules();
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
|
HRESULT DbgEventCallbacksManager::Breakpoint(
|
|
|
|
|
__in IDebugBreakpoint * bp
|
2011-03-02 21:16:42 +08:00
|
|
|
|
)
|
|
|
|
|
{
|
2011-04-08 15:53:37 +08:00
|
|
|
|
return dbgBreakpointClass::onBreakpointEvnet( bp );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
|