[PATCH 4/4] [WineDbg]: added support for variables with thread storage

Eric Pouech eric.pouech at orange.fr
Sat Jan 29 13:38:21 CST 2011




A+
---

 programs/winedbg/symbol.c |   49 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 47 insertions(+), 2 deletions(-)


diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 60e1c55..6b689c2 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -130,6 +130,50 @@ static BOOL fill_sym_lvalue(const SYMBOL_INFO* sym, ULONG_PTR base,
         lvalue->cookie = DLV_TARGET;
         lvalue->addr.Offset = base + sym->Address;
     }
+    else if (sym->Flags & SYMFLAG_TLSREL)
+    {
+        PROCESS_BASIC_INFORMATION pbi;
+        THREAD_BASIC_INFORMATION  tbi;
+        DWORD_PTR                 addr;
+        PEB                       peb;
+        PEB_LDR_DATA              ldr_data;
+        PLIST_ENTRY               head, current;
+        LDR_MODULE                ldr_module;
+        unsigned                  tlsindex = -1;
+
+        if (NtQueryInformationProcess(dbg_curr_process->handle, ProcessBasicInformation,
+                                      &pbi, sizeof(pbi), NULL) ||
+            NtQueryInformationThread(dbg_curr_thread->handle, ThreadBasicInformation,
+                                     &tbi, sizeof(tbi), NULL))
+        {
+        tls_error:
+            if (buffer) snprintf(buffer, sz, "Cannot read TLS address\n");
+            return FALSE;
+        }
+        addr = (DWORD_PTR)&(((TEB*)tbi.TebBaseAddress)->ThreadLocalStoragePointer);
+        if (!dbg_read_memory((void*)addr, &addr, sizeof(addr)) ||
+            !dbg_read_memory(pbi.PebBaseAddress, &peb, sizeof(peb)) ||
+            !dbg_read_memory(peb.LdrData, &ldr_data, sizeof(ldr_data)))
+            goto tls_error;
+        current = ldr_data.InLoadOrderModuleList.Flink;
+        head = &((PEB_LDR_DATA*)peb.LdrData)->InLoadOrderModuleList;
+        do
+        {
+            if (!dbg_read_memory(CONTAINING_RECORD(current, LDR_MODULE, InLoadOrderModuleList),
+                                 &ldr_module, sizeof(ldr_module))) goto tls_error;
+            if ((DWORD_PTR)ldr_module.BaseAddress == sym->ModBase)
+            {
+                tlsindex = ldr_module.TlsIndex;
+                break;
+            }
+            current = ldr_module.InLoadOrderModuleList.Flink;
+        } while (current != head);
+
+        addr += tlsindex * sizeof(DWORD_PTR);
+        if (!dbg_read_memory((void*)addr, &addr, sizeof(addr))) goto tls_error;
+        lvalue->cookie = DLV_TARGET;
+        lvalue->addr.Offset = addr + sym->Address;
+    }
     else
     {
         lvalue->cookie = DLV_TARGET;
@@ -177,10 +221,11 @@ static BOOL CALLBACK sgv_cb(PSYMBOL_INFO sym, ULONG size, PVOID ctx)
                    sgv->name, NUMDBGV);
         return FALSE;
     }
-    WINE_TRACE("==> %s %s%s%s%s%s%s%s\n", 
-               sym->Name, 
+    WINE_TRACE("==> %s %s%s%s%s%s%s%s%s\n",
+               sym->Name,
                (sym->Flags & SYMFLAG_FUNCTION) ? "func " : "",
                (sym->Flags & SYMFLAG_FRAMEREL) ? "framerel " : "",
+               (sym->Flags & SYMFLAG_TLSREL) ? "tlsrel " : "",
                (sym->Flags & SYMFLAG_REGISTER) ? "register " : "",
                (sym->Flags & SYMFLAG_REGREL) ? "regrel " : "",
                (sym->Flags & SYMFLAG_PARAMETER) ? "param " : "",




More information about the wine-patches mailing list