*/
BOOL validate_addr64(DWORD64 addr)
{
- if (addr >> 32)
+ if (sizeof(void*) == sizeof(int) && (addr >> 32))
{
FIXME("Unsupported address %s\n", wine_dbgstr_longlong(addr));
SetLastError(ERROR_INVALID_PARAMETER);
return pcs->buffer;
}
+const char* wine_dbgstr_addr(const ADDRESS64* addr)
+{
+ if (!addr) return "(null)";
+ switch (addr->Mode)
+ {
+ case AddrModeFlat:
+ return wine_dbg_sprintf("flat<%s>", wine_dbgstr_longlong(addr->Offset));
+ case AddrMode1616:
+ return wine_dbg_sprintf("1616<%04x:%04x>", addr->Segment, (DWORD)addr->Offset);
+ case AddrMode1632:
+ return wine_dbg_sprintf("1632<%04x:%08x>", addr->Segment, (DWORD)addr->Offset);
+ case AddrModeReal:
+ return wine_dbg_sprintf("real<%04x:%04x>", addr->Segment, (DWORD)addr->Offset);
+ default:
+ return "unknown";
+ }
+}
+
+extern struct cpu cpu_i386, cpu_x86_64;
+
+static struct cpu* dbghelp_cpus[] = {&cpu_i386, &cpu_x86_64, NULL};
+struct cpu* dbghelp_current_cpu =
+#if defined(__i386__)
+ &cpu_i386
+#elif defined(__x86_64__)
+ &cpu_x86_64
+#else
+#error define support for your CPU
+#endif
+ ;
+
+struct cpu* cpu_find(DWORD machine)
+{
+ struct cpu** cpu;
+
+ for (cpu = dbghelp_cpus ; *cpu; cpu++)
+ {
+ if (cpu[0]->machine == machine) return cpu[0];
+ }
+ return NULL;
+}
+
/******************************************************************
* SymSetSearchPathW (DBGHELP.@)
*
* SymInitialize helper: loads in dbghelp all known (and loaded modules)
* this assumes that hProcess is a handle on a valid process
*/
-static BOOL WINAPI process_invade_cb(PCSTR name, ULONG base, ULONG size, PVOID user)
+static BOOL WINAPI process_invade_cb(PCWSTR name, ULONG64 base, ULONG size, PVOID user)
{
- char tmp[MAX_PATH];
+ WCHAR tmp[MAX_PATH];
HANDLE hProcess = user;
- if (!GetModuleFileNameExA(hProcess, (HMODULE)base,
- tmp, sizeof(tmp)))
- lstrcpynA(tmp, name, sizeof(tmp));
+ if (!GetModuleFileNameExW(hProcess, (HMODULE)(DWORD_PTR)base,
+ tmp, sizeof(tmp) / sizeof(WCHAR)))
+ lstrcpynW(tmp, name, sizeof(tmp) / sizeof(WCHAR));
- SymLoadModule(hProcess, 0, tmp, name, base, size);
+ SymLoadModuleExW(hProcess, 0, tmp, name, base, size, NULL, 0);
return TRUE;
}
{
if (!GetProcessId(pcs->handle)) return FALSE;
if (GetEnvironmentVariableA("DBGHELP_NOLIVE", NULL, 0)) return FALSE;
- elf_read_wine_loader_dbg_info(pcs);
+ if (!elf_read_wine_loader_dbg_info(pcs))
+ macho_read_wine_loader_dbg_info(pcs);
return TRUE;
}
if (check_live_target(pcs))
{
if (fInvadeProcess)
- EnumerateLoadedModules(hProcess, process_invade_cb, hProcess);
+ EnumerateLoadedModulesW64(hProcess, process_invade_cb, hProcess);
elf_synchronize_module_list(pcs);
+ macho_synchronize_module_list(pcs);
}
else if (fInvadeProcess)
{
*/
static BOOL CALLBACK reg_cb64to32(HANDLE hProcess, ULONG action, ULONG64 data, ULONG64 user)
{
- PSYMBOL_REGISTERED_CALLBACK cb32 = (PSYMBOL_REGISTERED_CALLBACK)(DWORD)(user >> 32);
- DWORD user32 = (DWORD)user;
+ struct process* pcs = process_find_by_handle(hProcess);
void* data32;
IMAGEHLP_DEFERRED_SYMBOL_LOAD64* idsl64;
IMAGEHLP_DEFERRED_SYMBOL_LOAD idsl;
+ if (!pcs) return FALSE;
switch (action)
{
case CBA_DEBUG_INFO:
case CBA_DEFERRED_SYMBOL_LOAD_CANCEL:
case CBA_SET_OPTIONS:
case CBA_SYMBOLS_UNLOADED:
- data32 = (void*)(DWORD)data;
+ data32 = (void*)(DWORD_PTR)data;
break;
case CBA_DEFERRED_SYMBOL_LOAD_COMPLETE:
case CBA_DEFERRED_SYMBOL_LOAD_FAILURE:
case CBA_DEFERRED_SYMBOL_LOAD_PARTIAL:
case CBA_DEFERRED_SYMBOL_LOAD_START:
- idsl64 = (IMAGEHLP_DEFERRED_SYMBOL_LOAD64*)(DWORD)data;
+ idsl64 = (IMAGEHLP_DEFERRED_SYMBOL_LOAD64*)(DWORD_PTR)data;
if (!validate_addr64(idsl64->BaseOfImage))
return FALSE;
idsl.SizeOfStruct = sizeof(idsl);
FIXME("No mapping for action %u\n", action);
return FALSE;
}
- return cb32(hProcess, action, data32, (PVOID)user32);
+ return pcs->reg_cb32(hProcess, action, data32, (PVOID)(DWORD_PTR)user);
}
/******************************************************************
case CBA_DEFERRED_SYMBOL_LOAD_FAILURE:
case CBA_DEFERRED_SYMBOL_LOAD_PARTIAL:
case CBA_DEFERRED_SYMBOL_LOAD_START:
- idslW = (IMAGEHLP_DEFERRED_SYMBOL_LOADW64*)(DWORD)data;
+ idslW = data;
idsl.SizeOfStruct = sizeof(idsl);
idsl.BaseOfImage = idslW->BaseOfImage;
idsl.CheckSum = idslW->CheckSum;
*
* Helper for registering a callback.
*/
-static BOOL sym_register_cb(HANDLE hProcess,
+static BOOL sym_register_cb(HANDLE hProcess,
PSYMBOL_REGISTERED_CALLBACK64 cb,
+ PSYMBOL_REGISTERED_CALLBACK cb32,
DWORD64 user, BOOL unicode)
{
struct process* pcs = process_find_by_handle(hProcess);
if (!pcs) return FALSE;
pcs->reg_cb = cb;
+ pcs->reg_cb32 = cb32;
pcs->reg_is_unicode = unicode;
pcs->reg_user = user;
PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
PVOID UserContext)
{
- DWORD64 tmp = ((ULONGLONG)(DWORD)CallbackFunction << 32) | (DWORD)UserContext;
TRACE("(%p, %p, %p)\n",
hProcess, CallbackFunction, UserContext);
- return sym_register_cb(hProcess, reg_cb64to32, tmp, FALSE);
+ return sym_register_cb(hProcess, reg_cb64to32, CallbackFunction, (DWORD_PTR)UserContext, FALSE);
}
/***********************************************************************
{
TRACE("(%p, %p, %s)\n",
hProcess, CallbackFunction, wine_dbgstr_longlong(UserContext));
- return sym_register_cb(hProcess, CallbackFunction, UserContext, FALSE);
+ return sym_register_cb(hProcess, CallbackFunction, NULL, UserContext, FALSE);
}
/***********************************************************************
{
TRACE("(%p, %p, %s)\n",
hProcess, CallbackFunction, wine_dbgstr_longlong(UserContext));
- return sym_register_cb(hProcess, CallbackFunction, UserContext, TRUE);
+ return sym_register_cb(hProcess, CallbackFunction, NULL, UserContext, TRUE);
}
/* This is imagehlp version not dbghelp !! */