Eric Pouech : dbghelp: Implement SymGetLineFromInlineContext*() when context isn't in inline mode.

Alexandre Julliard julliard at winehq.org
Wed Oct 27 16:26:04 CDT 2021


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

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Tue Oct 26 11:45:26 2021 +0200

dbghelp: Implement SymGetLineFromInlineContext*() when context isn't in inline mode.

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/symbol.c | 39 +++++++++++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 6 deletions(-)

diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 21616627af9..82c69b2e848 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -2537,16 +2537,37 @@ BOOL WINAPI SymFromInlineContextW(HANDLE hProcess, DWORD64 addr, ULONG inline_ct
     return ret;
 }
 
+static BOOL get_line_from_inline_context(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, DWORD64 mod_addr, PDWORD disp,
+                                         struct internal_line_t* intl)
+{
+    switch (IFC_MODE(inline_ctx))
+    {
+    case IFC_MODE_INLINE:
+    case IFC_MODE_IGNORE:
+    case IFC_MODE_REGULAR:
+        return get_line_from_addr(hProcess, addr, disp, intl);
+    default:
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+}
+
 /******************************************************************
  *		SymGetLineFromInlineContext (DBGHELP.@)
  *
  */
 BOOL WINAPI SymGetLineFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, DWORD64 mod_addr, PDWORD disp, PIMAGEHLP_LINE64 line)
 {
-    FIXME("(%p, %#I64x, 0x%x, %#I64x, %p, %p): stub!\n",
+    struct internal_line_t intl;
+
+    TRACE("(%p, %#I64x, 0x%x, %#I64x, %p, %p)\n",
           hProcess, addr, inline_ctx, mod_addr, disp, line);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+
+    if (line->SizeOfStruct < sizeof(*line)) return FALSE;
+    init_internal_line(&intl, FALSE);
+
+    if (!get_line_from_inline_context(hProcess, addr, inline_ctx, mod_addr, disp, &intl)) return FALSE;
+    return internal_line_copy_toA64(&intl, line);
 }
 
 /******************************************************************
@@ -2555,8 +2576,14 @@ BOOL WINAPI SymGetLineFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inl
  */
 BOOL WINAPI SymGetLineFromInlineContextW(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, DWORD64 mod_addr, PDWORD disp, PIMAGEHLP_LINEW64 line)
 {
-    FIXME("(%p, %#I64x, 0x%x, %#I64x, %p, %p): stub!\n",
+    struct internal_line_t intl;
+
+    TRACE("(%p, %#I64x, 0x%x, %#I64x, %p, %p)\n",
           hProcess, addr, inline_ctx, mod_addr, disp, line);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+
+    if (line->SizeOfStruct < sizeof(*line)) return FALSE;
+    init_internal_line(&intl, TRUE);
+
+    if (!get_line_from_inline_context(hProcess, addr, inline_ctx, mod_addr, disp, &intl)) return FALSE;
+    return internal_line_copy_toW64(&intl, line);
 }




More information about the wine-cvs mailing list