Module: wine Branch: master Commit: 33df0a7605c6675ea49e857a5aee4cf223ac0f01 URL: http://source.winehq.org/git/wine.git/?a=commit;h=33df0a7605c6675ea49e857a5a...
Author: Andrey Turkin andrey.turkin@gmail.com Date: Sat Dec 22 04:21:56 2007 +0300
dbghelp: Adjust minidump streams ordering and sizing.
To more closely match native format; this is required for windbg.
---
dlls/dbghelp/minidump.c | 55 ++++++++++++++++++++++++---------------------- 1 files changed, 29 insertions(+), 26 deletions(-)
diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c index e8daeda..949545f 100644 --- a/dlls/dbghelp/minidump.c +++ b/dlls/dbghelp/minidump.c @@ -351,7 +351,8 @@ static void append(struct dump_context* dc, void* data, unsigned size) * Write in File the exception information from pcs */ static void dump_exception_info(struct dump_context* dc, - const MINIDUMP_EXCEPTION_INFORMATION* except) + const MINIDUMP_EXCEPTION_INFORMATION* except, + DWORD *size) { MINIDUMP_EXCEPTION_STREAM mdExcpt; EXCEPTION_RECORD rec, *prec; @@ -390,6 +391,7 @@ static void dump_exception_info(struct dump_context* dc, mdExcpt.ThreadContext.Rva = dc->rva + sizeof(mdExcpt);
append(dc, &mdExcpt, sizeof(mdExcpt)); + *size = sizeof(mdExcpt); append(dc, pctx, sizeof(*pctx)); }
@@ -398,7 +400,7 @@ static void dump_exception_info(struct dump_context* dc, * * Write in File the modules from pcs */ -static void dump_modules(struct dump_context* dc, BOOL dump_elf) +static void dump_modules(struct dump_context* dc, BOOL dump_elf, DWORD *size) { MINIDUMP_MODULE mdModule; MINIDUMP_MODULE_LIST mdModuleList; @@ -422,7 +424,7 @@ static void dump_modules(struct dump_context* dc, BOOL dump_elf) * FIXME: if we don't ask for all modules in cb, we'll get a hole in the file */ rva_base = dc->rva; - dc->rva += sizeof(mdModuleList.NumberOfModules) + sizeof(mdModule) * nmod; + dc->rva += *size = sizeof(mdModuleList.NumberOfModules) + sizeof(mdModule) * nmod; for (i = 0; i < dc->num_module; i++) { if ((dc->module[i].is_elf && !dump_elf) || @@ -497,7 +499,7 @@ static void dump_modules(struct dump_context* dc, BOOL dump_elf) * * Dumps into File the information about the system */ -static void dump_system_info(struct dump_context* dc) +static void dump_system_info(struct dump_context* dc, DWORD *size) { MINIDUMP_SYSTEM_INFO mdSysInfo; SYSTEM_INFO sysInfo; @@ -525,6 +527,7 @@ static void dump_system_info(struct dump_context* dc) memset(&mdSysInfo.Cpu, 0, sizeof(mdSysInfo.Cpu));
append(dc, &mdSysInfo, sizeof(mdSysInfo)); + *size = sizeof(mdSysInfo);
slen = lstrlenW(osInfo.szCSDVersion) * sizeof(WCHAR); WriteFile(dc->hFile, &slen, sizeof(slen), &written, NULL); @@ -538,7 +541,8 @@ static void dump_system_info(struct dump_context* dc) * Dumps into File the information about running threads */ static void dump_threads(struct dump_context* dc, - const MINIDUMP_EXCEPTION_INFORMATION* except) + const MINIDUMP_EXCEPTION_INFORMATION* except, + DWORD *size) { MINIDUMP_THREAD mdThd; MINIDUMP_THREAD_LIST mdThdList; @@ -618,6 +622,7 @@ static void dump_threads(struct dump_context* dc, } writeat(dc, rva_base, &mdThdList.NumberOfThreads, sizeof(mdThdList.NumberOfThreads)); + *size = dc->rva - rva_base; }
/****************************************************************** @@ -625,7 +630,7 @@ static void dump_threads(struct dump_context* dc, * * dumps information about the memory of the process (stack of the threads) */ -static void dump_memory_info(struct dump_context* dc) +static void dump_memory_info(struct dump_context* dc, DWORD* size) { MINIDUMP_MEMORY_LIST mdMemList; MINIDUMP_MEMORY_DESCRIPTOR mdMem; @@ -639,6 +644,8 @@ static void dump_memory_info(struct dump_context* dc) sizeof(mdMemList.NumberOfMemoryRanges)); rva_base = dc->rva; dc->rva += mdMemList.NumberOfMemoryRanges * sizeof(mdMem); + *size = sizeof(mdMemList.NumberOfMemoryRanges) + + mdMemList.NumberOfMemoryRanges * sizeof(mdMem);
for (i = 0; i < dc->num_mem; i++) { @@ -663,7 +670,7 @@ static void dump_memory_info(struct dump_context* dc) } }
-static void dump_misc_info(struct dump_context* dc) +static void dump_misc_info(struct dump_context* dc, DWORD* size) { MINIDUMP_MISC_INFO mmi;
@@ -672,6 +679,7 @@ static void dump_misc_info(struct dump_context* dc) mmi.ProcessId = dc->pid; /* FIXME: create/user/kernel time */ append(dc, &mmi, sizeof(mmi)); + *size = sizeof(mmi); }
/****************************************************************** @@ -725,6 +733,7 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile, mdHead.StreamDirectoryRva = sizeof(mdHead); mdHead.u.TimeDateStamp = time(NULL); mdHead.Flags = DumpType; + mdHead.CheckSum = 0; append(&dc, &mdHead, sizeof(mdHead));
/* 3) write stream directories */ @@ -733,45 +742,40 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
/* 3.1) write data stream directories */
+ /* must be first in minidump */ + mdDir.StreamType = SystemInfoStream; + mdDir.Location.Rva = dc.rva; + dump_system_info(&dc, &mdDir.Location.DataSize); + writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), + &mdDir, sizeof(mdDir)); + mdDir.StreamType = ThreadListStream; mdDir.Location.Rva = dc.rva; - dump_threads(&dc, ExceptionParam); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_threads(&dc, ExceptionParam, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir));
mdDir.StreamType = ModuleListStream; mdDir.Location.Rva = dc.rva; - dump_modules(&dc, FALSE); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_modules(&dc, FALSE, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir));
mdDir.StreamType = 0xfff0; /* FIXME: this is part of MS reserved streams */ mdDir.Location.Rva = dc.rva; - dump_modules(&dc, TRUE); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_modules(&dc, TRUE, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir));
mdDir.StreamType = MemoryListStream; mdDir.Location.Rva = dc.rva; - dump_memory_info(&dc); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; - writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), - &mdDir, sizeof(mdDir)); - - mdDir.StreamType = SystemInfoStream; - mdDir.Location.Rva = dc.rva; - dump_system_info(&dc); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_memory_info(&dc, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir));
mdDir.StreamType = MiscInfoStream; mdDir.Location.Rva = dc.rva; - dump_misc_info(&dc); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_misc_info(&dc, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir));
@@ -780,8 +784,7 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile, { mdDir.StreamType = ExceptionStream; mdDir.Location.Rva = dc.rva; - dump_exception_info(&dc, ExceptionParam); - mdDir.Location.DataSize = dc.rva - mdDir.Location.Rva; + dump_exception_info(&dc, ExceptionParam, &mdDir.Location.DataSize); writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir), &mdDir, sizeof(mdDir)); }