#include <config.h>
#include "lisp.h"
+
#include "dump-id.h"
#include "specifier.h"
#include "alloc.h"
#include "console-stream.h"
#include "dumper.h"
+#ifdef WIN32_NATIVE
+#include "nt.h"
+#else
#ifdef HAVE_MMAP
#include <sys/mman.h>
#endif
+#endif
#ifndef SEPCHAR
#define SEPCHAR ':'
char *pdump_start, *pdump_end;
static size_t pdump_length;
+
+#ifdef WIN32_NATIVE
+// Handle for the dump file
+HANDLE pdump_hFile = INVALID_HANDLE_VALUE;
+// Handle for the file mapping object for the dump file
+HANDLE pdump_hMap = INVALID_HANDLE_VALUE;
+#endif
+
void (*pdump_free) (void);
static const unsigned char align_table[256] =
return 1;
}
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
+/* Free the mapped file if we decide we don't want it after all */
static void pdump_file_unmap(void)
{
+ UnmapViewOfFile (pdump_start);
+ CloseHandle (pdump_hFile);
+ CloseHandle (pdump_hMap);
}
static int pdump_file_get(const char *path)
{
- HANDLE hFile;
- HANDLE hMap;
-
- hFile = CreateFile (path,
- GENERIC_READ + GENERIC_WRITE, /* Required for copy on write */
- 0, /* Not shared */
- NULL, /* Not inheritable */
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL); /* No template file */
- if (hFile == INVALID_HANDLE_VALUE)
+
+ pdump_hFile = CreateFile (path,
+ GENERIC_READ + GENERIC_WRITE, /* Required for copy on write */
+ 0, /* Not shared */
+ NULL, /* Not inheritable */
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL); /* No template file */
+ if (pdump_hFile == INVALID_HANDLE_VALUE)
return 0;
- pdump_length = GetFileSize (hFile, NULL);
- hMap = CreateFileMapping (hFile,
- NULL, /* No security attributes */
- PAGE_WRITECOPY, /* Copy on write */
- 0, /* Max size, high half */
- 0, /* Max size, low half */
- NULL); /* Unnamed */
- if (hMap == INVALID_HANDLE_VALUE)
+ pdump_length = GetFileSize (pdump_hFile, NULL);
+ pdump_hMap = CreateFileMapping (pdump_hFile,
+ NULL, /* No security attributes */
+ PAGE_WRITECOPY, /* Copy on write */
+ 0, /* Max size, high half */
+ 0, /* Max size, low half */
+ NULL); /* Unnamed */
+ if (pdump_hMap == INVALID_HANDLE_VALUE)
return 0;
- pdump_start = MapViewOfFile (hMap,
+ pdump_start = MapViewOfFile (pdump_hMap,
FILE_MAP_COPY, /* Copy on write */
0, /* Start at zero */
0,
return 1;
}
+/* pdump_resource_free is called (via the pdump_free pointer) to release
+ any resources allocated by pdump_resource_get. Since the Windows API
+ specs specifically state that you don't need to (and shouldn't) free the
+ resources allocated by FindResource, LoadResource, and LockResource this
+ routine does nothing. */
static void pdump_resource_free (void)
+{
+}
+
static int pdump_resource_get (void)
{
HRSRC hRes; /* Handle to dump resource */
return 1;
}
-#else /* !WINDOWSNT */
+#else /* !WIN32_NATIVE */
static void *pdump_mallocadr;
close (pdump_fd);
return 1;
}
-#endif /* !WINDOWSNT */
+#endif /* !WIN32_NATIVE */
static int pdump_file_try(char *exe_path)
int pdump_load(const char *argv0)
{
char exe_path[PATH_MAX];
+#ifdef WIN32_NATIVE
+ GetModuleFileName (NULL, exe_path, PATH_MAX);
+#else /* !WIN32_NATIVE */
char *w;
-#ifdef WINDOWSNT
- GetModuleFileName (NULL, exe_name, PATH_MAX);
-#else /* !WINDOWSNT */
const char *dir, *p;
dir = argv0;
path = p+1;
}
}
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
if (pdump_file_try (exe_path))
{
return 1;
}
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
if (pdump_resource_get ())
{
if (pdump_load_check ())