diff --git a/mongoose.c b/mongoose.c
index f8fa05ea3cd7f8336e117d4bde3ef0afc79091a4..3b2259fd14906ef48d07793aa56db21a9493da06 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -5141,3 +5141,28 @@ struct mg_server *mg_create_server(void *server_data, mg_handler_t handler) {
   server->event_handler = handler;
   return server;
 }
+
+#ifdef _WIN32
+static void *mmap(void *addr, int64_t len, int prot, int flags, int fd,
+                  int offset) {
+  HANDLE fh = (HANDLE) _get_osfhandle(fd);
+  HANDLE mh = CreateFileMapping(fh, 0, PAGE_READONLY, 0, 0, 0);
+  void *p = MapViewOfFile(mh, FILE_MAP_READ, 0, 0, (size_t) len);
+  CloseHandle(mh);
+  return p;
+}
+#define munmap(x, y)  UnmapViewOfFile(x)
+#define MAP_FAILED NULL
+#define MAP_PRIVATE 0
+#define PROT_READ 0
+#else
+#include <sys/mman.h>
+#endif
+
+void *mg_mmap(FILE *fp, size_t size) {
+  return mmap(NULL, size, PROT_READ, MAP_PRIVATE, fileno(fp), 0);
+}
+
+void mg_munmap(void *p, size_t size) {
+  munmap(p, size);
+}
diff --git a/mongoose.h b/mongoose.h
index 8361cce05ca8073fcc34542829f6bc644eb6f5c9..d39808ee1dd218d0232c96c89bb878824161ba16 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -135,6 +135,8 @@ int mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len);
 int mg_url_decode(const char *src, int src_len, char *dst, int dst_len, int);
 int mg_terminate_ssl(struct mg_connection *c, const char *cert);
 int mg_forward(struct mg_connection *, const char *host, int port, int use_ssl);
+void *mg_mmap(FILE *fp, size_t size);
+void mg_munmap(void *p, size_t size);
 
 
 // Templates support