Eric Pouech : dbghelp: Add our own thread data gathering struct for minidump internals instead on relying on SYSTEM_PROCESS_INFO .
Alexandre Julliard
julliard at winehq.org
Tue Jan 24 14:25:30 CST 2012
Module: wine
Branch: master
Commit: d02295d998d63579ec5faa963a438fb6d58f40c9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d02295d998d63579ec5faa963a438fb6d58f40c9
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Mon Jan 23 21:37:05 2012 +0100
dbghelp: Add our own thread data gathering struct for minidump internals instead on relying on SYSTEM_PROCESS_INFO.
---
dlls/dbghelp/minidump.c | 78 ++++++++++++++++++++++++++++++----------------
1 files changed, 51 insertions(+), 27 deletions(-)
diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c
index b7e098b..757e21d 100644
--- a/dlls/dbghelp/minidump.c
+++ b/dlls/dbghelp/minidump.c
@@ -49,13 +49,21 @@ struct dump_module
WCHAR name[MAX_PATH];
};
+struct dump_thread
+{
+ ULONG tid;
+ ULONG prio_class;
+ ULONG curr_prio;
+};
+
struct dump_context
{
/* process & thread information */
HANDLE hProcess;
DWORD pid;
- void* pcs_buffer;
- SYSTEM_PROCESS_INFORMATION* spi;
+ /* thread information */
+ struct dump_thread* threads;
+ unsigned num_threads;
/* module information */
struct dump_module* modules;
unsigned num_modules;
@@ -73,41 +81,55 @@ struct dump_context
};
/******************************************************************
- * fetch_processes_info
+ * fetch_process_info
*
- * reads system wide process information, and make spi point to the record
+ * reads system wide process information, and gather from it the threads information
* for process of id 'pid'
*/
-static BOOL fetch_processes_info(struct dump_context* dc)
+static BOOL fetch_process_info(struct dump_context* dc)
{
ULONG buf_size = 0x1000;
NTSTATUS nts;
+ void* pcs_buffer = NULL;
- dc->pcs_buffer = NULL;
- if (!(dc->pcs_buffer = HeapAlloc(GetProcessHeap(), 0, buf_size))) return FALSE;
+ if (!(pcs_buffer = HeapAlloc(GetProcessHeap(), 0, buf_size))) return FALSE;
for (;;)
{
- nts = NtQuerySystemInformation(SystemProcessInformation,
- dc->pcs_buffer, buf_size, NULL);
+ nts = NtQuerySystemInformation(SystemProcessInformation,
+ pcs_buffer, buf_size, NULL);
if (nts != STATUS_INFO_LENGTH_MISMATCH) break;
- dc->pcs_buffer = HeapReAlloc(GetProcessHeap(), 0, dc->pcs_buffer,
- buf_size *= 2);
- if (!dc->pcs_buffer) return FALSE;
+ pcs_buffer = HeapReAlloc(GetProcessHeap(), 0, pcs_buffer, buf_size *= 2);
+ if (!pcs_buffer) return FALSE;
}
if (nts == STATUS_SUCCESS)
{
- dc->spi = dc->pcs_buffer;
+ SYSTEM_PROCESS_INFORMATION* spi = pcs_buffer;
+ unsigned i;
+
for (;;)
{
- if (HandleToUlong(dc->spi->UniqueProcessId) == dc->pid) return TRUE;
- if (!dc->spi->NextEntryOffset) break;
- dc->spi = (SYSTEM_PROCESS_INFORMATION*)((char*)dc->spi + dc->spi->NextEntryOffset);
+ if (HandleToUlong(spi->UniqueProcessId) == dc->pid)
+ {
+ dc->num_threads = spi->dwThreadCount;
+ dc->threads = HeapAlloc(GetProcessHeap(), 0,
+ dc->num_threads * sizeof(dc->threads[0]));
+ if (!dc->threads) goto failed;
+ for (i = 0; i < dc->num_threads; i++)
+ {
+ dc->threads[i].tid = HandleToULong(spi->ti[i].ClientId.UniqueThread);
+ dc->threads[i].prio_class = spi->ti[i].dwBasePriority; /* FIXME */
+ dc->threads[i].curr_prio = spi->ti[i].dwCurrentPriority;
+ }
+ HeapFree(GetProcessHeap(), 0, pcs_buffer);
+ return TRUE;
+ }
+ if (!spi->NextEntryOffset) break;
+ spi = (SYSTEM_PROCESS_INFORMATION*)((char*)spi + spi->NextEntryOffset);
}
}
- HeapFree(GetProcessHeap(), 0, dc->pcs_buffer);
- dc->pcs_buffer = NULL;
- dc->spi = NULL;
+failed:
+ HeapFree(GetProcessHeap(), 0, pcs_buffer);
return FALSE;
}
@@ -147,7 +169,7 @@ static BOOL fetch_thread_info(struct dump_context* dc, int thd_idx,
const MINIDUMP_EXCEPTION_INFORMATION* except,
MINIDUMP_THREAD* mdThd, CONTEXT* ctx)
{
- DWORD tid = HandleToUlong(dc->spi->ti[thd_idx].ClientId.UniqueThread);
+ DWORD tid = dc->threads[thd_idx].tid;
HANDLE hThread;
THREAD_BASIC_INFORMATION tbi;
@@ -161,8 +183,8 @@ static BOOL fetch_thread_info(struct dump_context* dc, int thd_idx,
mdThd->Stack.Memory.Rva = 0;
mdThd->ThreadContext.DataSize = 0;
mdThd->ThreadContext.Rva = 0;
- mdThd->PriorityClass = dc->spi->ti[thd_idx].dwBasePriority; /* FIXME */
- mdThd->Priority = dc->spi->ti[thd_idx].dwCurrentPriority;
+ mdThd->PriorityClass = dc->threads[thd_idx].prio_class;
+ mdThd->Priority = dc->threads[thd_idx].curr_prio;
if ((hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid)) == NULL)
{
@@ -740,9 +762,9 @@ static unsigned dump_threads(struct dump_context* dc,
mdThdList.NumberOfThreads = 0;
rva_base = dc->rva;
- dc->rva += sz = sizeof(mdThdList.NumberOfThreads) + dc->spi->dwThreadCount * sizeof(mdThd);
+ dc->rva += sz = sizeof(mdThdList.NumberOfThreads) + dc->num_threads * sizeof(mdThd);
- for (i = 0; i < dc->spi->dwThreadCount; i++)
+ for (i = 0; i < dc->num_threads; i++)
{
fetch_thread_info(dc, i, except, &mdThd, &ctx);
@@ -761,7 +783,7 @@ static unsigned dump_threads(struct dump_context* dc,
cbin.ProcessId = dc->pid;
cbin.ProcessHandle = dc->hProcess;
cbin.CallbackType = ThreadCallback;
- cbin.u.Thread.ThreadId = HandleToUlong(dc->spi->ti[i].ClientId.UniqueThread);
+ cbin.u.Thread.ThreadId = dc->threads[i].tid;
cbin.u.Thread.ThreadHandle = 0; /* FIXME */
cbin.u.Thread.Context = ctx;
cbin.u.Thread.SizeOfContext = sizeof(CONTEXT);
@@ -896,6 +918,8 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
dc.modules = NULL;
dc.num_modules = 0;
dc.alloc_modules = 0;
+ dc.threads = NULL;
+ dc.num_threads = 0;
dc.cb = CallbackParam;
dc.type = DumpType;
dc.mem = NULL;
@@ -903,7 +927,7 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
dc.alloc_mem = 0;
dc.rva = 0;
- if (!fetch_processes_info(&dc)) return FALSE;
+ if (!fetch_process_info(&dc)) return FALSE;
fetch_modules_info(&dc);
/* 1) init */
@@ -1007,9 +1031,9 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
for (i = idx_stream; i < nStreams; i++)
writeat(&dc, mdHead.StreamDirectoryRva + i * sizeof(emptyDir), &emptyDir, sizeof(emptyDir));
- HeapFree(GetProcessHeap(), 0, dc.pcs_buffer);
HeapFree(GetProcessHeap(), 0, dc.mem);
HeapFree(GetProcessHeap(), 0, dc.modules);
+ HeapFree(GetProcessHeap(), 0, dc.threads);
return TRUE;
}
More information about the wine-cvs
mailing list