Module: wine
Branch: master
Commit: 1bd693b139e539a2c606d5eca914379dfc2f1cd8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1bd693b139e539a2c606d5eca…
Author: Eric Pouech <eric.pouech(a)orange.fr>
Date: Mon Jan 23 21:37:22 2012 +0100
winedbg: Enhance algorithm to look up for memory data inside a minidump.
---
programs/winedbg/tgt_minidump.c | 39 ++++++++++++++++++++++++++++++---------
1 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c
index afa41d8..c346070 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