Esme Povirk : diasymreader: Implement SymWriter_GetDebugInfo.

Alexandre Julliard julliard at winehq.org
Fri Feb 4 16:08:36 CST 2022


Module: wine
Branch: master
Commit: b2fe43b5a0b62dd5de99acbaee7177894fab6b68
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b2fe43b5a0b62dd5de99acbaee7177894fab6b68

Author: Esme Povirk <esme at codeweavers.com>
Date:   Fri Feb  4 13:41:48 2022 -0600

diasymreader: Implement SymWriter_GetDebugInfo.

Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/diasymreader/Makefile.in |  2 +-
 dlls/diasymreader/writer.c    | 64 +++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/dlls/diasymreader/Makefile.in b/dlls/diasymreader/Makefile.in
index e9d6fee09e8..34e1286a496 100644
--- a/dlls/diasymreader/Makefile.in
+++ b/dlls/diasymreader/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = diasymreader.dll
-IMPORTS   = uuid
+IMPORTS   = uuid rpcrt4
 
 EXTRADLLFLAGS = -Wb,--prefer-native
 
diff --git a/dlls/diasymreader/writer.c b/dlls/diasymreader/writer.c
index 7970fbaca9a..638c3adec51 100644
--- a/dlls/diasymreader/writer.c
+++ b/dlls/diasymreader/writer.c
@@ -23,7 +23,9 @@
 #include "windef.h"
 #include "winbase.h"
 #include "objbase.h"
+#include "rpc.h"
 
+#include "wine/mscvpdb.h"
 #include "wine/debug.h"
 #include "wine/heap.h"
 
@@ -34,6 +36,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(diasymreader);
 typedef struct SymWriter {
     ISymUnmanagedWriter5 iface;
     LONG ref;
+    CRITICAL_SECTION lock;
+    GUID pdb_guid;
+    DWORD pdb_age;
+    WCHAR pdb_filename[MAX_PATH];
 } SymWriter;
 
 static inline SymWriter *impl_from_ISymUnmanagedWriter5(ISymUnmanagedWriter5 *iface)
@@ -87,6 +93,8 @@ static ULONG WINAPI SymWriter_Release(ISymUnmanagedWriter5 *iface)
 
     if (ref == 0)
     {
+        This->lock.DebugInfo->Spare[0] = 0;
+        DeleteCriticalSection(&This->lock);
         heap_free(This);
     }
 
@@ -213,15 +221,62 @@ static HRESULT WINAPI SymWriter_SetMethodSourceRange(ISymUnmanagedWriter5 *iface
 static HRESULT WINAPI SymWriter_Initialize(ISymUnmanagedWriter5 *iface, IUnknown *emitter, const WCHAR *filename,
     IStream *pIStream, BOOL fFullBuild)
 {
+    SymWriter *This = impl_from_ISymUnmanagedWriter5(iface);
+
     FIXME("(%p,%p,%s,%p,%u)\n", iface, emitter, debugstr_w(filename), pIStream, fFullBuild);
+
+    EnterCriticalSection(&This->lock);
+
+    if (filename)
+        wcsncpy_s(This->pdb_filename, MAX_PATH, filename, _TRUNCATE);
+
+    LeaveCriticalSection(&This->lock);
+
     return S_OK;
 }
 
 static HRESULT WINAPI SymWriter_GetDebugInfo(ISymUnmanagedWriter5 *iface, IMAGE_DEBUG_DIRECTORY *pIDD, DWORD cData,
     DWORD *pcData, BYTE data[])
 {
-    FIXME("(%p,%p,%lu,%p,%p)\n", iface, pIDD, cData, pcData, data);
-    return E_NOTIMPL;
+    SymWriter *This = impl_from_ISymUnmanagedWriter5(iface);
+    DWORD name_length, data_size;
+    OMFSignatureRSDS *rsds_data = (OMFSignatureRSDS*)data;
+
+    TRACE("(%p,%p,%lu,%p,%p)\n", iface, pIDD, cData, pcData, data);
+
+    EnterCriticalSection(&This->lock);
+
+    name_length = WideCharToMultiByte(CP_UTF8, 0, This->pdb_filename, -1, NULL, 0, NULL, NULL);
+    data_size = FIELD_OFFSET(OMFSignatureRSDS, name) + name_length;
+    if (pcData)
+        *pcData = data_size;
+
+    if (pIDD)
+    {
+        pIDD->Characteristics = 0;
+        pIDD->MajorVersion = 0;
+        pIDD->MinorVersion = 0;
+        pIDD->Type = IMAGE_DEBUG_TYPE_CODEVIEW;
+        pIDD->SizeOfData = data_size;
+    }
+
+    if (data)
+    {
+        if (data_size > cData)
+        {
+            LeaveCriticalSection(&This->lock);
+            return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+        }
+
+        memcpy(rsds_data->Signature, "RSDS", 4);
+        rsds_data->guid = This->pdb_guid;
+        rsds_data->age = This->pdb_age;
+        WideCharToMultiByte(CP_UTF8, 0, This->pdb_filename, -1, rsds_data->name, name_length, NULL, NULL);
+    }
+
+    LeaveCriticalSection(&This->lock);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI SymWriter_DefineSequencePoints(ISymUnmanagedWriter5 *iface, ISymUnmanagedDocumentWriter *document,
@@ -367,6 +422,11 @@ HRESULT SymWriter_CreateInstance(REFIID iid, void **ppv)
 
     This->iface.lpVtbl = &SymWriter_Vtbl;
     This->ref = 1;
+    InitializeCriticalSection(&This->lock);
+    This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SymWriter.lock");
+    UuidCreate(&This->pdb_guid);
+    This->pdb_age = 1;
+    This->pdb_filename[0] = 0;
 
     hr = IUnknown_QueryInterface(&This->iface, iid, ppv);
 




More information about the wine-cvs mailing list