Eric Pouech : winedbg, winedump: Embed wine build-id information info minidump, and display it.
Alexandre Julliard
julliard at winehq.org
Tue Jan 24 14:25:30 CST 2012
Module: wine
Branch: master
Commit: 2ce0e940181a04470f9937a92ae7640fe0e54646
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2ce0e940181a04470f9937a92ae7640fe0e54646
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Mon Jan 23 21:36:59 2012 +0100
winedbg, winedump: Embed wine build-id information info minidump, and display it.
---
dlls/dbghelp/minidump.c | 42 ++++++++++++++++++++++++++++++++++++++-
programs/winedbg/tgt_minidump.c | 18 +++++++++++++++-
tools/winedump/minidump.c | 15 +++++++++++++
3 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c
index fd7eb1ac..b7e098b 100644
--- a/dlls/dbghelp/minidump.c
+++ b/dlls/dbghelp/minidump.c
@@ -615,11 +615,29 @@ static unsigned dump_system_info(struct dump_context* dc)
OSVERSIONINFOW osInfo;
DWORD written;
ULONG slen;
+ DWORD wine_extra = 0;
+
+ const char *(CDECL *wine_get_build_id)(void);
+ void (CDECL *wine_get_host_version)(const char **sysname, const char **release);
+ const char* build_id = NULL;
+ const char* sys_name = NULL;
+ const char* release_name = NULL;
GetSystemInfo(&sysInfo);
osInfo.dwOSVersionInfoSize = sizeof(osInfo);
GetVersionExW(&osInfo);
+ wine_get_build_id = (void *)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_build_id");
+ wine_get_host_version = (void *)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version");
+ if (wine_get_build_id && wine_get_host_version)
+ {
+ /* cheat minidump system information by adding specific wine information */
+ wine_extra = 4 + 4 * sizeof(slen);
+ build_id = wine_get_build_id();
+ wine_get_host_version(&sys_name, &release_name);
+ wine_extra += strlen(build_id) + 1 + strlen(sys_name) + 1 + strlen(release_name) + 1;
+ }
+
mdSysInfo.ProcessorArchitecture = sysInfo.u.s.wProcessorArchitecture;
mdSysInfo.ProcessorLevel = sysInfo.wProcessorLevel;
mdSysInfo.ProcessorRevision = sysInfo.wProcessorRevision;
@@ -630,7 +648,7 @@ static unsigned dump_system_info(struct dump_context* dc)
mdSysInfo.BuildNumber = osInfo.dwBuildNumber;
mdSysInfo.PlatformId = osInfo.dwPlatformId;
- mdSysInfo.CSDVersionRva = dc->rva + sizeof(mdSysInfo);
+ mdSysInfo.CSDVersionRva = dc->rva + sizeof(mdSysInfo) + wine_extra;
mdSysInfo.u1.Reserved1 = 0;
mdSysInfo.u1.s.SuiteMask = VER_SUITE_TERMINAL;
@@ -672,6 +690,28 @@ static unsigned dump_system_info(struct dump_context* dc)
}
append(dc, &mdSysInfo, sizeof(mdSysInfo));
+ /* write Wine specific system information just behind the structure, and before any string */
+ if (wine_extra)
+ {
+ char code[] = {'W','I','N','E'};
+
+ WriteFile(dc->hFile, code, 4, &written, NULL);
+ /* number of sub-info, so that we can extend structure if needed */
+ slen = 3;
+ WriteFile(dc->hFile, &slen, sizeof(slen), &written, NULL);
+ /* we store offsets from just after the WINE marker */
+ slen = 4 * sizeof(DWORD);
+ WriteFile(dc->hFile, &slen, sizeof(slen), &written, NULL);
+ slen += strlen(build_id) + 1;
+ WriteFile(dc->hFile, &slen, sizeof(slen), &written, NULL);
+ slen += strlen(sys_name) + 1;
+ WriteFile(dc->hFile, &slen, sizeof(slen), &written, NULL);
+ WriteFile(dc->hFile, build_id, strlen(build_id) + 1, &written, NULL);
+ WriteFile(dc->hFile, sys_name, strlen(sys_name) + 1, &written, NULL);
+ WriteFile(dc->hFile, release_name, strlen(release_name) + 1, &written, NULL);
+ dc->rva += wine_extra;
+ }
+
/* write the service pack version string after this stream. It is referenced within the
stream by its RVA in the file. */
slen = lstrlenW(osInfo.szCSDVersion) * sizeof(WCHAR);
diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c
index f5750e8..afa41d8 100644
--- a/programs/winedbg/tgt_minidump.c
+++ b/programs/winedbg/tgt_minidump.c
@@ -174,6 +174,7 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
MINIDUMP_MODULE_LIST* mml;
MINIDUMP_MODULE* mm;
MINIDUMP_STRING* mds;
+ MINIDUMP_DIRECTORY* dir;
WCHAR exec_name[1024];
WCHAR nameW[1024];
unsigned len;
@@ -212,7 +213,7 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
}
}
- if (MiniDumpReadDumpStream(data->mapping, SystemInfoStream, NULL, &stream, NULL))
+ if (MiniDumpReadDumpStream(data->mapping, SystemInfoStream, &dir, &stream, NULL))
{
MINIDUMP_SYSTEM_INFO* msi = stream;
const char *str;
@@ -305,6 +306,21 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
}
dbg_printf(" on Windows %s (%u)\n", str, msi->BuildNumber);
/* FIXME CSD: msi->CSDVersionRva */
+
+ if (sizeof(MINIDUMP_SYSTEM_INFO) + 4 > dir->Location.DataSize &&
+ msi->CSDVersionRva >= dir->Location.Rva + sizeof(MINIDUMP_SYSTEM_INFO) + 4)
+ {
+ const char* code = (const char*)stream + sizeof(MINIDUMP_SYSTEM_INFO);
+ const DWORD* wes;
+
+ if (code[0] == 'W' && code[1] == 'I' && code[2] == 'N' && code[3] == 'E' &&
+ *(wes = (const DWORD*)(code += 4)) >= 3)
+ {
+ /* assume we have wine extensions */
+ dbg_printf(" [on %s, on top of %s (%s)]\n",
+ code + wes[1], code + wes[2], code + wes[3]);
+ }
+ }
}
dbg_curr_process = dbg_add_process(&be_process_minidump_io, pid, hProc);
diff --git a/tools/winedump/minidump.c b/tools/winedump/minidump.c
index 4cd04f3..ddd0ed6 100644
--- a/tools/winedump/minidump.c
+++ b/tools/winedump/minidump.c
@@ -341,6 +341,21 @@ void mdmp_dump(void)
printf(" x86.AMDExtendedCpuFeatures: %x\n",
msi->Cpu.X86CpuInfo.AMDExtendedCpuFeatures);
}
+ if (sizeof(MINIDUMP_SYSTEM_INFO) + 4 > dir->Location.DataSize &&
+ msi->CSDVersionRva >= dir->Location.Rva + 4)
+ {
+ const char* code = PRD(dir->Location.Rva + sizeof(MINIDUMP_SYSTEM_INFO), 4);
+ const DWORD* wes;
+ if (code && code[0] == 'W' && code[1] == 'I' && code[2] == 'N' && code[3] == 'E' &&
+ *(wes = (const DWORD*)(code += 4)) >= 3)
+ {
+ /* assume we have wine extensions */
+ printf(" Wine details:\n");
+ printf(" build-id: %s\n", code + wes[1]);
+ printf(" system: %s\n", code + wes[2]);
+ printf(" release: %s\n", code + wes[3]);
+ }
+ }
}
break;
case MiscInfoStream:
More information about the wine-cvs
mailing list