DBGHELP: Implement SymGetSymFromAddr64

Eric Pouech eric.pouech at wanadoo.fr
Fri May 26 14:17:42 CDT 2006


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)
> {
>  
>
>------------------------------------------------------------------------
>
>
>  
>




More information about the wine-devel mailing list