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:
Eric Pouech 2006-01-23 16:30:03 +01:00 committed by Alexandre Julliard
parent 418591c8ea
commit eca3715f88
1 changed files with 29 additions and 13 deletions

View File

@ -163,6 +163,17 @@ static BOOL WINAPI process_invade_cb(char* name, DWORD base, DWORD size, void* u
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.@)
*
@ -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,
* we'll pair every loaded builtin PE module with its ELF counterpart (and
* access its debug information).
* - if fInvadeProcess (in SymInitialize) is FALSE, 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.
* - if fInvadeProcess (in SymInitialize) is FALSE, we check anyway if the
* hProcess refers to a running process. We use some heuristics here, so YMMV.
* If we detect a live target, then we get the same handling as if
* fInvadeProcess is TRUE (except that the modules are not loaded). Otherwise,
* 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
* 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->next = process_first;
process_first = pcs;
if (fInvadeProcess)
if (check_live_target(pcs))
{
if (!elf_read_wine_loader_dbg_info(pcs))
{
SymCleanup(hProcess);
return FALSE;
}
EnumerateLoadedModules(hProcess, process_invade_cb, (void*)hProcess);
if (fInvadeProcess)
EnumerateLoadedModules(hProcess, process_invade_cb, (void*)hProcess);
elf_synchronize_module_list(pcs);
}
else if (fInvadeProcess)
{
SymCleanup(hProcess);
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
return TRUE;
}