From 622a343e9fce887b020ec33fedd4679634070172 Mon Sep 17 00:00:00 2001
From: Jon Griffiths <jon_p_griffiths@yahoo.com>
Date: Fri, 18 Jul 2003 22:54:47 +0000
Subject: [PATCH] Implement __p__wpgmptr, _wpgmptr. Avoid using static storage
 for pgm pointers.

---
 dlls/msvcrt/data.c      | 27 +++++++++++++++++++--------
 dlls/msvcrt/msvcrt.spec |  4 ++--
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c
index aaeb4fd4e1e..36b75a5faf4 100644
--- a/dlls/msvcrt/data.c
+++ b/dlls/msvcrt/data.c
@@ -62,8 +62,8 @@ char **MSVCRT___initenv = 0;
 MSVCRT_wchar_t **MSVCRT___winitenv = 0;
 int MSVCRT_timezone;
 int MSVCRT_app_type;
-char MSVCRT_pgm[MAX_PATH];
 char* MSVCRT__pgmptr = 0;
+WCHAR* MSVCRT__wpgmptr = 0;
 
 /* Get a snapshot of the current environment
  * and construct the __p__environ array
@@ -155,6 +155,11 @@ unsigned int* __p__commode(void) { return &MSVCRT__commode; }
  */
 char** __p__pgmptr(void) { return &MSVCRT__pgmptr; }
 
+/***********************************************************************
+ *              __p__wpgmptr (MSVCRT.@)
+ */
+WCHAR** __p__wpgmptr(void) { return &MSVCRT__wpgmptr; }
+
 /***********************************************************************
  *		__p__fmode (MSVCRT.@)
  */
@@ -284,9 +289,13 @@ void msvcrt_init_args(void)
   MSVCRT___initenv= msvcrt_SnapshotOfEnvironmentA(NULL);
   MSVCRT___winitenv= msvcrt_SnapshotOfEnvironmentW(NULL);
 
-  MSVCRT_pgm[0] = '\0';
-  GetModuleFileNameA(0, MSVCRT_pgm, sizeof(MSVCRT_pgm)/sizeof(MSVCRT_pgm[0]));
-  MSVCRT__pgmptr = MSVCRT_pgm;
+  MSVCRT__pgmptr = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
+  if (MSVCRT__pgmptr)
+    GetModuleFileNameA(0, MSVCRT__pgmptr, MAX_PATH);
+
+  MSVCRT__wpgmptr = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
+  if (MSVCRT__wpgmptr)
+    GetModuleFileNameW(0, MSVCRT__wpgmptr, MAX_PATH);
 }
 
 
@@ -294,10 +303,12 @@ void msvcrt_init_args(void)
 void msvcrt_free_args(void)
 {
   /* FIXME: more things to free */
-  if (MSVCRT___initenv) HeapFree(GetProcessHeap(), 0,MSVCRT___initenv);
-  if (MSVCRT___winitenv) HeapFree(GetProcessHeap(), 0,MSVCRT___winitenv);
-  if (MSVCRT__environ) HeapFree(GetProcessHeap(), 0,MSVCRT__environ);
-  if (MSVCRT__wenviron) HeapFree(GetProcessHeap(), 0,MSVCRT__wenviron);
+  if (MSVCRT___initenv) HeapFree(GetProcessHeap(), 0, MSVCRT___initenv);
+  if (MSVCRT___winitenv) HeapFree(GetProcessHeap(), 0, MSVCRT___winitenv);
+  if (MSVCRT__environ) HeapFree(GetProcessHeap(), 0, MSVCRT__environ);
+  if (MSVCRT__wenviron) HeapFree(GetProcessHeap(), 0, MSVCRT__wenviron);
+  if (MSVCRT__pgmptr) HeapFree(GetProcessHeap(), 0, MSVCRT__pgmptr);
+  if (MSVCRT__wpgmptr) HeapFree(GetProcessHeap(), 0, MSVCRT__wpgmptr);
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 1d350d59091..cf4ed4511b1 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -128,7 +128,7 @@
 @ cdecl __p__winmajor()
 @ cdecl __p__winminor()
 @ cdecl __p__winver()
-@ stub __p__wpgmptr #()
+@ cdecl __p__wpgmptr()
 @ stub __pioinfo #()
 @ stub __pxcptinfoptrs #()
 @ cdecl __set_app_type(long) MSVCRT___set_app_type
@@ -533,7 +533,7 @@
 @ cdecl _wmktemp(wstr)
 @ varargs _wopen(wstr long)
 @ stub _wperror #(wstr)
-@ stub _wpgmptr # extern
+@ extern _wpgmptr MSVCRT__wpgmptr
 @ stub _wpopen #(wstr wstr)
 @ cdecl _wputenv(wstr)
 @ cdecl _wremove(wstr)
-- 
GitLab