Replacement mmap function for Win32.
authorGillen Daniel <gillen.daniel@gmail.com>
Wed, 7 Sep 2011 11:20:24 +0000 (12:20 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 7 Sep 2011 11:42:00 +0000 (12:42 +0100)
(Updates by RWMJ)

configure.ac
lib/Makefile.am
lib/hivex-internal.h
lib/hivex.c
lib/mmap.c [new file with mode: 0644]
lib/mmap.h [new file with mode: 0644]

index d7520e7..9d04e35 100644 (file)
@@ -133,6 +133,9 @@ AC_CHECK_SIZEOF([long])
 dnl Headers.
 AC_CHECK_HEADERS([byteswap.h endian.h libintl.h])
 
+dnl Check for mmap
+AC_REPLACE_FUNCS([mmap])
+
 dnl Functions.
 AC_CHECK_FUNCS([bindtextdomain])
 
index b6a35d2..cfd2e05 100644 (file)
@@ -29,9 +29,10 @@ libhivex_la_SOURCES = \
   hivex-internal.h \
   byte_conversions.h \
   gettext.h \
+  mmap.h \
   hivex.syms
 
-libhivex_la_LIBADD =  ../gnulib/lib/libgnu.la
+libhivex_la_LIBADD =  ../gnulib/lib/libgnu.la $(LTLIBOBJS)
 libhivex_la_LDFLAGS = \
        -version-info 0:0:0 \
        $(VERSION_SCRIPT_FLAGS)$(srcdir)/hivex.syms \
index dc23ba5..43b1a76 100644 (file)
@@ -59,6 +59,11 @@ struct hive_h {
   /* For writing. */
   size_t endblocks;             /* Offset to next block allocation (0
                                    if not allocated anything yet). */
+
+#ifndef HAVE_MMAP
+  /* Internal data for mmap replacement */
+  void *p_winmap;
+#endif
 };
 
 #define STREQ(a,b) (strcmp((a),(b)) == 0)
index 5b3772b..bf1a860 100644 (file)
 #include <unistd.h>
 #include <errno.h>
 #include <iconv.h>
-#include <sys/mman.h>
 #include <sys/stat.h>
 #include <assert.h>
 
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+#else
+/* On systems without mmap (and munmap), use a replacement function. */
+#include "mmap.h"
+#endif
+
 #include "c-ctype.h"
 #include "full-read.h"
 #include "full-write.h"
diff --git a/lib/mmap.c b/lib/mmap.c
new file mode 100644 (file)
index 0000000..c68ec32
--- /dev/null
@@ -0,0 +1,69 @@
+/* mmap replacement for mingw.
+ *
+ * Copyright (C) 2011 by Daniel Gillen <gillen (dot) dan (at) pinguin (dot) lu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ */
+
+#include "hivex.h"
+#include "hivex-internal.h"
+#include "mmap.h"
+
+#include <windows.h>
+#include <io.h>
+
+void *
+hivex__rpl_mmap (hive_h *h,
+                 void *p_addr, size_t len, int prot, int flags, int fd, off_t offset)
+{
+  void *p_map;
+
+  // Check parameters for unsupported values
+  if (p_addr != NULL)
+    return MAP_FAILED;
+  if (prot != PROT_READ)
+    return MAP_FAILED;
+  if (flags != MAP_SHARED)
+    return MAP_FAILED;
+
+  // Create file mapping
+  h->p_winmap = CreateFileMapping ((HANDLE)_get_osfhandle(fd),
+                                   NULL, PAGE_READONLY, 0, 0, NULL);
+  if (h->p_winmap == NULL)
+    return MAP_FAILED;
+
+  // Create map view
+  p_map = MapViewOfFile (h->p_winmap, FILE_MAP_READ, 0, 0, len);
+  if (p_map == NULL) {
+    CloseHandle (h->p_winmap);
+    return MAP_FAILED;
+  }
+
+  return p_map;
+}
+
+int
+hivex__rpl_munmap (hive_h *h, void *p_addr, size_t len)
+{
+  if (p_addr == NULL || h->p_winmap == NULL)
+    return -1;
+
+  // Close map view
+  if (UnmapViewOfFile (p_addr) == 0)
+    return -1;
+
+  // Close file mapping
+  if (CloseHandle (h->p_winmap) == 0)
+    return -1;
+
+  h->p_winmap = NULL;
+  return 0;
+}
diff --git a/lib/mmap.h b/lib/mmap.h
new file mode 100644 (file)
index 0000000..0a693f3
--- /dev/null
@@ -0,0 +1,74 @@
+/* mmap replacement for mingw.
+ *
+ * Copyright (C) 2011 by Daniel Gillen <gillen (dot) dan (at) pinguin (dot) lu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ */
+
+#ifndef HIVEX_MMAP_H_
+#define HIVEX_MMAP_H_
+
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include "hivex.h"
+#include "hivex-internal.h"
+
+/* Hack to pass the hive handle to the replacement mmap and munmap
+ * functions. XXX
+ */
+#define mmap(a,b,c,d,e,f) hivex__rpl_mmap(h,(a),(b),(c),(d),(e),(f))
+#define munmap(a,b) hivex__rpl_munmap(h,(a),(b))
+
+// Supported map protections.
+#define PROT_READ   0x1  /* Page can be read.  */
+
+// Supported sharing types (must choose one and only one of these).
+#define MAP_SHARED  0x01 /* Share changes.  */
+
+// Value that is returned when mapping failed
+#define MAP_FAILED  NULL
+
+/*
+ * hivex replacement mmap
+ *
+ * Parameters:
+ *   h                : Hive handle
+ *   void *p_addr     : Preferred starting address for the mapping. Unsupported
+ *                      and must be NULL.
+ *   size_t len       : Mapping length (From offset to offset+len-1).
+ *   int prot         : Flags that control what kind of access is permitted.
+ *                      Must be PROT_READ.
+ *   int flags        : Flags that control the nature of the map. Must be
+ *                      MAP_SHARED.
+ *   int fd           : File descriptor of file to be mapped.
+ *   off_t offset     : Mapping offset.
+ *
+ * Returns:
+ *   Map address on success or MAP_FAILED on error.
+ */
+extern void *hivex__rpl_mmap (hive_h *h, void *p_addr, size_t len, int prot, int flags, int fd, off_t offset);
+
+/*
+ * hivex replacement munmap
+ *
+ * Parameters:
+ *   h               : Hive handle
+ *   void *p_addr    : Startaddress of mapping created with mmap
+ *   size_t len      : Lenght of mapping to be unmapped. Unsupported. The whole
+ *                     mapping will always be unmapped.
+ *
+ * Returns:
+ *   0 on success or -1 on error.
+ */
+extern int hivex__rpl_munmap (hive_h *h, void *p_addr, size_t len);
+
+#endif /* HIVEX_MMAP_H_ */