New "--disable-fs-redirector" option for gendef and genidl. git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@2274 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-tools/gendef/ChangeLog b/mingw-w64-tools/gendef/ChangeLog index c4d493a..2f903ba 100644 --- a/mingw-w64-tools/gendef/ChangeLog +++ b/mingw-w64-tools/gendef/ChangeLog
@@ -1,3 +1,12 @@ +2010-05-01 Jonathan Yong <jon_y@users.sourceforge.net> + + * src/fsredir.h (doredirect): Declare. + * src/fsredir.c (doredirect): New. + (undoredirect): Likewise. + * src/gendef.c: (main): Use doredirect. + (show_usage): Add new option. + (opt_chain): Handle new option. + 2010-03-20 Kai Tietz <kai.tietz@onevision.com> * src/gendef_def.c (gendef_getsymbol_info): Handle ordinals forwarders, too.
diff --git a/mingw-w64-tools/gendef/Makefile.am b/mingw-w64-tools/gendef/Makefile.am index dec7c42..f82e71f 100644 --- a/mingw-w64-tools/gendef/Makefile.am +++ b/mingw-w64-tools/gendef/Makefile.am
@@ -1,6 +1,7 @@ bin_PROGRAMS = gendef -gendef_SOURCES = src/gendef.h src/compat_string.h src/gendef.c src/gendef_def.c src/compat_string.c +gendef_SOURCES = src/gendef.h src/compat_string.h src/gendef.c src/gendef_def.c src/compat_string.c \ + src/fsredir.c src/fsredir.h gendef_CFLAGS = $(AM_CFLAGS) -O3 -g -Werror -Wall -Wextra EXTRA_DIST = ChangeLog-2009
diff --git a/mingw-w64-tools/gendef/Makefile.in b/mingw-w64-tools/gendef/Makefile.in index 86d528c..b079171 100644 --- a/mingw-w64-tools/gendef/Makefile.in +++ b/mingw-w64-tools/gendef/Makefile.in
@@ -56,7 +56,8 @@ am__dirstamp = $(am__leading_dot)dirstamp am_gendef_OBJECTS = src/gendef-gendef.$(OBJEXT) \ src/gendef-gendef_def.$(OBJEXT) \ - src/gendef-compat_string.$(OBJEXT) + src/gendef-compat_string.$(OBJEXT) \ + src/gendef-fsredir.$(OBJEXT) gendef_OBJECTS = $(am_gendef_OBJECTS) gendef_LDADD = $(LDADD) gendef_LINK = $(CCLD) $(gendef_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ @@ -180,7 +181,9 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ with_mangle = @with_mangle@ -gendef_SOURCES = src/gendef.h src/compat_string.h src/gendef.c src/gendef_def.c src/compat_string.c +gendef_SOURCES = src/gendef.h src/compat_string.h src/gendef.c src/gendef_def.c src/compat_string.c \ + src/fsredir.c src/fsredir.h + gendef_CFLAGS = $(AM_CFLAGS) -O3 -g -Werror -Wall -Wextra EXTRA_DIST = ChangeLog-2009 DISTCHECK_CONFIGURE_FLAGS = --host=$(host) --with-mangle=@with_mangle@ @@ -289,6 +292,8 @@ src/$(DEPDIR)/$(am__dirstamp) src/gendef-compat_string.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) +src/gendef-fsredir.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) gendef$(EXEEXT): $(gendef_OBJECTS) $(gendef_DEPENDENCIES) @rm -f gendef$(EXEEXT) $(gendef_LINK) $(gendef_OBJECTS) $(gendef_LDADD) $(LIBS) @@ -296,6 +301,7 @@ mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/gendef-compat_string.$(OBJEXT) + -rm -f src/gendef-fsredir.$(OBJEXT) -rm -f src/gendef-gendef.$(OBJEXT) -rm -f src/gendef-gendef_def.$(OBJEXT) @@ -303,6 +309,7 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gendef-compat_string.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gendef-fsredir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gendef-gendef.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gendef-gendef_def.Po@am__quote@ @@ -364,6 +371,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gendef_CFLAGS) $(CFLAGS) -c -o src/gendef-compat_string.obj `if test -f 'src/compat_string.c'; then $(CYGPATH_W) 'src/compat_string.c'; else $(CYGPATH_W) '$(srcdir)/src/compat_string.c'; fi` +src/gendef-fsredir.o: src/fsredir.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gendef_CFLAGS) $(CFLAGS) -MT src/gendef-fsredir.o -MD -MP -MF src/$(DEPDIR)/gendef-fsredir.Tpo -c -o src/gendef-fsredir.o `test -f 'src/fsredir.c' || echo '$(srcdir)/'`src/fsredir.c +@am__fastdepCC_TRUE@ $(am__mv) src/$(DEPDIR)/gendef-fsredir.Tpo src/$(DEPDIR)/gendef-fsredir.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/fsredir.c' object='src/gendef-fsredir.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gendef_CFLAGS) $(CFLAGS) -c -o src/gendef-fsredir.o `test -f 'src/fsredir.c' || echo '$(srcdir)/'`src/fsredir.c + +src/gendef-fsredir.obj: src/fsredir.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gendef_CFLAGS) $(CFLAGS) -MT src/gendef-fsredir.obj -MD -MP -MF src/$(DEPDIR)/gendef-fsredir.Tpo -c -o src/gendef-fsredir.obj `if test -f 'src/fsredir.c'; then $(CYGPATH_W) 'src/fsredir.c'; else $(CYGPATH_W) '$(srcdir)/src/fsredir.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) src/$(DEPDIR)/gendef-fsredir.Tpo src/$(DEPDIR)/gendef-fsredir.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/fsredir.c' object='src/gendef-fsredir.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gendef_CFLAGS) $(CFLAGS) -c -o src/gendef-fsredir.obj `if test -f 'src/fsredir.c'; then $(CYGPATH_W) 'src/fsredir.c'; else $(CYGPATH_W) '$(srcdir)/src/fsredir.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \
diff --git a/mingw-w64-tools/gendef/src/fsredir.c b/mingw-w64-tools/gendef/src/fsredir.c new file mode 100644 index 0000000..3b106b4 --- /dev/null +++ b/mingw-w64-tools/gendef/src/fsredir.c
@@ -0,0 +1,44 @@ +#include "fsredir.h" + +#ifdef REDIRECTOR +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <stdlib.h> +#include <stdio.h> + +static PVOID revert; /*revert pointer*/ +static HMODULE kernel32handle; +typedef WINBOOL (__stdcall (*redirector))(PVOID *); +typedef WINBOOL (__stdcall (*revertor))(PVOID); +static redirector redirectorfunction; /*Wow64DisableWow64FsRedirection*/ +static revertor revertorfunction; /*Wow64RevertWow64FsRedirection*/ + +static void undoredirect(void) { + revertorfunction(revert); + FreeLibrary(kernel32handle); +} + +void doredirect(const int redir) { + if (redir) { + kernel32handle = LoadLibraryA("kernel32.dll"); + if (!kernel32handle) { + fprintf(stderr, "kernel32.dll failed to load, failed to disable FS redirection.\n"); + return; + } + redirectorfunction = (redirector)GetProcAddress(kernel32handle, "Wow64DisableWow64FsRedirection"); + revertorfunction = (revertor)GetProcAddress(kernel32handle, "Wow64RevertWow64FsRedirection"); + if (!redirectorfunction || ! revertorfunction) { + FreeLibrary(kernel32handle); + fprintf(stderr, "Wow64DisableWow64FsRedirection or Wow64RevertWow64FsRedirection functions missing.\n"); + return; + } + if (!redirectorfunction(&revert)) { + FreeLibrary(kernel32handle); + fprintf(stderr, "Wow64DisableWow64FsRedirection failed.\n"); + return; + } else { + atexit(undoredirect); + } + } +} +#endif
diff --git a/mingw-w64-tools/gendef/src/fsredir.h b/mingw-w64-tools/gendef/src/fsredir.h new file mode 100644 index 0000000..4a470fe --- /dev/null +++ b/mingw-w64-tools/gendef/src/fsredir.h
@@ -0,0 +1,9 @@ +#ifndef FSREDIR_HEADER +#define FSREDIR_HEADER + +#if defined (_WIN32) || defined (__CYGWIN__) +#define REDIRECTOR 1 /* Allow disabling win64 FS redirection */ +void doredirect(const int redir); +#endif + +#endif
diff --git a/mingw-w64-tools/gendef/src/gendef.c b/mingw-w64-tools/gendef/src/gendef.c index 9ba0155..1fd1738 100644 --- a/mingw-w64-tools/gendef/src/gendef.c +++ b/mingw-w64-tools/gendef/src/gendef.c
@@ -30,6 +30,7 @@ #include <string.h> #include "compat_string.h" #include "gendef.h" +#include "fsredir.h" #ifdef HAVE_LIBMANGLE #include <libmangle.h> #endif @@ -82,6 +83,10 @@ PIMAGE_NT_HEADERS32 gPEDta; PIMAGE_NT_HEADERS64 gPEPDta; +#ifdef REDIRECTOR +static int use_redirector = 0; /* Use/Disable FS redirector */ +#endif + static int std_output = 0; static int assume_stdcall = 0; /* Set to one, if function symbols should be assumed to have stdcall. */ static int no_forward_output = 0; /* Set to one, if in .def files forwarders shouldn't be displayed. */ @@ -127,6 +132,14 @@ return 0; } +#ifdef REDIRECTOR + if (!strcmp (opts, "--disable-fs-redirector") || !strcmp (opts, "-r")) + { + use_redirector = 1; + return 0; + } +#endif + current = malloc (sizeof(Gendefopts)); if (current) { @@ -176,7 +189,12 @@ " -I, --include-def-path <path>\n" " Add additional search paths to find\n" " hint .def files.\n" - " -f, --no-forward-output Don't output forwarders in .def file\n" + " -f, --no-forward-output Don't output forwarders in .def file\n" +#ifdef REDIRECTOR + " -r, --disable-fs-redirector\n" + " Disable Win64 FS redirection, for 32-bit\n" + " gendef on 64-bit Windows\n" +#endif ); fprintf (stderr, "\n"); fprintf (stderr, "Usage example: \n" @@ -201,6 +219,9 @@ for (i = 1; i < argc; i++) i += opt_chain (argv[i], ((i+1) < argc ? argv[i+1] : NULL)); +#ifdef REDIRECTOR + doredirect(use_redirector); +#endif opt = chain_ptr; while (opt) {
diff --git a/mingw-w64-tools/genidl/ChangeLog b/mingw-w64-tools/genidl/ChangeLog new file mode 100644 index 0000000..c8fd342 --- /dev/null +++ b/mingw-w64-tools/genidl/ChangeLog
@@ -0,0 +1,8 @@ +2010-05-01 Jonathan Yong <jon_y@users.sourceforge.net> + + * src/fsredir.h (doredirect): Declare. + * src/fsredir.c (doredirect): New. + (undoredirect): Likewise. + * src/genidl.c: (main): Use doredirect. + (show_usage): Add new option. + (scanArgs): Handle new option.
diff --git a/mingw-w64-tools/genidl/Makefile.am b/mingw-w64-tools/genidl/Makefile.am index f2ba25a..b7c77dc 100644 --- a/mingw-w64-tools/genidl/Makefile.am +++ b/mingw-w64-tools/genidl/Makefile.am
@@ -3,7 +3,7 @@ genidl_SOURCES = \ src/genidl_cfg.h src/genidl_typinfo.h src/genidl_typeinfo.h src/genidl_readpe.h \ src/genidl_config.c src/genidl_typinfo.c src/genidl_typeinfo.c src/genidl_readpe.c \ - src/genidl_dumpidl.c \ + src/genidl_dumpidl.c src/fsredir.c src/fsredir.h \ src/genidl.c genidl_CFLAGS = -O3 -g -std=gnu99 -Wall -Wextra -Wshadow -Wformat -Wpacked -Wredundant-decls -Winline -pedantic -Wno-pedantic-ms-format -Wmissing-declarations -Wredundant-decls -Wimplicit-function-declaration -Wmissing-noreturn -Wmissing-prototypes -Wstrict-aliasing=2
diff --git a/mingw-w64-tools/genidl/Makefile.in b/mingw-w64-tools/genidl/Makefile.in index 72dfc52..87ad686 100644 --- a/mingw-w64-tools/genidl/Makefile.in +++ b/mingw-w64-tools/genidl/Makefile.in
@@ -59,7 +59,7 @@ src/genidl-genidl_typeinfo.$(OBJEXT) \ src/genidl-genidl_readpe.$(OBJEXT) \ src/genidl-genidl_dumpidl.$(OBJEXT) \ - src/genidl-genidl.$(OBJEXT) + src/genidl-fsredir.$(OBJEXT) src/genidl-genidl.$(OBJEXT) genidl_OBJECTS = $(am_genidl_OBJECTS) genidl_LDADD = $(LDADD) genidl_LINK = $(CCLD) $(genidl_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ @@ -185,7 +185,7 @@ genidl_SOURCES = \ src/genidl_cfg.h src/genidl_typinfo.h src/genidl_typeinfo.h src/genidl_readpe.h \ src/genidl_config.c src/genidl_typinfo.c src/genidl_typeinfo.c src/genidl_readpe.c \ - src/genidl_dumpidl.c \ + src/genidl_dumpidl.c src/fsredir.c src/fsredir.h \ src/genidl.c genidl_CFLAGS = -O3 -g -std=gnu99 -Wall -Wextra -Wshadow -Wformat -Wpacked -Wredundant-decls -Winline -pedantic -Wno-pedantic-ms-format -Wmissing-declarations -Wredundant-decls -Wimplicit-function-declaration -Wmissing-noreturn -Wmissing-prototypes -Wstrict-aliasing=2 @@ -301,6 +301,8 @@ src/$(DEPDIR)/$(am__dirstamp) src/genidl-genidl_dumpidl.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) +src/genidl-fsredir.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) src/genidl-genidl.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) genidl$(EXEEXT): $(genidl_OBJECTS) $(genidl_DEPENDENCIES) @@ -309,6 +311,7 @@ mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f src/genidl-fsredir.$(OBJEXT) -rm -f src/genidl-genidl.$(OBJEXT) -rm -f src/genidl-genidl_config.$(OBJEXT) -rm -f src/genidl-genidl_dumpidl.$(OBJEXT) @@ -319,6 +322,7 @@ distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/genidl-fsredir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/genidl-genidl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/genidl-genidl_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/genidl-genidl_dumpidl.Po@am__quote@ @@ -412,6 +416,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -c -o src/genidl-genidl_dumpidl.obj `if test -f 'src/genidl_dumpidl.c'; then $(CYGPATH_W) 'src/genidl_dumpidl.c'; else $(CYGPATH_W) '$(srcdir)/src/genidl_dumpidl.c'; fi` +src/genidl-fsredir.o: src/fsredir.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -MT src/genidl-fsredir.o -MD -MP -MF src/$(DEPDIR)/genidl-fsredir.Tpo -c -o src/genidl-fsredir.o `test -f 'src/fsredir.c' || echo '$(srcdir)/'`src/fsredir.c +@am__fastdepCC_TRUE@ $(am__mv) src/$(DEPDIR)/genidl-fsredir.Tpo src/$(DEPDIR)/genidl-fsredir.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/fsredir.c' object='src/genidl-fsredir.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -c -o src/genidl-fsredir.o `test -f 'src/fsredir.c' || echo '$(srcdir)/'`src/fsredir.c + +src/genidl-fsredir.obj: src/fsredir.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -MT src/genidl-fsredir.obj -MD -MP -MF src/$(DEPDIR)/genidl-fsredir.Tpo -c -o src/genidl-fsredir.obj `if test -f 'src/fsredir.c'; then $(CYGPATH_W) 'src/fsredir.c'; else $(CYGPATH_W) '$(srcdir)/src/fsredir.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) src/$(DEPDIR)/genidl-fsredir.Tpo src/$(DEPDIR)/genidl-fsredir.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/fsredir.c' object='src/genidl-fsredir.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -c -o src/genidl-fsredir.obj `if test -f 'src/fsredir.c'; then $(CYGPATH_W) 'src/fsredir.c'; else $(CYGPATH_W) '$(srcdir)/src/fsredir.c'; fi` + src/genidl-genidl.o: src/genidl.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(genidl_CFLAGS) $(CFLAGS) -MT src/genidl-genidl.o -MD -MP -MF src/$(DEPDIR)/genidl-genidl.Tpo -c -o src/genidl-genidl.o `test -f 'src/genidl.c' || echo '$(srcdir)/'`src/genidl.c @am__fastdepCC_TRUE@ $(am__mv) src/$(DEPDIR)/genidl-genidl.Tpo src/$(DEPDIR)/genidl-genidl.Po
diff --git a/mingw-w64-tools/genidl/src/fsredir.c b/mingw-w64-tools/genidl/src/fsredir.c new file mode 100644 index 0000000..3b106b4 --- /dev/null +++ b/mingw-w64-tools/genidl/src/fsredir.c
@@ -0,0 +1,44 @@ +#include "fsredir.h" + +#ifdef REDIRECTOR +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <stdlib.h> +#include <stdio.h> + +static PVOID revert; /*revert pointer*/ +static HMODULE kernel32handle; +typedef WINBOOL (__stdcall (*redirector))(PVOID *); +typedef WINBOOL (__stdcall (*revertor))(PVOID); +static redirector redirectorfunction; /*Wow64DisableWow64FsRedirection*/ +static revertor revertorfunction; /*Wow64RevertWow64FsRedirection*/ + +static void undoredirect(void) { + revertorfunction(revert); + FreeLibrary(kernel32handle); +} + +void doredirect(const int redir) { + if (redir) { + kernel32handle = LoadLibraryA("kernel32.dll"); + if (!kernel32handle) { + fprintf(stderr, "kernel32.dll failed to load, failed to disable FS redirection.\n"); + return; + } + redirectorfunction = (redirector)GetProcAddress(kernel32handle, "Wow64DisableWow64FsRedirection"); + revertorfunction = (revertor)GetProcAddress(kernel32handle, "Wow64RevertWow64FsRedirection"); + if (!redirectorfunction || ! revertorfunction) { + FreeLibrary(kernel32handle); + fprintf(stderr, "Wow64DisableWow64FsRedirection or Wow64RevertWow64FsRedirection functions missing.\n"); + return; + } + if (!redirectorfunction(&revert)) { + FreeLibrary(kernel32handle); + fprintf(stderr, "Wow64DisableWow64FsRedirection failed.\n"); + return; + } else { + atexit(undoredirect); + } + } +} +#endif
diff --git a/mingw-w64-tools/genidl/src/fsredir.h b/mingw-w64-tools/genidl/src/fsredir.h new file mode 100644 index 0000000..4a470fe --- /dev/null +++ b/mingw-w64-tools/genidl/src/fsredir.h
@@ -0,0 +1,9 @@ +#ifndef FSREDIR_HEADER +#define FSREDIR_HEADER + +#if defined (_WIN32) || defined (__CYGWIN__) +#define REDIRECTOR 1 /* Allow disabling win64 FS redirection */ +void doredirect(const int redir); +#endif + +#endif
diff --git a/mingw-w64-tools/genidl/src/genidl.c b/mingw-w64-tools/genidl/src/genidl.c index 6102f95..fc4d7f9 100644 --- a/mingw-w64-tools/genidl/src/genidl.c +++ b/mingw-w64-tools/genidl/src/genidl.c
@@ -47,6 +47,7 @@ #include "genidl_readpe.h" #include "genidl_typeinfo.h" #include "genidl_typinfo.h" +#include "fsredir.h" /* Configure globals. */ int show_dump_too = 0; @@ -59,6 +60,10 @@ static char *get_idl_basename (const char *file); +#ifdef REDIRECTOR +static int use_redirector = 0; /* Use/Disable FS redirector */ +#endif + static void show_usage (void) { @@ -72,6 +77,11 @@ " -d, --dump Dump additional internal debugging information.\n" " -v, --verbose Show additional status prints.\n" " -h, --help Show this help.\n" +#ifdef REDIRECTOR + " -r, --disable-fs-redirector\n" + " Disable Win64 FS redirection, for 32-bit\n" + " gendef on 64-bit Windows\n" +#endif ); fprintf (stderr, "\nReport bugs to <mingw-w64-public@lists.sourceforge.net>\n"); exit (1); @@ -119,6 +129,16 @@ } else goto unknown_fail; +#ifdef REDIRECTOR + case 'r': + if(! strcmp (h, "disable-fs-redirector")) + { + use_redirector = 1; + break; + } + else + goto unknown_fail; +#endif default: goto unknown_fail; } break; @@ -146,6 +166,13 @@ goto unknown_fail; is_verbose++; break; +#ifdef REDIRECTOR + case 'r': + if (h[1] != 0) + goto unknown_fail; + use_redirector = 1; + break; +#endif default: unknown_fail: fprintf (stderr, "Option %s' is unknown.\n", *argv); @@ -178,6 +205,9 @@ { show_usage (); } +#ifdef REDIRECTOR + doredirect(use_redirector); +#endif for (i = 0; i < file_args_cnt; i++) { char s[1024], *idl_basename,*org_basename;
diff --git a/mingw-w64-tools/genidl/src/genidl_typeinfo.c b/mingw-w64-tools/genidl/src/genidl_typeinfo.c index 63c415c..da110ed 100644 --- a/mingw-w64-tools/genidl/src/genidl_typeinfo.c +++ b/mingw-w64-tools/genidl/src/genidl_typeinfo.c
@@ -43,6 +43,7 @@ */ #define _CRT_SECURE_NO_WARNINGS +#include <inttypes.h> #include "genidl_cfg.h" #include "genidl_typeinfo.h" #include "genidl_typinfo.h" @@ -106,10 +107,10 @@ if (t->magic1 != TYPELIB_MSFT_MAGIC) { size_t k,j; - fprintf (fp, "Unknown magic 0x%x (%Ix)\n", t->magic1, size); + fprintf (fp, "Unknown magic 0x%x (%"PRIxMAX")\n", t->magic1, (uintmax_t) size); for (k = 0; k < size && k < (16 * 32);) { - fprintf (fp, "0x%08Ix: ", k); + fprintf (fp, "0x%08"PRIxMAX": ", (uintmax_t)k); for (j=0; j < 16 && k < size && k < (16 * 32); j++, k++) { fprintf (fp, " %02X", dta[k]);