Alexandre Julliard : winedump: Print the "prefer native" Wine flag.

Alexandre Julliard julliard at winehq.org
Thu Feb 18 16:06:06 CST 2021


Module: wine
Branch: master
Commit: e27c7e0648c05a28e550254e295abfb7ea9049b5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e27c7e0648c05a28e550254e295abfb7ea9049b5

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Feb 18 11:11:33 2021 +0100

winedump: Print the "prefer native" Wine flag.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winedump/output.c | 36 ++++++++++--------------------------
 tools/winedump/pe.c     | 13 ++++++++++---
 2 files changed, 20 insertions(+), 29 deletions(-)

diff --git a/tools/winedump/output.c b/tools/winedump/output.c
index bbbb1ac0397..5911f22f6c8 100644
--- a/tools/winedump/output.c
+++ b/tools/winedump/output.c
@@ -234,41 +234,25 @@ void  output_c_preamble (void)
       puts ("Creating a forwarding DLL");
 
     fputs ("\nHMODULE hDLL=0;    /* DLL to call */\n\n", cfile);
-  }
 
-  fprintf (cfile,
-           "BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void "
-           "*reserved)\n{\n"
+    fprintf (cfile,
+           "BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)\n{\n"
            "    TRACE(\"(%%p, %%u, %%p)\\n\", instance, reason, reserved);\n\n"
            "    switch (reason)\n"
            "    {\n"
-           "        case DLL_WINE_PREATTACH:\n"
-           "            return FALSE;    /* prefer native version */\n"
-           "        case DLL_PROCESS_ATTACH:\n");
-
-  if (globals.forward_dll)
-    fprintf (cfile,
+           "        case DLL_PROCESS_ATTACH:\n"
            "            hDLL = LoadLibraryA(\"%s\");\n"
-           "            TRACE(\"Forwarding DLL (%s) loaded (%%p)\\n\", hDLL);\n",
-           globals.forward_dll, globals.forward_dll);
-  else
-    fprintf (cfile,
-           "            DisableThreadLibraryCalls(instance);\n");
-
-  fprintf (cfile,
-           "            break;\n");
-
-  if (globals.forward_dll)
-    fprintf (cfile,
+           "            TRACE(\"Forwarding DLL (%s) loaded (%%p)\\n\", hDLL);\n"
+           "            DisableThreadLibraryCalls(instance);\n"
+           "            break;\n"
            "        case DLL_PROCESS_DETACH:\n"
            "            FreeLibrary(hDLL);\n"
            "            TRACE(\"Forwarding DLL (%s) freed\\n\");\n"
-           "            break;\n",
-           globals.forward_dll);
-
-  fprintf (cfile,
+           "            break;\n"
            "    }\n\n"
-           "    return TRUE;\n}\n");
+           "    return TRUE;\n}\n",
+           globals.forward_dll, globals.forward_dll, globals.forward_dll);
+  }
 }
 
 
diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c
index 19ccd172da2..aa679103e59 100644
--- a/tools/winedump/pe.c
+++ b/tools/winedump/pe.c
@@ -45,8 +45,14 @@
 #include "winbase.h"
 #include "winedump.h"
 
+#define IMAGE_DLLCHARACTERISTICS_PREFER_NATIVE 0x0010 /* Wine extension */
+
 static const IMAGE_NT_HEADERS32*        PE_nt_headers;
 
+static const char builtin_signature[] = "Wine builtin DLL";
+static const char fakedll_signature[] = "Wine placeholder DLL";
+static int is_builtin;
+
 const char *get_machine_str(int mach)
 {
     switch (mach)
@@ -95,13 +101,13 @@ static const IMAGE_NT_HEADERS32 *get_nt_header( void )
     const IMAGE_DOS_HEADER *dos;
     dos = PRD(0, sizeof(*dos));
     if (!dos) return NULL;
+    is_builtin = (dos->e_lfanew >= sizeof(*dos) + 32 &&
+                  !memcmp( dos + 1, builtin_signature, sizeof(builtin_signature) ));
     return PRD(dos->e_lfanew, sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));
 }
 
 void print_fake_dll( void )
 {
-    static const char builtin_signature[] = "Wine builtin DLL";
-    static const char fakedll_signature[] = "Wine placeholder DLL";
     const IMAGE_DOS_HEADER *dos;
 
     dos = PRD(0, sizeof(*dos) + 32);
@@ -214,7 +220,8 @@ static inline void print_subsys(const char *title, WORD value)
 static inline void print_dllflags(const char *title, WORD value)
 {
     printf("  %-34s 0x%04X\n", title, value);
-#define X(f,s) if (value & f) printf("    %s\n", s)
+#define X(f,s) do { if (value & f) printf("    %s\n", s); } while(0)
+    if (is_builtin) X(IMAGE_DLLCHARACTERISTICS_PREFER_NATIVE, "PREFER_NATIVE (Wine extension)");
     X(IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA,       "HIGH_ENTROPY_VA");
     X(IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,          "DYNAMIC_BASE");
     X(IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY,       "FORCE_INTEGRITY");




More information about the wine-cvs mailing list