diff --git a/aclocal.m4 b/aclocal.m4
index 1dd5ffb..3c72ca9 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -448,3 +448,21 @@ else
   AC_MSG_RESULT([no])
 [fi]
 ])
+
+dnl Check if ln can handle directories properly (mingw).
+AC_DEFUN(grub_CHECK_LINK_DIR,[
+AC_MSG_CHECKING([whether ln can handle directories properly])
+[mkdir testdir 2>/dev/null
+case $srcdir in
+[\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
+    *) reldir=../$srcdir/include/grub/util ;;
+esac
+if ln -s $reldir testdir/util 2>/dev/null ; then]
+  AC_MSG_RESULT([yes])
+  [link_dir=yes
+else
+  link_dir=no]
+  AC_MSG_RESULT([no])
+[fi
+rm -rf testdir]
+])
diff --git a/configure.ac b/configure.ac
index 134e0a3..d9f182d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -474,8 +474,17 @@ AC_SUBST([freetype_cflags])
 AC_SUBST([freetype_libs])
 
 # Output files.
-AC_CONFIG_LINKS([include/grub/cpu:include/grub/$target_cpu
+grub_CHECK_LINK_DIR
+if test x"$link_dir" = xyes ; then
+  AC_CONFIG_LINKS([include/grub/cpu:include/grub/$target_cpu
 	include/grub/machine:include/grub/$target_cpu/$platform])
+else
+  mkdir -p include/grub 2>/dev/null
+  rm -rf include/grub/cpu
+  cp -rp $srcdir/include/grub/$target_cpu include/grub/cpu 2>/dev/null
+  rm -rf include/grub/machine
+  cp -rp $srcdir/include/grub/$target_cpu/$platform include/grub/machine 2>/dev/null
+fi
 AC_CONFIG_FILES([Makefile gensymlist.sh genkernsyms.sh])
 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
 AC_OUTPUT
diff --git a/util/hostdisk.c b/util/hostdisk.c
index 67a1233..3e73359 100644
--- a/util/hostdisk.c
+++ b/util/hostdisk.c
@@ -555,7 +555,12 @@ read_device_map (const char *dev_map)
 	e++;
       *e = '\0';
 
+#ifdef __MINGW32__
+      (void) st;
+      if (grub_util_get_disk_size (p) == -1LL)
+#else
       if (stat (p, &st) == -1)
+#endif	
 	{
 	  free (map[drive].drive);
 	  map[drive].drive = NULL;
diff --git a/util/misc.c b/util/misc.c
index 8d7d080..43050ce 100644
--- a/util/misc.c
+++ b/util/misc.c
@@ -311,6 +311,7 @@ grub_get_time_ms (void)
   return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
 }
 
+#ifndef __MINGW32__
 void
 grub_millisleep (grub_uint32_t ms)
 {
@@ -320,6 +321,7 @@ grub_millisleep (grub_uint32_t ms)
   ts.tv_nsec = (ms % 1000) * 1000000;
   nanosleep (&ts, NULL);
 }
+#endif
 
 void 
 grub_arch_sync_caches (void *address __attribute__ ((unused)),
@@ -361,6 +363,12 @@ void sleep (int s)
   Sleep (s * 1000);
 }
 
+void
+grub_millisleep (grub_uint32_t ms)
+{
+  Sleep (ms);
+}
+
 grub_int64_t
 grub_util_get_disk_size (char *name)
 {
