Commit 1bd693b1 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

winedbg: Enhance algorithm to look up for memory data inside a minidump.

parent a672a51c
...@@ -103,22 +103,43 @@ static BOOL tgt_process_minidump_read(HANDLE hProcess, const void* addr, ...@@ -103,22 +103,43 @@ static BOOL tgt_process_minidump_read(HANDLE hProcess, const void* addr,
{ {
MINIDUMP_MEMORY_LIST* mml = stream; MINIDUMP_MEMORY_LIST* mml = stream;
MINIDUMP_MEMORY_DESCRIPTOR* mmd = &mml->MemoryRanges[0]; MINIDUMP_MEMORY_DESCRIPTOR* mmd = &mml->MemoryRanges[0];
int i; int i, found = -1;
SIZE_T ilen, prev_len = 0;
/* There's no reason that memory ranges inside a minidump do not overlap.
* So be smart when looking for a given memory range (either grab a
* range that covers the whole requested area, or if none, the range that
* has the largest overlap with requested area)
*/
for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++) for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++)
{ {
if (get_addr64(mmd->StartOfMemoryRange) <= (DWORD_PTR)addr && if (get_addr64(mmd->StartOfMemoryRange) <= (DWORD_PTR)addr &&
(DWORD_PTR)addr < get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize) (DWORD_PTR)addr < get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize)
{ {
len = min(len, ilen = min(len,
get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr); get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr);
memcpy(buffer, if (ilen == len) /* whole range is matched */
(char*)private_data(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange), {
len); found = i;
if (rlen) *rlen = len; prev_len = ilen;
return TRUE; break;
}
if (found == -1 || ilen > prev_len) /* partial match, keep largest one */
{
found = i;
prev_len = ilen;
}
} }
} }
if (found != -1)
{
mmd = &mml->MemoryRanges[found];
memcpy(buffer,
(char*)private_data(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange),
prev_len);
if (rlen) *rlen = prev_len;
return TRUE;
}
} }
/* FIXME: this is a dirty hack to let the last frame in a bt to work /* FIXME: this is a dirty hack to let the last frame in a bt to work
* However, we need to check who's to blame, this code or the current * However, we need to check who's to blame, this code or the current
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment