[PATCH 04/10] dbghelp/tests: Now properly getting base of main module inside debuggee structure
Eric Pouech
eric.pouech at gmail.com
Thu Jul 15 02:39:17 CDT 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/tests/dbghelp.c | 52 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/dlls/dbghelp/tests/dbghelp.c b/dlls/dbghelp/tests/dbghelp.c
index b0302b85ad1..a6c524177bf 100644
--- a/dlls/dbghelp/tests/dbghelp.c
+++ b/dlls/dbghelp/tests/dbghelp.c
@@ -27,6 +27,8 @@ struct debuggee
BOOL external_process;
HANDLE hProcess;
HANDLE hThread; /* either new thread calling stack_walk_thread, or main thread */
+ DWORD64 base;
+ DWORD64 size;
};
#if defined(__i386__) || defined(__x86_64__)
@@ -127,9 +129,44 @@ static void test_stack_walk(const struct debuggee* dbg)
#endif /* __i386__ || __x86_64__ */
+static BOOL CALLBACK find_main_module_cb(PCSTR name, DWORD64 base, PVOID in_user)
+{
+ struct debuggee* dbg = in_user;
+ IMAGEHLP_MODULE im;
+
+ memset(&im, 0, sizeof(im));
+ im.SizeOfStruct = sizeof(im);
+ ok(SymGetModuleInfo(dbg->hProcess, base, &im), "SymGetModuleInfo failed: %u\n", GetLastError());
+
+ if (dbg->external_process)
+ {
+ /* lookup external exec path as module name */
+ const char* ff;
+ const char* fb;
+ const char* ext;
+
+ if (!(ff = strrchr(dbg->name, '/'))) ff = dbg->name; else ++ff;
+ if (!(fb = strrchr(ff, '\\'))) fb = ff; else ++fb;
+
+ ext = strchr(fb, '.');
+ if ((!ext || !_strcmpi(ext, ".exe")) && !_strnicmp(fb, im.ModuleName, ext ? ext - fb : strlen(fb)))
+ {
+ dbg->base = im.BaseOfImage;
+ dbg->size = im.ImageSize;
+ }
+ }
+ else
+ {
+ dbg->base = im.BaseOfImage;
+ dbg->size = im.ImageSize;
+ }
+ return TRUE;
+}
+
static BOOL start_process(struct debuggee* dbg, const char* other)
{
DWORD count;
+ BOOL ret;
memset(dbg, 0, sizeof(*dbg));
if (other)
@@ -176,6 +213,21 @@ static BOOL start_process(struct debuggee* dbg, const char* other)
}
while (!count);
+ /* init base and size fields */
+ if (dbg->external_process)
+ {
+ dbg->base = dbg->size = 0;
+ ret = SymEnumerateModules64(dbg->hProcess, find_main_module_cb, dbg);
+ ok(ret && dbg->base != 0, "No base for main module: %u\n", GetLastError());
+ if (!ret || dbg->base == 0)
+ return FALSE;
+ }
+ else
+ {
+ /* force the main module */
+ find_main_module_cb(dbg->name, (DWORD_PTR)&start_process, dbg);
+ }
+
return TRUE;
}
More information about the wine-devel
mailing list