2 * Copyright 2022 Esme Povirk
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/mscvpdb.h"
29 #include "wine/debug.h"
30 #include "wine/heap.h"
32 #include "diasymreader_private.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(diasymreader
);
36 typedef struct SymWriter
{
37 ISymUnmanagedWriter5 iface
;
38 IPdbWriter IPdbWriter_iface
;
40 CRITICAL_SECTION lock
;
43 WCHAR pdb_filename
[MAX_PATH
];
46 static inline SymWriter
*impl_from_ISymUnmanagedWriter5(ISymUnmanagedWriter5
*iface
)
48 return CONTAINING_RECORD(iface
, SymWriter
, iface
);
51 static inline SymWriter
*impl_from_IPdbWriter(IPdbWriter
*iface
)
53 return CONTAINING_RECORD(iface
, SymWriter
, IPdbWriter_iface
);
56 static HRESULT WINAPI
SymWriter_QueryInterface(ISymUnmanagedWriter5
*iface
, REFIID iid
,
59 SymWriter
*This
= impl_from_ISymUnmanagedWriter5(iface
);
61 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(iid
), ppv
);
63 if (IsEqualIID(&IID_IUnknown
, iid
) ||
64 IsEqualIID(&IID_ISymUnmanagedWriter
, iid
) ||
65 IsEqualIID(&IID_ISymUnmanagedWriter2
, iid
) ||
66 IsEqualIID(&IID_ISymUnmanagedWriter3
, iid
) ||
67 IsEqualIID(&IID_ISymUnmanagedWriter4
, iid
) ||
68 IsEqualIID(&IID_ISymUnmanagedWriter5
, iid
))
72 else if (IsEqualIID(&IID_IPdbWriter
, iid
))
74 *ppv
= &This
->IPdbWriter_iface
;
78 WARN("unknown interface %s\n", debugstr_guid(iid
));
83 IUnknown_AddRef((IUnknown
*)*ppv
);
87 static ULONG WINAPI
SymWriter_AddRef(ISymUnmanagedWriter5
*iface
)
89 SymWriter
*This
= impl_from_ISymUnmanagedWriter5(iface
);
90 ULONG ref
= InterlockedIncrement(&This
->ref
);
92 TRACE("(%p) refcount=%lu\n", iface
, ref
);
97 static ULONG WINAPI
SymWriter_Release(ISymUnmanagedWriter5
*iface
)
99 SymWriter
*This
= impl_from_ISymUnmanagedWriter5(iface
);
100 ULONG ref
= InterlockedDecrement(&This
->ref
);
102 TRACE("(%p) refcount=%lu\n", iface
, ref
);
106 This
->lock
.DebugInfo
->Spare
[0] = 0;
107 DeleteCriticalSection(&This
->lock
);
114 static HRESULT WINAPI
SymWriter_DefineDocument(ISymUnmanagedWriter5
*iface
, const WCHAR
*url
,
115 const GUID
*language
, const GUID
*languageVendor
, const GUID
*documentType
,
116 ISymUnmanagedDocumentWriter
** pRetVal
)
118 FIXME("(%p,%s,%s,%s,%s,%p)\n", iface
, debugstr_w(url
), debugstr_guid(language
),
119 debugstr_guid(languageVendor
), debugstr_guid(documentType
), pRetVal
);
123 static HRESULT WINAPI
SymWriter_SetUserEntryPoint(ISymUnmanagedWriter5
*iface
, mdMethodDef entryMethod
)
125 FIXME("(%p,0x%x)\n", iface
, entryMethod
);
129 static HRESULT WINAPI
SymWriter_OpenMethod(ISymUnmanagedWriter5
*iface
, mdMethodDef method
)
131 FIXME("(%p,0x%x)\n", iface
, method
);
135 static HRESULT WINAPI
SymWriter_CloseMethod(ISymUnmanagedWriter5
*iface
)
137 FIXME("(%p)\n", iface
);
141 static HRESULT WINAPI
SymWriter_OpenScope(ISymUnmanagedWriter5
*iface
, ULONG32 startOffset
,
144 FIXME("(%p,%u,%p)\n", iface
, startOffset
, pRetVal
);
148 static HRESULT WINAPI
SymWriter_CloseScope(ISymUnmanagedWriter5
*iface
, ULONG32 endOffset
)
150 FIXME("(%p,%u)\n", iface
, endOffset
);
154 static HRESULT WINAPI
SymWriter_SetScopeRange(ISymUnmanagedWriter5
*iface
, ULONG32 scopeID
, ULONG32 startOffset
,
157 FIXME("(%p,%u,%u,%u)\n", iface
, scopeID
, startOffset
, endOffset
);
161 static HRESULT WINAPI
SymWriter_DefineLocalVariable(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
,
162 ULONG32 attributes
, ULONG32 cSig
, unsigned char signature
[], ULONG32 addrKind
,
163 ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
, ULONG32 startOffset
, ULONG32 endOffset
)
165 FIXME("(%p,%s,0x%x,%u,%u)\n", iface
, debugstr_w(name
), attributes
, cSig
, addrKind
);
169 static HRESULT WINAPI
SymWriter_DefineParameter(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
,
170 ULONG32 attributes
, ULONG32 sequence
, ULONG32 addrKind
,
171 ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
)
173 FIXME("(%p,%s,0x%x,%u,%u)\n", iface
, debugstr_w(name
), attributes
, sequence
, addrKind
);
177 static HRESULT WINAPI
SymWriter_DefineField(ISymUnmanagedWriter5
*iface
, mdTypeDef parent
,
178 const WCHAR
*name
, ULONG32 attributes
, ULONG32 cSig
, unsigned char signature
[], ULONG32 addrKind
,
179 ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
)
181 FIXME("(%p,0x%x,%s,0x%x,%u,%u)\n", iface
, parent
, debugstr_w(name
), attributes
, cSig
, addrKind
);
185 static HRESULT WINAPI
SymWriter_DefineGlobalVariable(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
,
186 ULONG32 attributes
, ULONG32 cSig
, unsigned char signature
[], ULONG32 addrKind
,
187 ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
)
189 FIXME("(%p,%s,0x%x,%u,%u)\n", iface
, debugstr_w(name
), attributes
, cSig
, addrKind
);
193 static HRESULT WINAPI
SymWriter_Close(ISymUnmanagedWriter5
*iface
)
195 FIXME("(%p)\n", iface
);
199 static HRESULT WINAPI
SymWriter_SetSymAttributes(ISymUnmanagedWriter5
*iface
, mdToken parent
,
200 const WCHAR
*name
, ULONG32 cData
, unsigned char data
[])
202 FIXME("(%p,0x%x,%s,%u)\n", iface
, parent
, debugstr_w(name
), cData
);
206 static HRESULT WINAPI
SymWriter_OpenNamespace(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
)
208 FIXME("(%p,%s)\n", iface
, debugstr_w(name
));
212 static HRESULT WINAPI
SymWriter_CloseNamespace(ISymUnmanagedWriter5
*iface
)
214 FIXME("(%p)\n", iface
);
218 static HRESULT WINAPI
SymWriter_UsingNamespace(ISymUnmanagedWriter5
*iface
, const WCHAR
*fullName
)
220 FIXME("(%p,%s)\n", iface
, debugstr_w(fullName
));
224 static HRESULT WINAPI
SymWriter_SetMethodSourceRange(ISymUnmanagedWriter5
*iface
, ISymUnmanagedDocumentWriter
*startDoc
,
225 ULONG32 startLine
, ULONG32 startColumn
, ISymUnmanagedDocumentWriter
*endDoc
, ULONG32 endLine
, ULONG32 endColumn
)
227 FIXME("(%p,%p,%u,%u,%p,%u,%u)\n", iface
, startDoc
, startLine
, startColumn
, endDoc
, endLine
, endColumn
);
231 static HRESULT WINAPI
SymWriter_Initialize(ISymUnmanagedWriter5
*iface
, IUnknown
*emitter
, const WCHAR
*filename
,
232 IStream
*pIStream
, BOOL fFullBuild
)
234 SymWriter
*This
= impl_from_ISymUnmanagedWriter5(iface
);
236 FIXME("(%p,%p,%s,%p,%u)\n", iface
, emitter
, debugstr_w(filename
), pIStream
, fFullBuild
);
238 EnterCriticalSection(&This
->lock
);
241 wcsncpy_s(This
->pdb_filename
, MAX_PATH
, filename
, _TRUNCATE
);
243 LeaveCriticalSection(&This
->lock
);
248 static HRESULT WINAPI
SymWriter_GetDebugInfo(ISymUnmanagedWriter5
*iface
, IMAGE_DEBUG_DIRECTORY
*pIDD
, DWORD cData
,
249 DWORD
*pcData
, BYTE data
[])
251 SymWriter
*This
= impl_from_ISymUnmanagedWriter5(iface
);
252 DWORD name_length
, data_size
;
253 OMFSignatureRSDS
*rsds_data
= (OMFSignatureRSDS
*)data
;
255 TRACE("(%p,%p,%lu,%p,%p)\n", iface
, pIDD
, cData
, pcData
, data
);
257 EnterCriticalSection(&This
->lock
);
259 name_length
= WideCharToMultiByte(CP_UTF8
, 0, This
->pdb_filename
, -1, NULL
, 0, NULL
, NULL
);
260 data_size
= FIELD_OFFSET(OMFSignatureRSDS
, name
) + name_length
;
266 pIDD
->Characteristics
= 0;
267 pIDD
->MajorVersion
= 0;
268 pIDD
->MinorVersion
= 0;
269 pIDD
->Type
= IMAGE_DEBUG_TYPE_CODEVIEW
;
270 pIDD
->SizeOfData
= data_size
;
275 if (data_size
> cData
)
277 LeaveCriticalSection(&This
->lock
);
278 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER
);
281 memcpy(rsds_data
->Signature
, "RSDS", 4);
282 rsds_data
->guid
= This
->pdb_guid
;
283 rsds_data
->age
= This
->pdb_age
;
284 WideCharToMultiByte(CP_UTF8
, 0, This
->pdb_filename
, -1, rsds_data
->name
, name_length
, NULL
, NULL
);
287 LeaveCriticalSection(&This
->lock
);
292 static HRESULT WINAPI
SymWriter_DefineSequencePoints(ISymUnmanagedWriter5
*iface
, ISymUnmanagedDocumentWriter
*document
,
293 ULONG32 spCount
, ULONG32 offsets
[], ULONG32 lines
[], ULONG32 columns
[], ULONG32 endLines
[], ULONG32 endColumns
[])
295 FIXME("(%p,%p,%u)\n", iface
, document
, spCount
);
299 static HRESULT WINAPI
SymWriter_RemapToken(ISymUnmanagedWriter5
*iface
, mdToken oldToken
, mdToken newToken
)
301 FIXME("(%p,0x%x,0x%x)\n", iface
, oldToken
, newToken
);
305 static HRESULT WINAPI
SymWriter_Initialize2(ISymUnmanagedWriter5
*iface
, IUnknown
*emitter
, const WCHAR
*tempFilename
,
306 IStream
*pIStream
, BOOL fFullBuild
, const WCHAR
*finalFilename
)
308 FIXME("(%p,%p,%s,%p,%u,%s)\n", iface
, emitter
, debugstr_w(tempFilename
), pIStream
, fFullBuild
, debugstr_w(finalFilename
));
312 static HRESULT WINAPI
SymWriter_DefineConstant(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
, VARIANT value
, ULONG32 cSig
,
313 unsigned char signature
[])
315 FIXME("(%p,%s,%s,%u,%p)\n", iface
, debugstr_w(name
), debugstr_variant(&value
), cSig
, signature
);
319 static HRESULT WINAPI
SymWriter_Abort(ISymUnmanagedWriter5
*iface
)
321 FIXME("(%p)\n", iface
);
325 static HRESULT WINAPI
SymWriter_DefineLocalVariable2(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
, ULONG32 attributes
,
326 mdSignature sigToken
, ULONG32 addrKind
, ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
,
327 ULONG32 startOffset
, ULONG32 endOffset
)
329 FIXME("(%p,%s,0x%x,0x%x,%u)\n", iface
, debugstr_w(name
), attributes
, sigToken
, addrKind
);
333 static HRESULT WINAPI
SymWriter_DefineGlobalVariable2(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
, ULONG32 attributes
,
334 mdSignature sigToken
, ULONG32 addrKind
, ULONG32 addr1
, ULONG32 addr2
, ULONG32 addr3
)
336 FIXME("(%p,%s,0x%x,0x%x,%u)\n", iface
, debugstr_w(name
), attributes
, sigToken
, addrKind
);
340 static HRESULT WINAPI
SymWriter_DefineConstant2(ISymUnmanagedWriter5
*iface
, const WCHAR
*name
, VARIANT value
, mdSignature sigToken
)
342 FIXME("(%p,%s,%s,0x%x)\n", iface
, debugstr_w(name
), debugstr_variant(&value
), sigToken
);
346 static HRESULT WINAPI
SymWriter_OpenMethod2(ISymUnmanagedWriter5
*iface
, mdMethodDef method
, ULONG32 isect
, ULONG32 offset
)
348 FIXME("(%p,0x%x,%u,%u)\n", iface
, method
, isect
, offset
);
352 static HRESULT WINAPI
SymWriter_Commit(ISymUnmanagedWriter5
*iface
)
354 FIXME("(%p)\n", iface
);
358 static HRESULT WINAPI
SymWriter_GetDebugInfoWithPadding(ISymUnmanagedWriter5
*iface
, IMAGE_DEBUG_DIRECTORY
*pIDD
, DWORD cbData
,
359 DWORD
* pcData
, BYTE data
[])
361 FIXME("(%p,%p,%lu,%p,%p)\n", iface
, pIDD
, cbData
, pcData
, data
);
365 static HRESULT WINAPI
SymWriter_OpenMapTokensToSourceSpans(ISymUnmanagedWriter5
*iface
)
367 FIXME("(%p)\n", iface
);
371 static HRESULT WINAPI
SymWriter_CloseMapTokensToSourceSpans(ISymUnmanagedWriter5
*iface
)
373 FIXME("(%p)\n", iface
);
377 static HRESULT WINAPI
SymWriter_MapTokenToSourceSpan(ISymUnmanagedWriter5
*iface
, mdToken token
, ISymUnmanagedDocumentWriter
* document
,
378 ULONG32 line
, ULONG32 column
, ULONG32 endLine
, ULONG32 endColumn
)
380 FIXME("(%p,%x,%p,%u,%u,%u,%u)\n", iface
, token
, document
, line
, column
, endLine
, endColumn
);
385 static const ISymUnmanagedWriter5Vtbl SymWriter_Vtbl
= {
386 SymWriter_QueryInterface
,
389 SymWriter_DefineDocument
,
390 SymWriter_SetUserEntryPoint
,
391 SymWriter_OpenMethod
,
392 SymWriter_CloseMethod
,
394 SymWriter_CloseScope
,
395 SymWriter_SetScopeRange
,
396 SymWriter_DefineLocalVariable
,
397 SymWriter_DefineParameter
,
398 SymWriter_DefineField
,
399 SymWriter_DefineGlobalVariable
,
401 SymWriter_SetSymAttributes
,
402 SymWriter_OpenNamespace
,
403 SymWriter_CloseNamespace
,
404 SymWriter_UsingNamespace
,
405 SymWriter_SetMethodSourceRange
,
406 SymWriter_Initialize
,
407 SymWriter_GetDebugInfo
,
408 SymWriter_DefineSequencePoints
,
409 SymWriter_RemapToken
,
410 SymWriter_Initialize2
,
411 SymWriter_DefineConstant
,
413 SymWriter_DefineLocalVariable2
,
414 SymWriter_DefineGlobalVariable2
,
415 SymWriter_DefineConstant2
,
416 SymWriter_OpenMethod2
,
418 SymWriter_GetDebugInfoWithPadding
,
419 SymWriter_OpenMapTokensToSourceSpans
,
420 SymWriter_CloseMapTokensToSourceSpans
,
421 SymWriter_MapTokenToSourceSpan
424 static HRESULT WINAPI
SymWriter_PdbWriter_QueryInterface(IPdbWriter
*iface
, REFIID iid
, void **ppv
)
426 SymWriter
*This
= impl_from_IPdbWriter(iface
);
427 return ISymUnmanagedWriter5_QueryInterface(&This
->iface
, iid
, ppv
);
430 static ULONG WINAPI
SymWriter_PdbWriter_AddRef(IPdbWriter
*iface
)
432 SymWriter
*This
= impl_from_IPdbWriter(iface
);
433 return ISymUnmanagedWriter5_AddRef(&This
->iface
);
436 static ULONG WINAPI
SymWriter_PdbWriter_Release(IPdbWriter
*iface
)
438 SymWriter
*This
= impl_from_IPdbWriter(iface
);
439 return ISymUnmanagedWriter5_Release(&This
->iface
);
442 static HRESULT WINAPI
SymWriter_SetPath(IPdbWriter
*iface
, const WCHAR
*fullpath
, IStream
*stream
, BOOL fullbuild
)
444 FIXME("(%p,%s,%p,%u)\n", iface
, debugstr_w(fullpath
), stream
, fullbuild
);
448 static HRESULT WINAPI
SymWriter_OpenMod(IPdbWriter
*iface
, const WCHAR
*modulename
, const WCHAR
*fullpath
)
450 FIXME("(%p,%s,%s)\n", iface
, debugstr_w(modulename
), debugstr_w(fullpath
));
454 static HRESULT WINAPI
SymWriter_CloseMod(IPdbWriter
*iface
)
456 FIXME("(%p)\n", iface
);
460 static HRESULT WINAPI
SymWriter_GetPath(IPdbWriter
*iface
, DWORD ccData
, DWORD
*pccData
, WCHAR
*path
)
462 FIXME("(%p,%lu,%p,%p)\n", iface
, ccData
, pccData
, path
);
466 static HRESULT WINAPI
SymWriter_GetSignatureAge(IPdbWriter
*iface
, DWORD
*timestamp
, DWORD
*age
)
468 FIXME("(%p,%p,%p)\n", iface
, timestamp
, age
);
472 static const IPdbWriterVtbl SymWriter_PdbWriter_Vtbl
= {
473 SymWriter_PdbWriter_QueryInterface
,
474 SymWriter_PdbWriter_AddRef
,
475 SymWriter_PdbWriter_Release
,
480 SymWriter_GetSignatureAge
483 HRESULT
SymWriter_CreateInstance(REFIID iid
, void **ppv
)
488 This
= heap_alloc(sizeof(*This
));
490 return E_OUTOFMEMORY
;
492 This
->iface
.lpVtbl
= &SymWriter_Vtbl
;
493 This
->IPdbWriter_iface
.lpVtbl
= &SymWriter_PdbWriter_Vtbl
;
495 InitializeCriticalSection(&This
->lock
);
496 This
->lock
.DebugInfo
->Spare
[0] = (DWORD_PTR
)(__FILE__
": SymWriter.lock");
497 UuidCreate(&This
->pdb_guid
);
499 This
->pdb_filename
[0] = 0;
501 hr
= IUnknown_QueryInterface(&This
->iface
, iid
, ppv
);
503 ISymUnmanagedWriter5_Release(&This
->iface
);