Oops, forgot to add the sample test file.
//
https://github.com/openjdk/jdk/blob/master/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp
#include <inttypes.h>
#include <limits.h>
#include <stdio.h>
#include <windows.h>
#define DEBUG_NO_IMPLEMENTATION
#include <dbgeng.h>
#include <dbghelp.h>
#define COM_VERIFY_OK_(v, str, retValue) \
do { \
const HRESULT hr = (v); \
if (hr != S_OK) { \
printf("%s (hr: 0x%08X)", str, hr); \
} \
} while (false)
// class for IDebugOutputCallbacks
class SAOutputCallbacks : public IDebugOutputCallbacks {
LONG m_refCount;
char* m_msgBuffer;
public:
SAOutputCallbacks() : m_refCount(1), m_msgBuffer(nullptr) {
}
~SAOutputCallbacks() {
clearBuffer();
}
const char* getBuffer() const {
return m_msgBuffer;
}
void clearBuffer() {
if (m_msgBuffer) {
free(m_msgBuffer);
m_msgBuffer = 0;
}
}
STDMETHOD_(ULONG, AddRef)(THIS);
STDMETHOD_(ULONG, Release)(THIS);
STDMETHOD(QueryInterface)(THIS_
IN REFIID interfaceId,
OUT PVOID* ppInterface);
STDMETHOD(Output)(THIS_
IN ULONG mask,
IN PCSTR msg);
};
STDMETHODIMP_(ULONG) SAOutputCallbacks::AddRef(THIS) {
return InterlockedIncrement(&m_refCount);
}
STDMETHODIMP_(ULONG) SAOutputCallbacks::Release(THIS) {
LONG retVal = InterlockedDecrement(&m_refCount);
if (retVal == 0) {
delete this;
}
return retVal;
}
STDMETHODIMP SAOutputCallbacks::QueryInterface(THIS_
IN REFIID interfaceId,
OUT PVOID* ppInterface) {
*ppInterface = nullptr;
if (IsEqualIID(interfaceId, __uuidof(IUnknown)) ||
IsEqualIID(interfaceId, __uuidof(IDebugOutputCallbacks))) {
*ppInterface = static_cast<IDebugOutputCallbacks*>(this);
} else {
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
STDMETHODIMP SAOutputCallbacks::Output(THIS_
IN ULONG mask,
IN PCSTR msg) {
size_t len = strlen(msg) + 1;
if (m_msgBuffer == 0) {
m_msgBuffer = (char*) malloc(len);
if (m_msgBuffer == 0) {
fprintf(stderr, "out of memory debugger output!\n");
return S_FALSE;
}
strcpy(m_msgBuffer, msg);
} else {
char* newBuffer = (char*)realloc(m_msgBuffer, len + strlen(m_msgBuffer));
if (newBuffer == nullptr) {
// old m_msgBuffer buffer is still valid
fprintf(stderr, "out of memory debugger output!\n");
return S_FALSE;
}
m_msgBuffer = newBuffer;
strcat(m_msgBuffer, msg);
}
return S_OK;
}
static bool getWindbgInterfaces(void) {
// get windbg interfaces ..
IDebugClient* ptrIDebugClient = 0;
COM_VERIFY_OK_(DebugCreate(__uuidof(IDebugClient), (PVOID*) &ptrIDebugClient),
"Windbg Error: not able to create IDebugClient object!",
false);
//env->SetLongField(obj, ptrIDebugClient_ID, (jlong) ptrIDebugClient);
IDebugControl* ptrIDebugControl = 0;
COM_VERIFY_OK_(ptrIDebugClient->QueryInterface(
__uuidof(IDebugControl), (PVOID*) &ptrIDebugControl),
"Windbg Error: not able to get IDebugControl", false);
//env->SetLongField(obj, ptrIDebugControl_ID, (jlong) ptrIDebugControl);
IDebugDataSpaces* ptrIDebugDataSpaces = 0;
COM_VERIFY_OK_(ptrIDebugClient->QueryInterface(
__uuidof(IDebugDataSpaces), (PVOID*) &ptrIDebugDataSpaces),
"Windbg Error: not able to get IDebugDataSpaces object!",
false);
//env->SetLongField(obj, ptrIDebugDataSpaces_ID, (jlong) ptrIDebugDataSpaces);
SAOutputCallbacks* ptrIDebugOutputCallbacks = new SAOutputCallbacks();
//env->SetLongField(obj, ptrIDebugOutputCallbacks_ID, (jlong)
ptrIDebugOutputCallbacks);
//CHECK_EXCEPTION_(false);
IDebugAdvanced* ptrIDebugAdvanced = 0;
COM_VERIFY_OK_(ptrIDebugClient->QueryInterface(
__uuidof(IDebugAdvanced), (PVOID*) &ptrIDebugAdvanced),
"Windbg Error: not able to get IDebugAdvanced object!", false);
//env->SetLongField(obj, ptrIDebugAdvanced_ID, (jlong) ptrIDebugAdvanced);
IDebugSymbols* ptrIDebugSymbols = 0;
COM_VERIFY_OK_(ptrIDebugClient->QueryInterface(
__uuidof(IDebugSymbols), (PVOID*) &ptrIDebugSymbols),
"Windbg Error: not able to get IDebugSymbols object!", false);
//env->SetLongField(obj, ptrIDebugSymbols_ID, (jlong) ptrIDebugSymbols);
IDebugSystemObjects* ptrIDebugSystemObjects = 0;
COM_VERIFY_OK_(ptrIDebugClient->QueryInterface(
__uuidof(IDebugSystemObjects), (PVOID*)
&ptrIDebugSystemObjects),
"Windbg Error: not able to get IDebugSystemObjects object!",
false);
//env->SetLongField(obj, ptrIDebugSystemObjects_ID, (jlong)
ptrIDebugSystemObjects);
return true;
}
int main()
{
SAOutputCallbacks var;
var.AddRef();
}
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public