Thomas Weidenmueller wrote:

The attached patch implements SymGetSymFromAddr64, called by steam.
a couple of coments:

@@ -996,7 +996,8 @@
    sym = pair.effective->addr_sorttab[idx];

    symt_fill_sym_info(&pair, &sym->symt, Symbol);
-    *Displacement = Address - Symbol->Address;
+    if (Displacement)
+        *Displacement = Address - Symbol->Address;
    return TRUE;
}

why do you need this ?

@@ -1053,6 +1054,31 @@
    return TRUE;
}

+/******************************************************************
+ *             SymGetSymFromAddr (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymGetSymFromAddr64(HANDLE hProcess, DWORD64 Address,
+                                PDWORD64 Displacement, PIMAGEHLP_SYMBOL64 
Symbol)
+{
+    char        buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
+    SYMBOL_INFO*si = (SYMBOL_INFO*)buffer;
+    size_t      len;
+
+    if (Symbol->SizeOfStruct < sizeof(*Symbol)) return FALSE;
+    si->SizeOfStruct = sizeof(*si);
+    si->MaxNameLen = MAX_SYM_NAME;
+    if (!SymFromAddr(hProcess, Address, &Displacement, si))
- you should test that Address can be casted down to a 32 bit entity (see other functions for how to do it) - &Displacement looks pretty wrong: you need a local 32 bit dword, pass its address, and then convert the local 32 bit value into the 64 bit pointer (Displacement)

+        return FALSE;
+
+    Symbol->Address = si->Address;
+    Symbol->Size    = si->Size;
+    Symbol->Flags   = si->Flags;
+    len = min(Symbol->MaxNameLength, si->MaxNameLen);
+    lstrcpynA(Symbol->Name, si->Name, len);
+    return TRUE;
+}
+
static BOOL find_name(struct process* pcs, struct module* module, const char* 
name,
                      SYMBOL_INFO* symbol)
{
------------------------------------------------------------------------





Reply via email to