[PATCH 5/9] dbghelp/tests: now building inside each debuggee a manifest

Eric Pouech eric.pouech at gmail.com
Mon Jul 12 07:20:33 CDT 2021


This manifest will hold target (compiler, cpu, 32/64 exec...) related
information

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/dbghelp/tests/dbghelp.c   |   34 +++++++++++++++++++++++++++
 dlls/dbghelp/tests/debuggee.h  |    7 +++++
 dlls/dbghelp/tests/debuggee1.c |   51 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 92 insertions(+)

diff --git a/dlls/dbghelp/tests/dbghelp.c b/dlls/dbghelp/tests/dbghelp.c
index 123989442bf..4e8907ac26b 100644
--- a/dlls/dbghelp/tests/dbghelp.c
+++ b/dlls/dbghelp/tests/dbghelp.c
@@ -21,6 +21,9 @@
 #include "dbghelp.h"
 #include "wine/test.h"
 
+#define DEBUGGEE_NODEFINE
+#include "debuggee.h"
+
 struct debuggee
 {
     const char* name; /* name of main module */
@@ -29,6 +32,12 @@ struct debuggee
     HANDLE hThread; /* either new thread calling stack_walk_thread, or main thread */
     DWORD64 base;
     DWORD64 size;
+    unsigned char* manifest;
+    /*  0 : version (1)
+        1 : sizeof foobar
+        2 : for each field of foobar (ch, array, bf1, bf2, fb3, u), 3 values
+       20 |    offset, size, bit position (255 if not a bitfield)
+    */
 };
 
 #if defined(__i386__) || defined(__x86_64__)
@@ -167,6 +176,9 @@ static BOOL start_process(struct debuggee* dbg, const char* other)
 {
     DWORD count;
     BOOL ret;
+    char si_buf[sizeof(SYMBOL_INFO) + 200];
+    SYMBOL_INFO *si = (SYMBOL_INFO *)si_buf;
+    SIZE_T nread;
 
     memset(dbg, 0, sizeof(*dbg));
     if (other)
@@ -226,6 +238,27 @@ static BOOL start_process(struct debuggee* dbg, const char* other)
     {
         /* force the main module */
         find_main_module_cb(dbg->name, (DWORD_PTR)&start_process, dbg);
+        ok(build_manifest(), "Couldn't build debuggee manifest\n");
+    }
+
+    si->SizeOfStruct = sizeof(*si);
+    si->MaxNameLen = 200;
+    ret = SymFromName(dbg->hProcess, "debuggee_manifest", si);
+
+    if (!ret)
+    {
+        skip("Couldn't get debug information out of %s: %u\n", dbg->name, GetLastError());
+        return FALSE;
+    }
+    if ((dbg->manifest = HeapAlloc(GetProcessHeap(), 0, si->Size)) == NULL ||
+        si->Size != DEBUGGEE_MANIFEST_SIZE ||
+        !ReadProcessMemory(dbg->hProcess, (void*)(DWORD_PTR)si->Address, dbg->manifest, si->Size, &nread) ||
+        nread != si->Size ||
+        dbg->manifest[0] != DEBUGGEE_MANIFEST_VERSION)
+    {
+        skip("Couldn't access the debuggee manifest %u\n", GetLastError());
+        HeapFree(GetProcessHeap(), 0, dbg->manifest);
+        return FALSE;
     }
 
     return TRUE;
@@ -244,6 +277,7 @@ static void close_process(const struct debuggee* dbg)
         CloseHandle(dbg->hProcess);
         CloseHandle(dbg->hThread);
     }
+    HeapFree(GetProcessHeap(), 0, dbg->manifest);
 }
 
 START_TEST(dbghelp)
diff --git a/dlls/dbghelp/tests/debuggee.h b/dlls/dbghelp/tests/debuggee.h
index 9e181f1ba17..239a5085ae7 100644
--- a/dlls/dbghelp/tests/debuggee.h
+++ b/dlls/dbghelp/tests/debuggee.h
@@ -1,3 +1,4 @@
+#ifndef DEBUGGEE_NODEFINE
 /* avoid including standard headers, just to keep debug information as lean as possible */
 typedef void* HANDLE;
 typedef unsigned long DWORD;
@@ -10,6 +11,7 @@ extern DWORD  __stdcall SuspendThread(HANDLE h);
 #define UNREFERENCED_PARAMETER(u)	(void)(u)
 
 /* end of standard definitions */
+#endif
 
 #if defined(__GNUC__)
 #define NOINLINE __attribute__((noinline))
@@ -21,3 +23,8 @@ extern DWORD  __stdcall SuspendThread(HANDLE h);
 
 extern DWORD trucmuche(DWORD*);
 extern DWORD stack_walk_bottom(void);
+
+#define DEBUGGEE_MANIFEST_VERSION 1
+#define DEBUGGEE_MANIFEST_SIZE 20
+
+extern DWORD build_manifest(void);
diff --git a/dlls/dbghelp/tests/debuggee1.c b/dlls/dbghelp/tests/debuggee1.c
index e73f36759e2..8a8f613eddb 100644
--- a/dlls/dbghelp/tests/debuggee1.c
+++ b/dlls/dbghelp/tests/debuggee1.c
@@ -54,11 +54,62 @@ scaramouche:
     return ((other * base) & (1UL << 18)) != 0;
 }
 
+unsigned char debuggee_manifest[DEBUGGEE_MANIFEST_SIZE];
+
+#define FIELD_OFFSET(s,f) ((unsigned char)((char*)(&((struct s*)0)->f)-(char*)0))
+
+DWORD build_manifest(void)
+{
+    unsigned i = 0;
+
+    myfoobar.bf1 = 1;
+    myfoobar.bf2 = 1;
+    myfoobar.bf3 = 1;
+
+    if (FIELD_OFFSET(foobar, array) + sizeof(myfoobar.array) + sizeof(unsigned) == FIELD_OFFSET(foobar, u) &&
+        ((unsigned*)&myfoobar)[(FIELD_OFFSET(foobar, array) + sizeof(myfoobar.array)) / sizeof(unsigned)] == 0x409u)
+    {
+        debuggee_manifest[i++] = DEBUGGEE_MANIFEST_VERSION;
+        debuggee_manifest[i++] = sizeof(myfoobar);
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, ch);
+        debuggee_manifest[i++] = sizeof(myfoobar.ch);
+        debuggee_manifest[i++] = 255u;
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, array);
+        debuggee_manifest[i++] = sizeof(myfoobar.array);
+        debuggee_manifest[i++] = 255u;
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, array) + sizeof(myfoobar.array);
+        debuggee_manifest[i++] = sizeof(unsigned);
+        debuggee_manifest[i++] = 0;
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, array) + sizeof(myfoobar.array);
+        debuggee_manifest[i++] = sizeof(unsigned);
+        debuggee_manifest[i++] = 3;
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, array) + sizeof(myfoobar.array);
+        debuggee_manifest[i++] = sizeof(unsigned);
+        debuggee_manifest[i++] = 10;
+
+        debuggee_manifest[i++] = FIELD_OFFSET(foobar, u);
+        debuggee_manifest[i++] = sizeof(myfoobar.u);
+        debuggee_manifest[i++] = 255u;
+
+        if (i != sizeof(debuggee_manifest))
+            debuggee_manifest[0] = 0;
+    }
+    else /* unsupported alignment or bitfield disposition */
+        debuggee_manifest[0] = 0;
+    return debuggee_manifest[0];
+}
+
 int __stdcall WinMain(void* hInstance, void* hPrevInstance, char* lpCmdLine, int nCmdShow)
 {
     UNREFERENCED_PARAMETER(hInstance);
     UNREFERENCED_PARAMETER(hPrevInstance);
     UNREFERENCED_PARAMETER(lpCmdLine);
 
+    build_manifest();
     return function_AA(&myfoobar, nCmdShow ? 0 : 123) + stack_walk_bottom();
 }




More information about the wine-devel mailing list