diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c
index 7d89ec3fbcbaab59d0a0fa88c39c05644a299983..92362a36f5c36aa0c759523a12a19a921ca4f7dd 100644
--- a/libraries/libmdb/mdb.c
+++ b/libraries/libmdb/mdb.c
@@ -3431,10 +3431,17 @@ mdb_env_copy(MDB_env *env, const char *path)
 	ptr = env->me_map + wsize;
 	wsize = txn->mt_next_pgno * env->me_psize - wsize;
 #ifdef _WIN32
-	{
-		DWORD len;
-		rc = WriteFile(newfd, ptr, wsize, &len, NULL);
-		rc = (len == wsize) ? MDB_SUCCESS : ErrCode();
+#define MAX_UINT32	4294967295U
+	while (wsize > 0) {
+		DWORD len, w2;
+		if (wsize > MAX_UINT32)
+			w2 = MAX_UINT32 - env->me_psize + 1;	/* write in pagesize chunks */
+		else
+			w2 = wsize;
+		rc = WriteFile(newfd, ptr, w2, &len, NULL);
+		rc = (len == w2) ? MDB_SUCCESS : ErrCode();
+		if (rc) break;
+		wsize -= w2;
 	}
 #else
 	rc = write(newfd, ptr, wsize);