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-05-23 14:43:24 +08:00
|
|
|
#include "dbgbreak.h"
|
2011-05-23 19:35:43 +08:00
|
|
|
#include "dbgevent.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-04-14 20:28:22 +08:00
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
try {
|
2011-03-03 03:58:41 +08:00
|
|
|
|
2011-04-14 20:28:22 +08:00
|
|
|
m_debugClient = client;
|
|
|
|
m_debugClient->AddRef();
|
2011-04-08 15:53:37 +08:00
|
|
|
|
|
|
|
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" );
|
|
|
|
|
|
|
|
}
|
2011-04-14 20:28:22 +08:00
|
|
|
catch( std::exception& e)
|
2011-04-08 15:53:37 +08:00
|
|
|
{
|
2011-04-14 20:28:22 +08:00
|
|
|
dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() );
|
2011-04-08 15:53:37 +08:00
|
|
|
}
|
|
|
|
catch(...)
|
|
|
|
{
|
2011-04-14 20:28:22 +08:00
|
|
|
dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" );
|
2011-04-08 15:53:37 +08:00
|
|
|
}
|
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 )
|
2011-04-14 23:09:17 +08:00
|
|
|
{
|
|
|
|
m_debugClient->SetEventCallbacks( NULL );
|
2011-04-08 15:53:37 +08:00
|
|
|
m_debugClient->Release();
|
2011-04-14 23:09:17 +08:00
|
|
|
}
|
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-05-23 07:55:20 +08:00
|
|
|
*Mask =
|
|
|
|
DEBUG_EVENT_CHANGE_SYMBOL_STATE |
|
|
|
|
DEBUG_EVENT_BREAKPOINT |
|
|
|
|
DEBUG_EVENT_LOAD_MODULE |
|
|
|
|
DEBUG_EVENT_UNLOAD_MODULE;
|
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
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if ((DEBUG_CSS_LOADS & Flags))
|
|
|
|
{
|
|
|
|
if (Argument)
|
2011-04-08 15:53:37 +08:00
|
|
|
{
|
2011-05-23 07:55:20 +08:00
|
|
|
DEBUG_MODULE_PARAMETERS dbgModuleParameters;
|
2011-04-08 15:53:37 +08:00
|
|
|
HRESULT hres = dbgExt->symbols3->GetModuleParameters(
|
|
|
|
1,
|
|
|
|
&Argument,
|
|
|
|
0,
|
|
|
|
&dbgModuleParameters);
|
2011-05-23 07:55:20 +08:00
|
|
|
|
2011-04-08 15:53:37 +08:00
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
ModuleInfo moduleInfo(dbgModuleParameters);
|
|
|
|
restoreSyntheticSymbolForModule(moduleInfo);
|
2011-05-23 07:55:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return S_OK;
|
2011-04-08 15:53:37 +08:00
|
|
|
}
|
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-05-23 07:55:20 +08:00
|
|
|
|
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-05-23 07:55:20 +08:00
|
|
|
}
|
2011-04-08 15:53:37 +08:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
2011-03-02 21:16:42 +08:00
|
|
|
|
2011-05-23 07:55:20 +08:00
|
|
|
HRESULT DbgEventCallbacksManager::LoadModule(
|
|
|
|
__in ULONG64 ImageFileHandle,
|
|
|
|
__in ULONG64 BaseOffset,
|
|
|
|
__in ULONG ModuleSize,
|
|
|
|
__in PCSTR ModuleName,
|
|
|
|
__in PCSTR ImageName,
|
|
|
|
__in ULONG CheckSum,
|
|
|
|
__in ULONG TimeDateStamp
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2011-05-23 19:35:43 +08:00
|
|
|
return debugEvent::moduleLoaded(BaseOffset);
|
2011-05-23 07:55:20 +08:00
|
|
|
}
|
|
|
|
catch (std::exception &)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
HRESULT DbgEventCallbacksManager::UnloadModule(
|
|
|
|
__in PCSTR ImageBaseName,
|
|
|
|
__in ULONG64 BaseOffset
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2011-05-23 19:35:43 +08:00
|
|
|
return debugEvent::moduleUnloaded(BaseOffset);
|
2011-05-23 07:55:20 +08:00
|
|
|
}
|
|
|
|
catch (std::exception &)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|