Eric Pouech : winedbg: Workaround broken minidumps with invalid 32-> 64 address conversion.
Alexandre Julliard
julliard at winehq.org
Mon Jan 14 09:33:15 CST 2008
Module: wine
Branch: master
Commit: bd007a157638bd8fba93aafbfe420f1728af61e8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bd007a157638bd8fba93aafbfe420f1728af61e8
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Sun Jan 13 17:02:49 2008 +0100
winedbg: Workaround broken minidumps with invalid 32->64 address conversion.
---
programs/winedbg/tgt_minidump.c | 46 ++++++++++++++++++++++-----------------
1 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c
index c0042fd..26da1e7 100644
--- a/programs/winedbg/tgt_minidump.c
+++ b/programs/winedbg/tgt_minidump.c
@@ -39,6 +39,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
static struct be_process_io be_process_minidump_io;
+static DWORD64 get_addr64(DWORD64 addr)
+{
+ return addr & 0xFFFFFFFF;
+}
+
void minidump_write(const char* file, const EXCEPTION_RECORD* rec)
{
HANDLE hFile;
@@ -95,12 +100,13 @@ static BOOL WINAPI tgt_process_minidump_read(HANDLE hProcess, const void* addr,
for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++)
{
- if (mmd->StartOfMemoryRange <= (DWORD_PTR)addr &&
- (DWORD_PTR)addr < mmd->StartOfMemoryRange + mmd->Memory.DataSize)
+ if (get_addr64(mmd->StartOfMemoryRange) <= (DWORD_PTR)addr &&
+ (DWORD_PTR)addr < get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize)
{
- len = min(len, mmd->StartOfMemoryRange + mmd->Memory.DataSize - (DWORD_PTR)addr);
- memcpy(buffer,
- (char*)PRIVATE(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - mmd->StartOfMemoryRange,
+ len = min(len,
+ get_addr64(mmd->StartOfMemoryRange) + mmd->Memory.DataSize - (DWORD_PTR)addr);
+ memcpy(buffer,
+ (char*)PRIVATE(dbg_curr_process)->mapping + mmd->Memory.Rva + (DWORD_PTR)addr - get_addr64(mmd->StartOfMemoryRange),
len);
if (rlen) *rlen = len;
return TRUE;
@@ -146,8 +152,8 @@ static BOOL is_pe_module_embedded(struct tgt_process_minidump_data* data,
for (i = 0, mm = &mml->Modules[0]; i < mml->NumberOfModules; i++, mm++)
{
- if (mm->BaseOfImage <= pe_mm->BaseOfImage &&
- mm->BaseOfImage + mm->SizeOfImage >= pe_mm->BaseOfImage + pe_mm->SizeOfImage)
+ if (get_addr64(mm->BaseOfImage) <= get_addr64(pe_mm->BaseOfImage) &&
+ get_addr64(mm->BaseOfImage) + mm->SizeOfImage >= get_addr64(pe_mm->BaseOfImage) + pe_mm->SizeOfImage)
return TRUE;
}
}
@@ -307,7 +313,7 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
for (i = 0; i < mtl->NumberOfThreads; i++)
{
dbg_add_thread(dbg_curr_process, mtl->Threads[i].ThreadId, NULL,
- (void*)(DWORD_PTR)mtl->Threads[i].Teb);
+ (void*)(DWORD_PTR)get_addr64(mtl->Threads[i].Teb));
}
}
/* first load ELF modules, then do the PE ones */
@@ -324,11 +330,11 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
nameW[mds->Length / sizeof(WCHAR)] = 0;
if (SymFindFileInPathW(hProc, NULL, nameW, (void*)(DWORD_PTR)mm->CheckSum,
0, 0, SSRVOPT_DWORD, buffer, validate_file, NULL))
- SymLoadModuleExW(hProc, NULL, buffer, NULL, mm->BaseOfImage, mm->SizeOfImage,
- NULL, 0);
+ SymLoadModuleExW(hProc, NULL, buffer, NULL, get_addr64(mm->BaseOfImage),
+ mm->SizeOfImage, NULL, 0);
else
- SymLoadModuleExW(hProc, NULL, nameW, NULL, mm->BaseOfImage, mm->SizeOfImage,
- NULL, SLMFLAG_VIRTUAL);
+ SymLoadModuleExW(hProc, NULL, nameW, NULL, get_addr64(mm->BaseOfImage),
+ mm->SizeOfImage, NULL, SLMFLAG_VIRTUAL);
}
}
if (MiniDumpReadDumpStream(data->mapping, ModuleListStream, &dir, &stream, &size))
@@ -343,14 +349,14 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
nameW[mds->Length / sizeof(WCHAR)] = 0;
if (SymFindFileInPathW(hProc, NULL, nameW, (void*)(DWORD_PTR)mm->TimeDateStamp,
mm->SizeOfImage, 0, SSRVOPT_DWORD, buffer, validate_file, NULL))
- SymLoadModuleExW(hProc, NULL, buffer, NULL, mm->BaseOfImage, mm->SizeOfImage,
- NULL, 0);
+ SymLoadModuleExW(hProc, NULL, buffer, NULL, get_addr64(mm->BaseOfImage),
+ mm->SizeOfImage, NULL, 0);
else if (is_pe_module_embedded(data, mm))
- SymLoadModuleExW(hProc, NULL, nameW, NULL, mm->BaseOfImage, mm->SizeOfImage,
- NULL, 0);
+ SymLoadModuleExW(hProc, NULL, nameW, NULL, get_addr64(mm->BaseOfImage),
+ mm->SizeOfImage, NULL, 0);
else
- SymLoadModuleExW(hProc, NULL, nameW, NULL, mm->BaseOfImage, mm->SizeOfImage,
- NULL, SLMFLAG_VIRTUAL);
+ SymLoadModuleExW(hProc, NULL, nameW, NULL, get_addr64(mm->BaseOfImage),
+ mm->SizeOfImage, NULL, SLMFLAG_VIRTUAL);
}
}
if (MiniDumpReadDumpStream(data->mapping, ExceptionStream, &dir, &stream, &size))
@@ -365,8 +371,8 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
dbg_curr_thread->in_exception = TRUE;
dbg_curr_thread->excpt_record.ExceptionCode = mes->ExceptionRecord.ExceptionCode;
dbg_curr_thread->excpt_record.ExceptionFlags = mes->ExceptionRecord.ExceptionFlags;
- dbg_curr_thread->excpt_record.ExceptionRecord = (void*)(DWORD_PTR)mes->ExceptionRecord.ExceptionRecord;
- dbg_curr_thread->excpt_record.ExceptionAddress = (void*)(DWORD_PTR)mes->ExceptionRecord.ExceptionAddress;
+ dbg_curr_thread->excpt_record.ExceptionRecord = (void*)(DWORD_PTR)get_addr64(mes->ExceptionRecord.ExceptionRecord);
+ dbg_curr_thread->excpt_record.ExceptionAddress = (void*)(DWORD_PTR)get_addr64(mes->ExceptionRecord.ExceptionAddress);
dbg_curr_thread->excpt_record.NumberParameters = mes->ExceptionRecord.NumberParameters;
for (i = 0; i < dbg_curr_thread->excpt_record.NumberParameters; i++)
{
More information about the wine-cvs
mailing list