[PATCH 3/6] dbgeng: Add IDebugDataSpaces stub.

Nikolay Sivov nsivov at codeweavers.com
Wed Apr 3 04:16:45 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dbgeng/dbgeng.c | 236 ++++++++++++++++++++++++++++++++++++++++++-
 include/dbgeng.h     |  40 ++++++++
 2 files changed, 271 insertions(+), 5 deletions(-)

diff --git a/dlls/dbgeng/dbgeng.c b/dlls/dbgeng/dbgeng.c
index a2fbdfdc03..49fd9f3ec9 100644
--- a/dlls/dbgeng/dbgeng.c
+++ b/dlls/dbgeng/dbgeng.c
@@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbgeng);
 struct debug_client
 {
     IDebugClient IDebugClient_iface;
+    IDebugDataSpaces IDebugDataSpaces_iface;
     LONG refcount;
 };
 
@@ -45,21 +46,35 @@ static struct debug_client *impl_from_IDebugClient(IDebugClient *iface)
     return CONTAINING_RECORD(iface, struct debug_client, IDebugClient_iface);
 }
 
+static struct debug_client *impl_from_IDebugDataSpaces(IDebugDataSpaces *iface)
+{
+    return CONTAINING_RECORD(iface, struct debug_client, IDebugDataSpaces_iface);
+}
+
 static HRESULT STDMETHODCALLTYPE debugclient_QueryInterface(IDebugClient *iface, REFIID riid, void **obj)
 {
+    struct debug_client *debug_client = impl_from_IDebugClient(iface);
+
     TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
 
     if (IsEqualIID(riid, &IID_IDebugClient) ||
             IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        iface->lpVtbl->AddRef(iface);
-        return S_OK;
+    }
+    else if (IsEqualIID(riid, &IID_IDebugDataSpaces))
+    {
+        *obj = &debug_client->IDebugDataSpaces_iface;
+    }
+    else
+    {
+        WARN("Unsupported interface %s.\n", debugstr_guid(riid));
+        *obj = NULL;
+        return E_NOINTERFACE;
     }
 
-    WARN("Unsupported interface %s.\n", debugstr_guid(riid));
-    *obj = NULL;
-    return E_NOINTERFACE;
+    IUnknown_AddRef((IUnknown *)*obj);
+    return S_OK;
 }
 
 static ULONG STDMETHODCALLTYPE debugclient_AddRef(IDebugClient *iface)
@@ -467,6 +482,216 @@ static const IDebugClientVtbl debugclientvtbl =
     debugclient_FlushCallbacks,
 };
 
+static HRESULT STDMETHODCALLTYPE debugdataspaces_QueryInterface(IDebugDataSpaces *iface, REFIID riid, void **obj)
+{
+    struct debug_client *debug_client = impl_from_IDebugDataSpaces(iface);
+    IUnknown *unk = (IUnknown *)&debug_client->IDebugClient_iface;
+    return IUnknown_QueryInterface(unk, riid, obj);
+}
+
+static ULONG STDMETHODCALLTYPE debugdataspaces_AddRef(IDebugDataSpaces *iface)
+{
+    struct debug_client *debug_client = impl_from_IDebugDataSpaces(iface);
+    IUnknown *unk = (IUnknown *)&debug_client->IDebugClient_iface;
+    return IUnknown_AddRef(unk);
+}
+
+static ULONG STDMETHODCALLTYPE debugdataspaces_Release(IDebugDataSpaces *iface)
+{
+    struct debug_client *debug_client = impl_from_IDebugDataSpaces(iface);
+    IUnknown *unk = (IUnknown *)&debug_client->IDebugClient_iface;
+    return IUnknown_Release(unk);
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadVirtual(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
+        ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteVirtual(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
+        ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_SearchVirtual(IDebugDataSpaces *iface, ULONG64 offset, ULONG64 length,
+        void *pattern, ULONG pattern_size, ULONG pattern_granularity, ULONG64 *ret_offset)
+{
+    FIXME("%p, %s, %s, %p, %u, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), wine_dbgstr_longlong(length),
+            pattern, pattern_size, pattern_granularity, ret_offset);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadVirtualUncached(IDebugDataSpaces *iface, ULONG64 offset,
+        void *buffer, ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteVirtualUncached(IDebugDataSpaces *iface, ULONG64 offset,
+        void *buffer, ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadPointersVirtual(IDebugDataSpaces *iface, ULONG count,
+        ULONG64 offset, ULONG64 *pointers)
+{
+    FIXME("%p, %u, %s, %p stub.\n", iface, count, wine_dbgstr_longlong(offset), pointers);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WritePointersVirtual(IDebugDataSpaces *iface, ULONG count,
+        ULONG64 offset, ULONG64 *pointers)
+{
+    FIXME("%p, %u, %s, %p stub.\n", iface, count, wine_dbgstr_longlong(offset), pointers);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadPhysical(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
+        ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WritePhysical(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
+        ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadControl(IDebugDataSpaces *iface, ULONG processor, ULONG64 offset,
+        void *buffer, ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %u, %s, %p, %u, %p stub.\n", iface, processor, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteControl(IDebugDataSpaces *iface, ULONG processor, ULONG64 offset,
+        void *buffer, ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %u, %s, %p, %u, %p stub.\n", iface, processor, wine_dbgstr_longlong(offset), buffer, buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadIo(IDebugDataSpaces *iface, ULONG type, ULONG bus_number,
+        ULONG address_space, ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %u, %u, %u, %s, %p, %u, %p stub.\n", iface, type, bus_number, address_space, wine_dbgstr_longlong(offset),
+            buffer, buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteIo(IDebugDataSpaces *iface, ULONG type, ULONG bus_number,
+        ULONG address_space, ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %u, %u, %u, %s, %p, %u, %p stub.\n", iface, type, bus_number, address_space, wine_dbgstr_longlong(offset),
+            buffer, buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadMsr(IDebugDataSpaces *iface, ULONG msr, ULONG64 *value)
+{
+    FIXME("%p, %u, %p stub.\n", iface, msr, value);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteMsr(IDebugDataSpaces *iface, ULONG msr, ULONG64 value)
+{
+    FIXME("%p, %u, %s stub.\n", iface, msr, wine_dbgstr_longlong(value));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadBusData(IDebugDataSpaces *iface, ULONG data_type,
+        ULONG bus_number, ULONG slot_number, ULONG offset, void *buffer, ULONG buffer_size, ULONG *read_len)
+{
+    FIXME("%p, %u, %u, %u, %u, %p, %u, %p stub.\n", iface, data_type, bus_number, slot_number, offset, buffer,
+            buffer_size, read_len);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteBusData(IDebugDataSpaces *iface, ULONG data_type,
+        ULONG bus_number, ULONG slot_number, ULONG offset, void *buffer, ULONG buffer_size, ULONG *written)
+{
+    FIXME("%p, %u, %u, %u, %u, %p, %u, %p stub.\n", iface, data_type, bus_number, slot_number, offset, buffer,
+            buffer_size, written);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_CheckLowMemory(IDebugDataSpaces *iface)
+{
+    FIXME("%p stub.\n", iface);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadDebuggerData(IDebugDataSpaces *iface, ULONG index, void *buffer,
+        ULONG buffer_size, ULONG *data_size)
+{
+    FIXME("%p, %u, %p, %u, %p stub.\n", iface, index, buffer, buffer_size, data_size);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadProcessorSystemData(IDebugDataSpaces *iface, ULONG processor,
+        ULONG index, void *buffer, ULONG buffer_size, ULONG *data_size)
+{
+    FIXME("%p, %u, %u, %p, %u, %p stub.\n", iface, processor, index, buffer, buffer_size, data_size);
+
+    return E_NOTIMPL;
+}
+
+static const IDebugDataSpacesVtbl debugdataspacesvtbl =
+{
+    debugdataspaces_QueryInterface,
+    debugdataspaces_AddRef,
+    debugdataspaces_Release,
+    debugdataspaces_ReadVirtual,
+    debugdataspaces_WriteVirtual,
+    debugdataspaces_SearchVirtual,
+    debugdataspaces_ReadVirtualUncached,
+    debugdataspaces_WriteVirtualUncached,
+    debugdataspaces_ReadPointersVirtual,
+    debugdataspaces_WritePointersVirtual,
+    debugdataspaces_ReadPhysical,
+    debugdataspaces_WritePhysical,
+    debugdataspaces_ReadControl,
+    debugdataspaces_WriteControl,
+    debugdataspaces_ReadIo,
+    debugdataspaces_WriteIo,
+    debugdataspaces_ReadMsr,
+    debugdataspaces_WriteMsr,
+    debugdataspaces_ReadBusData,
+    debugdataspaces_WriteBusData,
+    debugdataspaces_CheckLowMemory,
+    debugdataspaces_ReadDebuggerData,
+    debugdataspaces_ReadProcessorSystemData,
+};
+
 /************************************************************
 *                    DebugExtensionInitialize   (DBGENG.@)
 *
@@ -508,6 +733,7 @@ HRESULT WINAPI DebugCreate(REFIID riid, void **obj)
         return E_OUTOFMEMORY;
 
     debug_client->IDebugClient_iface.lpVtbl = &debugclientvtbl;
+    debug_client->IDebugDataSpaces_iface.lpVtbl = &debugdataspacesvtbl;
     debug_client->refcount = 1;
 
     unk = (IUnknown *)&debug_client->IDebugClient_iface;
diff --git a/include/dbgeng.h b/include/dbgeng.h
index 03305cce41..797aab7c68 100644
--- a/include/dbgeng.h
+++ b/include/dbgeng.h
@@ -26,6 +26,7 @@ DEFINE_GUID(IID_IDebugInputCallbacks,     0x9f50e42c, 0xf136, 0x499e, 0x9a, 0x97
 DEFINE_GUID(IID_IDebugOutputCallbacks,    0x4bf58045, 0xd654, 0x4c40, 0xb0, 0xaf, 0x68, 0x30, 0x90, 0xf3, 0x56, 0xdc);
 DEFINE_GUID(IID_IDebugEventCallbacks,     0x337be28b, 0x5036, 0x4d72, 0xb6, 0xbf, 0xc4, 0x5f, 0xbb, 0x9f, 0x2e, 0xaa);
 DEFINE_GUID(IID_IDebugClient,             0x27fe5639, 0x8407, 0x4f47, 0x83, 0x64, 0xee, 0x11, 0x8f, 0xb0, 0x8a, 0xc8);
+DEFINE_GUID(IID_IDebugDataSpaces,         0x88f7dfab, 0x3ea7, 0x4c3a, 0xae, 0xfb, 0xc4, 0xe8, 0x10, 0x61, 0x73, 0xaa);
 
 #define INTERFACE IDebugBreakpoint
 DECLARE_INTERFACE_(IDebugBreakpoint, IUnknown)
@@ -158,6 +159,45 @@ DECLARE_INTERFACE_(IDebugClient, IUnknown)
 };
 #undef INTERFACE
 
+#define INTERFACE IDebugDataSpaces
+DECLARE_INTERFACE_(IDebugDataSpaces, IUnknown)
+{
+    /* IUnknown */
+    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **out) PURE;
+    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /* IDebugDataSpaces */
+    STDMETHOD(ReadVirtual)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *read_len) PURE;
+    STDMETHOD(WriteVirtual)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *written) PURE;
+    STDMETHOD(SearchVirtual)(THIS_ ULONG64 offset, ULONG64 length, void *pattern, ULONG pattern_size,
+            ULONG pattern_granularity, ULONG64 *ret_offset) PURE;
+    STDMETHOD(ReadVirtualUncached)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *read_len) PURE;
+    STDMETHOD(WriteVirtualUncached)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *written) PURE;
+    STDMETHOD(ReadPointersVirtual)(THIS_ ULONG count, ULONG64 offset, ULONG64 *pointers) PURE;
+    STDMETHOD(WritePointersVirtual)(THIS_ ULONG count, ULONG64 offset, ULONG64 *pointers) PURE;
+    STDMETHOD(ReadPhysical)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *read_len) PURE;
+    STDMETHOD(WritePhysical)(THIS_ ULONG64 offset, void *buffer, ULONG buffer_size, ULONG *written) PURE;
+    STDMETHOD(ReadControl)(THIS_ ULONG processor, ULONG64 offset, void *buffer, ULONG buffer_size,
+            ULONG *read_len) PURE;
+    STDMETHOD(WriteControl)(THIS_ ULONG processor, ULONG64 offset, void *buffer, ULONG buffer_size,
+            ULONG *written) PURE;
+    STDMETHOD(ReadIo)(THIS_ ULONG type, ULONG bus_number, ULONG address_space, ULONG64 offset, void *buffer,
+            ULONG buffer_size, ULONG *read_len) PURE;
+    STDMETHOD(WriteIo)(THIS_ ULONG type, ULONG bus_number, ULONG address_space, ULONG64 offset, void *buffer,
+            ULONG buffer_size, ULONG *written) PURE;
+    STDMETHOD(ReadMsr)(THIS_ ULONG msr, ULONG64 *value) PURE;
+    STDMETHOD(WriteMsr)(THIS_ ULONG msr, ULONG64 value) PURE;
+    STDMETHOD(ReadBusData)(THIS_ ULONG data_type, ULONG bus_number, ULONG slot_number, ULONG offset, void *buffer,
+            ULONG buffer_size, ULONG *read_len) PURE;
+    STDMETHOD(WriteBusData)(THIS_ ULONG data_type, ULONG bus_number, ULONG slot_number, ULONG offset, void *buffer,
+            ULONG buffer_size, ULONG *written) PURE;
+    STDMETHOD(CheckLowMemory)(THIS) PURE;
+    STDMETHOD(ReadDebuggerData)(THIS_ ULONG index, void *buffer, ULONG buffer_size, ULONG *data_size) PURE;
+    STDMETHOD(ReadProcessorSystemData)(THIS_ ULONG processor, ULONG index, void *buffer, ULONG buffer_size,
+            ULONG *data_size) PURE;
+};
+#undef INTERFACE
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.20.1




More information about the wine-devel mailing list