diff --git a/src/xpdev/strwrap.c b/src/xpdev/strwrap.c
index e3174a36a9d880583e294befae25395111a4ccfa..0af148051139b98307ec335d022ea9d6902f6d94 100644
--- a/src/xpdev/strwrap.c
+++ b/src/xpdev/strwrap.c
@@ -38,5 +38,36 @@ char* ltoa(long val, char* str, int radix)
 	}
 	return(str);
 }
+#endif
+
+#ifdef _WIN32
+/* From FreeBSD */
+size_t
+strnlen(const char *s, size_t maxlen)
+{
+	size_t len;
+
+	for (len = 0; len < maxlen; len++, s++) {
+		if (!*s)
+			break;
+	}
+	return (len);
+}
+
+/* From FreeBSD */
+char *
+strndup(const char *str, size_t maxlen)
+{
+	char *copy;
+	size_t len;
 
+	len = strnlen(str, maxlen);
+	copy = malloc(len + 1);
+	if (copy != NULL) {
+		(void)memcpy(copy, str, len);
+		copy[len] = '\0';
+	}
+
+	return copy;
+}
 #endif
diff --git a/src/xpdev/strwrap.h b/src/xpdev/strwrap.h
index 1f8a181d14dac24a49c510f1e51577484e260fdf..f30d54e450e68bd45cae618ca9b2cf22e2b2610f 100644
--- a/src/xpdev/strwrap.h
+++ b/src/xpdev/strwrap.h
@@ -18,4 +18,17 @@ char* ltoa(long val, char* str, int radix);
 
 #endif
 
+#ifdef _MSVC
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+char *strndup(const char *str, size_t maxlen);
+size_t strnlen(const char *s, size_t maxlen);
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
+
 #endif