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]);