diff --git a/reactos/dll/win32/msvcrt/dllmain.c b/reactos/dll/win32/msvcrt/dllmain.c
index 99822fc46a7..95efb2bbb96 100644
--- a/reactos/dll/win32/msvcrt/dllmain.c
+++ b/reactos/dll/win32/msvcrt/dllmain.c
@@ -35,6 +35,7 @@ extern int BlockEnvToEnvironW(void);
extern void FreeEnvironment(char **environment);
extern void _atexit_cleanup(void);
+extern unsigned int _osplatform;
extern unsigned int _osver;
extern unsigned int _winminor;
extern unsigned int _winmajor;
@@ -72,6 +73,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved)
_winver = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
_winmajor = osvi.dwMajorVersion;
_winminor = osvi.dwMinorVersion;
+ _osplatform = osvi.dwPlatformId;
_osver = osvi.dwBuildNumber;
hHeap = HeapCreate(0, 100000, 0);
if (hHeap == NULL)
diff --git a/reactos/dll/win32/msvcrt/msvcrt.spec b/reactos/dll/win32/msvcrt/msvcrt.spec
index 3ccd0390796..c0328e1b98b 100644
--- a/reactos/dll/win32/msvcrt/msvcrt.spec
+++ b/reactos/dll/win32/msvcrt/msvcrt.spec
@@ -597,7 +597,7 @@
@ cdecl _ltow(long ptr long)
# stub _ltow_s
@ cdecl _makepath(ptr str str str str)
-# stub _makepath_s
+@ cdecl _makepath_s(ptr long str str str str)
# stub _malloc_dbg
@ cdecl _matherr(ptr)
@ cdecl _mbbtombc(long)
@@ -756,7 +756,7 @@
@ cdecl _onexit(ptr)
@ varargs _open(str long)
@ cdecl _open_osfhandle(long long)
-# stub _osplatform
+@ extern _osplatform _osplatform
@ extern _osver _osver
@ stub _outp #(long long)
@ stub _outpd #(long long)
@@ -1086,7 +1086,7 @@
# stub _winput_s
@ extern _winver
@ cdecl _wmakepath(wstr wstr wstr wstr wstr)
-# stub _wmakepath_s
+@ cdecl _wmakepath_s(ptr long wstr wstr wstr wstr)
@ cdecl _wmkdir(wstr)
@ cdecl _wmktemp(wstr)
# stub _wmktemp_s
diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild
index 7b4bc6fdc72..9821329f510 100644
--- a/reactos/lib/sdk/crt/crt.rbuild
+++ b/reactos/lib/sdk/crt/crt.rbuild
@@ -329,6 +329,7 @@
gcvt.c
getenv.c
makepath.c
+ makepath_s.c
mbtowc.c
mbstowcs.c
obsol.c
@@ -341,6 +342,7 @@
wputenv.c
wsenv.c
wmakpath.c
+ wmakpath_s.c
diff --git a/reactos/lib/sdk/crt/misc/environ.c b/reactos/lib/sdk/crt/misc/environ.c
index 845721c5cc8..3018d1cc340 100644
--- a/reactos/lib/sdk/crt/misc/environ.c
+++ b/reactos/lib/sdk/crt/misc/environ.c
@@ -11,6 +11,7 @@
#include
+unsigned int _osplatform = 0;
unsigned int _osver = 0;
unsigned int _winminor = 0;
unsigned int _winmajor = 0;
diff --git a/reactos/lib/sdk/crt/stdlib/makepath_s.c b/reactos/lib/sdk/crt/stdlib/makepath_s.c
new file mode 100644
index 00000000000..b96f1f6c178
--- /dev/null
+++ b/reactos/lib/sdk/crt/stdlib/makepath_s.c
@@ -0,0 +1,120 @@
+/*
+ * PROJECT: ReactOS CRT library
+ * LICENSE: See COPYING in the top level directory
+ * FILE: lib/sdk/crt/stdlib/makepath_s.c
+ * PURPOSE: Creates a path
+ * PROGRAMMERS: Wine team
+ * Copyright 1996,1998 Marcus Meissner
+ * Copyright 1996 Jukka Iivonen
+ * Copyright 1997,2000 Uwe Bonnes
+ * Copyright 2000 Jon Griffiths
+ *
+ */
+
+#include
+#include
+#include
+
+/*********************************************************************
+ * _makepath_s (MSVCRT.@)
+ *
+ * Safe version of _makepath.
+ */
+int CDECL _makepath_s(char *path, size_t size, const char *drive,
+ const char *directory, const char *filename,
+ const char *extension)
+{
+ char *p = path;
+
+ if (!path || !size)
+ {
+ *_errno() = EINVAL;
+ return EINVAL;
+ }
+
+ if (drive && drive[0])
+ {
+ if (size <= 2)
+ goto range;
+
+ *p++ = drive[0];
+ *p++ = ':';
+ size -= 2;
+ }
+
+ if (directory && directory[0])
+ {
+ unsigned int len = strlen(directory);
+ unsigned int needs_separator = directory[len - 1] != '/' && directory[len - 1] != '\\';
+ unsigned int copylen = min(size - 1, len);
+
+ if (size < 2)
+ goto range;
+
+ memmove(p, directory, copylen);
+
+ if (size <= len)
+ goto range;
+
+ p += copylen;
+ size -= copylen;
+
+ if (needs_separator)
+ {
+ if (size < 2)
+ goto range;
+
+ *p++ = '\\';
+ size -= 1;
+ }
+ }
+
+ if (filename && filename[0])
+ {
+ unsigned int len = strlen(filename);
+ unsigned int copylen = min(size - 1, len);
+
+ if (size < 2)
+ goto range;
+
+ memmove(p, filename, copylen);
+
+ if (size <= len)
+ goto range;
+
+ p += len;
+ size -= len;
+ }
+
+ if (extension && extension[0])
+ {
+ unsigned int len = strlen(extension);
+ unsigned int needs_period = extension[0] != '.';
+ unsigned int copylen;
+
+ if (size < 2)
+ goto range;
+
+ if (needs_period)
+ {
+ *p++ = '.';
+ size -= 1;
+ }
+
+ copylen = min(size - 1, len);
+ memcpy(p, extension, copylen);
+
+ if (size <= len)
+ goto range;
+
+ p += copylen;
+ }
+
+ *p = '\0';
+ return 0;
+
+range:
+ path[0] = '\0';
+ *_errno() = ERANGE;
+ return ERANGE;
+}
diff --git a/reactos/lib/sdk/crt/stdlib/wmakpath_s.c b/reactos/lib/sdk/crt/stdlib/wmakpath_s.c
new file mode 100644
index 00000000000..581a0e2a22c
--- /dev/null
+++ b/reactos/lib/sdk/crt/stdlib/wmakpath_s.c
@@ -0,0 +1,121 @@
+/*
+ * PROJECT: ReactOS CRT library
+ * LICENSE: See COPYING in the top level directory
+ * FILE: lib/sdk/crt/stdlib/wmakpath_s.c
+ * PURPOSE: Creates a path
+ * PROGRAMMERS: Wine team
+ * Copyright 1996,1998 Marcus Meissner
+ * Copyright 1996 Jukka Iivonen
+ * Copyright 1997,2000 Uwe Bonnes
+ * Copyright 2000 Jon Griffiths
+ *
+ */
+
+#include
+#include
+#include
+
+/*********************************************************************
+ * _wmakepath_s (MSVCRT.@)
+ *
+ * Safe version of _wmakepath.
+ */
+int CDECL _wmakepath_s(wchar_t *path, size_t size, const wchar_t *drive,
+ const wchar_t *directory, const wchar_t *filename,
+ const wchar_t *extension)
+{
+ wchar_t *p = path;
+
+ if (!path || !size)
+ {
+ *_errno() = EINVAL;
+ return EINVAL;
+ }
+
+ if (drive && drive[0])
+ {
+ if (size <= 2)
+ goto range;
+
+ *p++ = drive[0];
+ *p++ = ':';
+ size -= 2;
+ }
+
+ if (directory && directory[0])
+ {
+ unsigned int len = strlenW(directory);
+ unsigned int needs_separator = directory[len - 1] != '/' && directory[len - 1] != '\\';
+ unsigned int copylen = min(size - 1, len);
+
+ if (size < 2)
+ goto range;
+
+ memmove(p, directory, copylen * sizeof(wchar_t));
+
+ if (size <= len)
+ goto range;
+
+ p += copylen;
+ size -= copylen;
+
+ if (needs_separator)
+ {
+ if (size < 2)
+ goto range;
+
+ *p++ = '\\';
+ size -= 1;
+ }
+ }
+
+ if (filename && filename[0])
+ {
+ unsigned int len = strlenW(filename);
+ unsigned int copylen = min(size - 1, len);
+
+ if (size < 2)
+ goto range;
+
+ memmove(p, filename, copylen * sizeof(wchar_t));
+
+ if (size <= len)
+ goto range;
+
+ p += len;
+ size -= len;
+ }
+
+ if (extension && extension[0])
+ {
+ unsigned int len = strlenW(extension);
+ unsigned int needs_period = extension[0] != '.';
+ unsigned int copylen;
+
+ if (size < 2)
+ goto range;
+
+ if (needs_period)
+ {
+ *p++ = '.';
+ size -= 1;
+ }
+
+ copylen = min(size - 1, len);
+ memcpy(p, extension, copylen * sizeof(wchar_t));
+
+ if (size <= len)
+ goto range;
+
+ p += copylen;
+ }
+
+ *p = '\0';
+ return 0;
+
+range:
+ path[0] = '\0';
+ *_errno() = ERANGE;
+ return ERANGE;
+}
+