From 1bd693b139e539a2c606d5eca914379dfc2f1cd8 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 23 Jan 2012 21:37:22 +0100 Subject: [PATCH] winedbg: Enhance algorithm to look up for memory data inside a minidump. --- programs/winedbg/tgt_minidump.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c index afa41d85439..c346070e949 100644 --- a/programs/winedbg/tgt_minidump.c +++ b/programs/winedbg/tgt_minidump.c @@ -103,22 +103,43 @@ static BOOL tgt_process_minidump_read(HANDLE hProcess, const void* addr, { MINIDUMP_MEMORY_LIST* mml = stream; 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++) { if (get_addr64(mmd->StartOfMemoryRange) <= (DWORD_PTR)addr && (DWORD_PTR)addr < get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize) { - len = min(len, - get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr); - memcpy(buffer, - (char*)private_data(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange), - len); - if (rlen) *rlen = len; - return TRUE; + ilen = min(len, + get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr); + if (ilen == len) /* whole range is matched */ + { + found = i; + prev_len = ilen; + 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 * However, we need to check who's to blame, this code or the current -- 2.11.4.GIT