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