dbghelp: Live targets.
In SymInitialize, now trying to check if the hProcess is a real live target or not. If we think it is, try to grasp ELF information from it.
This commit is contained in:
parent
418591c8ea
commit
eca3715f88
|
@ -163,6 +163,17 @@ static BOOL WINAPI process_invade_cb(char* name, DWORD base, DWORD size, void* u
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* check_live_target
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static BOOL check_live_target(struct process* pcs)
|
||||||
|
{
|
||||||
|
if (!GetProcessId(pcs->handle)) return FALSE;
|
||||||
|
if (!elf_read_wine_loader_dbg_info(pcs)) return FALSE;
|
||||||
|
return getenv("DBGHELP_NOLIVE") == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* SymInitialize (DBGHELP.@)
|
* SymInitialize (DBGHELP.@)
|
||||||
*
|
*
|
||||||
|
@ -178,11 +189,14 @@ static BOOL WINAPI process_invade_cb(char* name, DWORD base, DWORD size, void* u
|
||||||
* our internal ELF modules representation (loading / unloading). This way,
|
* our internal ELF modules representation (loading / unloading). This way,
|
||||||
* we'll pair every loaded builtin PE module with its ELF counterpart (and
|
* we'll pair every loaded builtin PE module with its ELF counterpart (and
|
||||||
* access its debug information).
|
* access its debug information).
|
||||||
* - if fInvadeProcess (in SymInitialize) is FALSE, we won't be able to
|
* - if fInvadeProcess (in SymInitialize) is FALSE, we check anyway if the
|
||||||
* make the peering between a builtin PE module and its ELF counterpart, hence
|
* hProcess refers to a running process. We use some heuristics here, so YMMV.
|
||||||
* we won't be able to provide the requested debug information. We'll
|
* If we detect a live target, then we get the same handling as if
|
||||||
* however be able to load native PE modules (and their debug information)
|
* fInvadeProcess is TRUE (except that the modules are not loaded). Otherwise,
|
||||||
* without any trouble.
|
* we won't be able to make the peering between a builtin PE module and its ELF
|
||||||
|
* counterpart. Hence we won't be able to provide the requested debug
|
||||||
|
* information. We'll however be able to load native PE modules (and their
|
||||||
|
* debug information) without any trouble.
|
||||||
* Note also that this scheme can be intertwined with the deferred loading
|
* Note also that this scheme can be intertwined with the deferred loading
|
||||||
* mechanism (ie only load the debug information when we actually need it).
|
* mechanism (ie only load the debug information when we actually need it).
|
||||||
*/
|
*/
|
||||||
|
@ -237,17 +251,19 @@ BOOL WINAPI SymInitialize(HANDLE hProcess, PSTR UserSearchPath, BOOL fInvadeProc
|
||||||
pcs->dbg_hdr_addr = 0;
|
pcs->dbg_hdr_addr = 0;
|
||||||
pcs->next = process_first;
|
pcs->next = process_first;
|
||||||
process_first = pcs;
|
process_first = pcs;
|
||||||
|
|
||||||
if (fInvadeProcess)
|
if (check_live_target(pcs))
|
||||||
{
|
{
|
||||||
if (!elf_read_wine_loader_dbg_info(pcs))
|
if (fInvadeProcess)
|
||||||
{
|
EnumerateLoadedModules(hProcess, process_invade_cb, (void*)hProcess);
|
||||||
SymCleanup(hProcess);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
EnumerateLoadedModules(hProcess, process_invade_cb, (void*)hProcess);
|
|
||||||
elf_synchronize_module_list(pcs);
|
elf_synchronize_module_list(pcs);
|
||||||
}
|
}
|
||||||
|
else if (fInvadeProcess)
|
||||||
|
{
|
||||||
|
SymCleanup(hProcess);
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue