166 lines
3.4 KiB
C++
166 lines
3.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
dbgexts.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains the generic routines and initialization code
|
||
|
for the debugger extensions dll.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "dbgexts.h"
|
||
|
|
||
|
|
||
|
PDEBUG_CLIENT g_ExtClient;
|
||
|
PDEBUG_CONTROL g_ExtControl;
|
||
|
PDEBUG_SYMBOLS g_ExtSymbols;
|
||
|
PDEBUG_SYMBOLS2 g_ExtSymbols2;
|
||
|
|
||
|
WINDBG_EXTENSION_APIS ExtensionApis;
|
||
|
|
||
|
ULONG TargetMachine;
|
||
|
BOOL Connected;
|
||
|
|
||
|
// Queries for all debugger interfaces.
|
||
|
extern "C" HRESULT
|
||
|
ExtQuery(PDEBUG_CLIENT Client)
|
||
|
{
|
||
|
HRESULT Status;
|
||
|
|
||
|
if ((Status = Client->QueryInterface(__uuidof(IDebugControl),
|
||
|
(void **)&g_ExtControl)) != S_OK)
|
||
|
{
|
||
|
goto Fail;
|
||
|
}
|
||
|
if ((Status = Client->QueryInterface(__uuidof(IDebugSymbols),
|
||
|
(void **)&g_ExtSymbols)) != S_OK)
|
||
|
{
|
||
|
goto Fail;
|
||
|
}
|
||
|
if ((Status = Client->QueryInterface(__uuidof(IDebugSymbols2),
|
||
|
(void **)&g_ExtSymbols2)) != S_OK)
|
||
|
{
|
||
|
goto Fail;
|
||
|
}
|
||
|
g_ExtClient = Client;
|
||
|
|
||
|
return S_OK;
|
||
|
|
||
|
Fail:
|
||
|
ExtRelease();
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
// Cleans up all debugger interfaces.
|
||
|
void
|
||
|
ExtRelease(void)
|
||
|
{
|
||
|
g_ExtClient = NULL;
|
||
|
EXT_RELEASE(g_ExtControl);
|
||
|
EXT_RELEASE(g_ExtSymbols);
|
||
|
EXT_RELEASE(g_ExtSymbols2);
|
||
|
}
|
||
|
|
||
|
extern "C"
|
||
|
HRESULT
|
||
|
CALLBACK
|
||
|
DebugExtensionInitialize(PULONG Version, PULONG Flags)
|
||
|
{
|
||
|
IDebugClient *DebugClient;
|
||
|
PDEBUG_CONTROL DebugControl;
|
||
|
HRESULT Hr;
|
||
|
|
||
|
*Version = DEBUG_EXTENSION_VERSION(1, 0);
|
||
|
*Flags = 0;
|
||
|
|
||
|
|
||
|
if ((Hr = DebugCreate(__uuidof(IDebugClient),
|
||
|
(void **)&DebugClient)) != S_OK)
|
||
|
{
|
||
|
return Hr;
|
||
|
}
|
||
|
|
||
|
if ((Hr = DebugClient->QueryInterface(__uuidof(IDebugControl),
|
||
|
(void **)&DebugControl)) == S_OK)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Get the windbg-style extension APIS
|
||
|
//
|
||
|
ExtensionApis.nSize = sizeof (ExtensionApis);
|
||
|
if ((Hr = DebugControl->GetWindbgExtensionApis64(&ExtensionApis)) != S_OK)
|
||
|
return Hr;
|
||
|
|
||
|
DebugControl->Release();
|
||
|
|
||
|
}
|
||
|
DebugClient->Release();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C"
|
||
|
void
|
||
|
CALLBACK
|
||
|
DebugExtensionNotify(ULONG Notify, ULONG64 Argument)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(Argument);
|
||
|
|
||
|
//
|
||
|
// The first time we actually connect to a target
|
||
|
//
|
||
|
|
||
|
if ((Notify == DEBUG_NOTIFY_SESSION_ACCESSIBLE) && (!Connected))
|
||
|
{
|
||
|
IDebugClient *DebugClient;
|
||
|
HRESULT Hr;
|
||
|
PDEBUG_CONTROL DebugControl;
|
||
|
|
||
|
if ((Hr = DebugCreate(__uuidof(IDebugClient),
|
||
|
(void **)&DebugClient)) == S_OK)
|
||
|
{
|
||
|
//
|
||
|
// Get the architecture type.
|
||
|
//
|
||
|
|
||
|
if ((Hr = DebugClient->QueryInterface(__uuidof(IDebugControl),
|
||
|
(void **)&DebugControl)) == S_OK)
|
||
|
{
|
||
|
if ((Hr = DebugControl->GetActualProcessorType(
|
||
|
&TargetMachine)) == S_OK)
|
||
|
{
|
||
|
Connected = TRUE;
|
||
|
}
|
||
|
|
||
|
NotifyOnTargetAccessible(DebugControl);
|
||
|
|
||
|
DebugControl->Release();
|
||
|
}
|
||
|
|
||
|
DebugClient->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (Notify == DEBUG_NOTIFY_SESSION_INACTIVE)
|
||
|
{
|
||
|
Connected = FALSE;
|
||
|
TargetMachine = 0;
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
extern "C"
|
||
|
void
|
||
|
CALLBACK
|
||
|
DebugExtensionUninitialize(void)
|
||
|
{
|
||
|
return;
|
||
|
}
|