Further compile fixes.
diff --git a/lib/zip_source_file.h b/lib/zip_source_file.h
index 31edd4a..43a4645 100644
--- a/lib/zip_source_file.h
+++ b/lib/zip_source_file.h
@@ -82,7 +82,7 @@
     void (*rollback_write)(zip_source_file_context_t *ctx);
     bool (*seek)(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, int whence);
     bool (*stat)(zip_source_file_context_t *ctx, zip_source_file_stat_t *st);
-    char *(*string_duplicate)(const char *);
+    char *(*string_duplicate)(zip_source_file_context_t *ctx, const char *);
     zip_int64_t (*tell)(zip_source_file_context_t *ctx, void *f);
     zip_int64_t (*write)(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len);
 };
diff --git a/lib/zip_source_file_stdio_write.c b/lib/zip_source_file_stdio_write.c
index 704dcb2..30054c4 100644
--- a/lib/zip_source_file_stdio_write.c
+++ b/lib/zip_source_file_stdio_write.c
@@ -58,6 +58,7 @@
 static bool _zip_stdio_op_open(zip_source_file_context_t *ctx);
 static zip_int64_t _zip_stdio_op_remove(zip_source_file_context_t *ctx);
 static void _zip_stdio_op_rollback_write(zip_source_file_context_t *ctx);
+static char *_zip_stdio_op_strdup(zip_source_file_context_t *ctx, const char *string);
 static zip_int64_t _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len);
 
 /* clang-format off */
@@ -76,7 +77,7 @@
     _zip_stdio_op_rollback_write,
     _zip_stdio_op_seek,
     _zip_stdio_op_stat,
-    strdup,
+    _zip_stdio_op_strdup,
     _zip_stdio_op_tell,
     _zip_stdio_op_write
 };
@@ -287,6 +288,12 @@
     (void)remove(ctx->tmpname);
 }
 
+static char *
+_zip_stdio_op_strdup(zip_source_file_context_t *ctx, const char *string) {
+    return strdup(string);
+}
+
+
 static zip_int64_t
 _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len) {
     size_t ret;
diff --git a/lib/zip_source_file_win32.h b/lib/zip_source_file_win32.h
index da0ccd7..c844bf3 100644
--- a/lib/zip_source_file_win32.h
+++ b/lib/zip_source_file_win32.h
@@ -48,12 +48,12 @@
 #include "zip_source_file.h"
 
 struct zip_source_file_win32_write_operations {
-    char *(*allocate_tempname)(const char *name, size_t extra_chars);
+    char *(*allocate_tempname)(const char *name, size_t extra_chars, size_t *lengthp);
     HANDLE (*create_file)(const char *name, DWORD access, DWORD share_mode, PSECURITY_ATTRIBUTES security_attributes, DWORD creation_disposition, DWORD file_attributes, HANDLE template_file);
     bool (*delete_file)(const char *name);
     DWORD (*get_file_attributes)(const char *name);
     void (*make_tempname)(char *buf, size_t len, const char *name, int i);
-    bool (*move_file)(const char *from, const char *to, DWORD flags);
+    bool (*move_file)(const char *from, const char *to);
     bool (*set_file_attributes)(const char *name, DWORD attributes);
     char *(*string_duplicate)(const char *string);
 };
diff --git a/lib/zip_source_file_win32_ansi.c b/lib/zip_source_file_win32_ansi.c
index 55b3f93..74cb594 100644
--- a/lib/zip_source_file_win32_ansi.c
+++ b/lib/zip_source_file_win32_ansi.c
@@ -33,7 +33,7 @@
 
 #include "zip_source_file_win32.h"
 
-static char *ansi_allocate_tempname(const char *name, size_t extra_chars);
+static char *ansi_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp);
 static void ansi_make_tempname(char *buf, size_t len, const char *name, int i);
 
 zip_source_file_win32_write_operations_t ops_ansi = {
@@ -42,7 +42,7 @@
     DeleteFileA,
     GetFileAttributesA,
     ansi_make_tempname,
-    MoveFileA,
+    MoveFileExA,
     SetFileAttributesA,
     strdup
 };
@@ -68,8 +68,9 @@
 
 
 static char *
-ansi_allocate_tempname(const char *name, size_t extra_chars) {
-    return (char *)malloc(strlen(name) + extra_chars);
+ansi_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp) {
+    *lengthp = strlen(name) + extra_chars;
+    return (char *)malloc(*lengthp);
 }
 
 
diff --git a/lib/zip_source_file_win32_utf16.c b/lib/zip_source_file_win32_utf16.c
index 7327f9f..7b57970 100644
--- a/lib/zip_source_file_win32_utf16.c
+++ b/lib/zip_source_file_win32_utf16.c
@@ -33,7 +33,7 @@
 
 #include "zip_source_file_win32.h"
 
-static char *utf16_allocate_tempname(const char *name, size_t extra_chars);
+static char *utf16_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp);
 static HANDLE utf16_create_file(const char *name, DWORD access, DWORD share_mode, PSECURITY_ATTRIBUTES security_attributes, DWORD creation_disposition, DWORD file_attributes, HANDLE template_file);
 static bool utf16_delete_file(const char *name);
 static DWORD utf16_get_file_attributes(const char *name);
@@ -74,8 +74,9 @@
 
 
 static char *
-utf16_allocate_tempname(const char *name, size_t extra_chars) {
-    return (char *)malloc((wcslen((const wchar_t *)name) + extra_chars) * sizeof(wchar_t));
+utf16_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp) {
+    *lengthp = wcslen((const wchar_t *)name) + extra_chars;
+    return (char *)malloc(*lengthp * sizeof(wchar_t));
 }
 
 
@@ -116,7 +117,7 @@
 
 static
 bool utf16_move_file(const char *from, const char *to, DWORD flags) {
-    return MoveFileW((const wchar_t *)from, (const wchar_t *)to, flags);
+    return MoveFileExW((const wchar_t *)from, (const wchar_t *)to, flags);
 }
 
 
diff --git a/lib/zip_source_file_win32_write.c b/lib/zip_source_file_win32_write.c
index 1d37239..5de6ed4 100644
--- a/lib/zip_source_file_win32_write.c
+++ b/lib/zip_source_file_win32_write.c
@@ -43,7 +43,7 @@
 static char *_zip_win32_write_strdup(const char *string);
 
 static HANDLE win32_write_open(zip_source_file_context_t *ctx, const char *name, bool temporary, PSECURITY_ATTRIBUTES security_attributes);

+
 /* clang-format off */
 zip_source_file_operations_t zip_source_file_win32_write_operations = {
     _zip_win32_op_close,
@@ -204,7 +204,7 @@
 
 
 static char *
-_zip_win32_write_strdup(const char *string) {
+_zip_win32_write_strdup(zip_source_file_context_t *ctx, const char *string) {
     zip_source_file_win32_write_operations_t *write_ops = (zip_source_file_win32_write_operations_t *)ctx->ops_userdata;
 
     return write_ops->string_duplicate(string);