diff --git a/src/configure.in b/src/configure.in
index 90b97deb215186c084d74164318c5239014c4421..b68c937692fe88cd0c0a87299050a5e748aceccc 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -4546,7 +4546,6 @@ AC_CHECK_FUNCS( \
  thread_info \
  host_get_clock_service \
  posix_memalign \
- _dosmaperr \
 )
 
 # SunOS 4 realloc() returns NULL when reallocing NULL.
diff --git a/src/fdlib.c b/src/fdlib.c
index 13625aa2db3c0335c0f0ce18d161f839b4d03fb8..6c79260c7e8f50ebdd0c8bcfc45cb7e1e37f3280 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -99,15 +99,20 @@ static inline void libc_free(void *ptr);
 #define libc_free(PTR)	free(PTR)
 #endif
 
-#if defined(_MSC_VER) && (_MSC_VER < 1600)
-/* _dosmaperr is internal but still exported in the dll interface. */
-__declspec(dllimport) void __cdecl _dosmaperr(unsigned long);
-#else
-/* msvcr100.dll seems to not implement _dosmaperr()... */
+/* Provide and use our own implementation of _dosmaperr(),
+ * as it isn't provided by all CRT runtimes; eg both MinGW
+ * and msvcr100.dll seem to not implement _dosmaperr()...
+ */
 #undef _dosmaperr
 #define _dosmaperr	pike_dosmaperr
 
-/* Mapping of Windows error codes to POSIX error codes. */
+/* Mapping of Windows error codes to POSIX error codes.
+ *
+ * This table was generated by correlating the behavior of
+ * _dosmaperr() with the <WinError.h> and <errno.h> header files.
+ *
+ * Entries not in the table map to EINVAL.
+ */
 static const unsigned long pike_doserrtab[][2] = {
   {  ERROR_INVALID_FUNCTION,		EINVAL,		}, /* 1 */
   {  ERROR_FILE_NOT_FOUND,		ENOENT,		}, /* 2 */
@@ -126,7 +131,22 @@ static const unsigned long pike_doserrtab[][2] = {
   {  ERROR_CURRENT_DIRECTORY,		EACCES,		}, /* 16 */
   {  ERROR_NOT_SAME_DEVICE,		EXDEV,		}, /* 17 */
   {  ERROR_NO_MORE_FILES,		ENOENT,		}, /* 18 */
+  {  ERROR_WRITE_PROTECT,		EACCES,		}, /* 19 */
+  {  ERROR_BAD_UNIT,			EACCES,		}, /* 20 */
+  {  ERROR_NOT_READY,			EACCES,		}, /* 21 */
+  {  ERROR_BAD_COMMAND,			EACCES		}, /* 22 */
+  {  ERROR_CRC,				EACCES		}, /* 23 */
+  {  ERROR_BAD_LENGTH,			EACCES		}, /* 24 */
+  {  ERROR_NOT_DOS_DISK,		EACCES		}, /* 26 */
+  {  ERROR_SECTOR_NOT_FOUND,		EACCES		}, /* 27 */
+  {  ERROR_OUT_OF_PAPER,		EACCES		}, /* 28 */
+  {  ERROR_WRITE_FAULT,			EACCES		}, /* 29 */
+  {  ERROR_READ_FAULT,			EACCES		}, /* 30 */
+  {  ERROR_GEN_FAILURE,			EACCES		}, /* 31 */
+  {  ERROR_SHARING_VIOLATION,		EACCES		}, /* 32 */
   {  ERROR_LOCK_VIOLATION,		EACCES,		}, /* 33 */
+  {  ERROR_WRONG_DISK,			EACCES		}, /* 34 */
+  {  ERROR_SHARING_BUFFER_EXCEEDED,	EACCES		}, /* 36 */
   {  ERROR_BAD_NETPATH,			ENOENT,		}, /* 53 */
   {  ERROR_NETWORK_ACCESS_DENIED,	EACCES,		}, /* 65 */
   {  ERROR_BAD_NET_NAME,		ENOENT,		}, /* 67 */
@@ -151,6 +171,21 @@ static const unsigned long pike_doserrtab[][2] = {
   {  ERROR_MAX_THRDS_REACHED,		EAGAIN,		}, /* 164 */
   {  ERROR_LOCK_FAILED,			EACCES,		}, /* 167 */
   {  ERROR_ALREADY_EXISTS,		EEXIST,		}, /* 183 */
+  {  ERROR_INVALID_STARTING_CODESEG,	ENOEXEC		}, /* 188 */
+  {  ERROR_INVALID_STACKSEG,		ENOEXEC		}, /* 189 */
+  {  ERROR_INVALID_MODULETYPE,		ENOEXEC		}, /* 190 */
+  {  ERROR_INVALID_EXE_SIGNATURE,	ENOEXEC		}, /* 191 */
+  {  ERROR_EXE_MARKED_INVALID,		ENOEXEC		}, /* 192 */
+  {  ERROR_BAD_EXE_FORMAT,		ENOEXEC		}, /* 193 */
+  {  ERROR_ITERATED_DATA_EXCEEDS_64k,	ENOEXEC		}, /* 194 */
+  {  ERROR_INVALID_MINALLOCSIZE,	ENOEXEC		}, /* 195 */
+  {  ERROR_DYNLINK_FROM_INVALID_RING,	ENOEXEC		}, /* 196 */
+  {  ERROR_IOPL_NOT_ENABLED,		ENOEXEC		}, /* 197 */
+  {  ERROR_INVALID_SEGDPL,		ENOEXEC		}, /* 198 */
+  {  ERROR_AUTODATASEG_EXCEEDS_64k,	ENOEXEC		}, /* 199 */
+  {  ERROR_RING2SEG_MUST_BE_MOVABLE,	ENOEXEC		}, /* 200 */
+  {  ERROR_RELOC_CHAIN_XEEDS_SEGLIM,	ENOEXEC		}, /* 201 */
+  {  ERROR_INFLOOP_IN_RELOC_CHAIN,	ENOEXEC		}, /* 202 */
   {  ERROR_FILENAME_EXCED_RANGE,	ENOENT,		}, /* 206 */
   {  ERROR_NESTING_NOT_ALLOWED,		EAGAIN,		}, /* 215 */
   {  ERROR_NOT_ENOUGH_QUOTA,		ENOMEM,		}, /* 1816 */
@@ -178,8 +213,6 @@ static inline void _dosmaperr(unsigned long err)
   errno = EINVAL;
 }
 
-#endif
-
 PMOD_EXPORT void set_errno_from_win32_error (unsigned long err)
 {
   FDDEBUG(fprintf(stderr, "Win32Error: %ld\n", err));
diff --git a/src/port.c b/src/port.c
index bc62b35b15cd90eb4344182a85136bdc0bfb1d76..494e252e69bde66d3a2afc81ea0bcfa87c6d0920 100644
--- a/src/port.c
+++ b/src/port.c
@@ -596,105 +596,3 @@ long long gethrtime()
 #endif	/* OWN_GETHRTIME_RDTSC */
 
 #endif	/* OWN_GETHRTIME */
-
-#ifdef __MINGW32__
-struct errmapping {
-        const int winerr;
-        const int doserr;
-};
-
-/* Auto generated from winerror.h and errno.h using the windows
-   internal function _dosmaperr. */
-
-static const struct errmapping errmap[] = {
-        { ERROR_FILE_NOT_FOUND, ENOENT },
-        { ERROR_PATH_NOT_FOUND, ENOENT },
-        { ERROR_TOO_MANY_OPEN_FILES, EMFILE },
-        { ERROR_ACCESS_DENIED, EACCES },
-        { ERROR_INVALID_HANDLE, EBADF },
-        { ERROR_ARENA_TRASHED, ENOMEM },
-        { ERROR_NOT_ENOUGH_MEMORY, ENOMEM },
-        { ERROR_INVALID_BLOCK, ENOMEM },
-        { ERROR_BAD_ENVIRONMENT, E2BIG },
-        { ERROR_BAD_FORMAT, ENOEXEC },
-        { ERROR_INVALID_DRIVE, ENOENT },
-        { ERROR_CURRENT_DIRECTORY, EACCES },
-        { ERROR_NOT_SAME_DEVICE, EXDEV },
-        { ERROR_NO_MORE_FILES, ENOENT },
-        { ERROR_WRITE_PROTECT, EACCES },
-        { ERROR_BAD_UNIT, EACCES },
-        { ERROR_NOT_READY, EACCES },
-        { ERROR_BAD_COMMAND, EACCES },
-        { ERROR_CRC, EACCES },
-        { ERROR_BAD_LENGTH, EACCES },
-        { ERROR_SEEK, EACCES },
-        { ERROR_NOT_DOS_DISK, EACCES },
-        { ERROR_SECTOR_NOT_FOUND, EACCES },
-        { ERROR_OUT_OF_PAPER, EACCES },
-        { ERROR_WRITE_FAULT, EACCES },
-        { ERROR_READ_FAULT, EACCES },
-        { ERROR_GEN_FAILURE, EACCES },
-        { ERROR_SHARING_VIOLATION, EACCES },
-        { ERROR_LOCK_VIOLATION, EACCES },
-        { ERROR_WRONG_DISK, EACCES },
-        { ERROR_SHARING_BUFFER_EXCEEDED, EACCES },
-        { ERROR_BAD_NETPATH, ENOENT },
-        { ERROR_NETWORK_ACCESS_DENIED, EACCES },
-        { ERROR_BAD_NET_NAME, ENOENT },
-        { ERROR_FILE_EXISTS, EEXIST },
-        { ERROR_CANNOT_MAKE, EACCES },
-        { ERROR_FAIL_I24, EACCES },
-        { ERROR_NO_PROC_SLOTS, EAGAIN },
-        { ERROR_DRIVE_LOCKED, EACCES },
-        { ERROR_BROKEN_PIPE, EPIPE },
-        { ERROR_DISK_FULL, ENOSPC },
-        { ERROR_INVALID_TARGET_HANDLE, EBADF },
-        { ERROR_WAIT_NO_CHILDREN, ECHILD },
-        { ERROR_CHILD_NOT_COMPLETE, ECHILD },
-        { ERROR_DIRECT_ACCESS_HANDLE, EBADF },
-        { ERROR_SEEK_ON_DEVICE, EACCES },
-        { ERROR_DIR_NOT_EMPTY, ENOTEMPTY },
-        { ERROR_NOT_LOCKED, EACCES },
-        { ERROR_BAD_PATHNAME, ENOENT },
-        { ERROR_MAX_THRDS_REACHED, EAGAIN },
-        { ERROR_LOCK_FAILED, EACCES },
-        { ERROR_ALREADY_EXISTS, EEXIST },
-        { ERROR_INVALID_STARTING_CODESEG, ENOEXEC },
-        { ERROR_INVALID_STACKSEG, ENOEXEC },
-        { ERROR_INVALID_MODULETYPE, ENOEXEC },
-        { ERROR_INVALID_EXE_SIGNATURE, ENOEXEC },
-        { ERROR_EXE_MARKED_INVALID, ENOEXEC },
-        { ERROR_BAD_EXE_FORMAT, ENOEXEC },
-        { ERROR_ITERATED_DATA_EXCEEDS_64k, ENOEXEC },
-        { ERROR_INVALID_MINALLOCSIZE, ENOEXEC },
-        { ERROR_DYNLINK_FROM_INVALID_RING, ENOEXEC },
-        { ERROR_IOPL_NOT_ENABLED, ENOEXEC },
-        { ERROR_INVALID_SEGDPL, ENOEXEC },
-        { ERROR_AUTODATASEG_EXCEEDS_64k, ENOEXEC },
-        { ERROR_RING2SEG_MUST_BE_MOVABLE, ENOEXEC },
-        { ERROR_RELOC_CHAIN_XEEDS_SEGLIM, ENOEXEC },
-        { ERROR_INFLOOP_IN_RELOC_CHAIN, ENOEXEC },
-        { ERROR_FILENAME_EXCED_RANGE, ENOENT },
-        { ERROR_NESTING_NOT_ALLOWED, EAGAIN },
-        { ERROR_NOT_ENOUGH_QUOTA, ENOMEM }
-};
-
-void _dosmaperr(int err) {
-  unsigned int i;
-
-  if( err == 0 )
-  {
-    errno = 0;
-    return;
-  }
-
-  for(i=0; i<NELEM(errmap); i++)
-    if( errmap[i].winerr == err)
-    {
-      errno = errmap[i].doserr;
-      return;
-    }
-
-  /* FIXME: Set generic error? */
-}
-#endif
diff --git a/src/port.h b/src/port.h
index b1013024b5c81d938ea05f1a791ec974592b7733..eb7563846c769804384914aa7854f1c29e6eaf2c 100644
--- a/src/port.h
+++ b/src/port.h
@@ -358,12 +358,6 @@ long long gethrtime(void);
 #endif /* DOUBLE_IS_IEEE_LITTLE */
 #endif /* DOUBLE_IS_IEEE_BIG */
 
-#ifdef __MINGW32__
-#ifndef HAVE__DOSMAPERR
-void _dosmaperr(int x);
-#endif
-#endif
-
 #ifdef __clang__
 #define PIKE_CLANG_FEATURE(x)   __has_feature(x)
 #define PIKE_CLANG_BUILTIN(x)   __has_builtin(x)