diff --git a/dlls/kernel32/environ.c b/dlls/kernel32/environ.c index 99bf706e95e..0fa7596f04a 100644 --- a/dlls/kernel32/environ.c +++ b/dlls/kernel32/environ.c @@ -139,7 +139,21 @@ LPSTR WINAPI GetEnvironmentStringsA(void) */ LPWSTR WINAPI GetEnvironmentStringsW(void) { - return NtCurrentTeb()->Peb->ProcessParameters->Environment; + LPWSTR ret, ptrW; + unsigned len; + + RtlAcquirePebLock(); + + ptrW = NtCurrentTeb()->Peb->ProcessParameters->Environment; + while (*ptrW) ptrW += strlenW(ptrW) + 1; + ptrW++; + + len = (ptrW - NtCurrentTeb()->Peb->ProcessParameters->Environment) * sizeof(WCHAR); + ret = HeapAlloc(GetProcessHeap(), 0, len); + if (ret) memcpy(ret, NtCurrentTeb()->Peb->ProcessParameters->Environment, len); + + RtlReleasePebLock(); + return ret; } @@ -157,7 +171,7 @@ BOOL WINAPI FreeEnvironmentStringsA( LPSTR ptr ) */ BOOL WINAPI FreeEnvironmentStringsW( LPWSTR ptr ) { - return TRUE; + return HeapFree( GetProcessHeap(), 0, ptr ); } diff --git a/dlls/kernel32/tests/environ.c b/dlls/kernel32/tests/environ.c index f8452be2ee6..4249ea7ebea 100644 --- a/dlls/kernel32/tests/environ.c +++ b/dlls/kernel32/tests/environ.c @@ -554,6 +554,20 @@ static void test_GetComputerNameExW(void) HeapFree(GetProcessHeap(), 0, nameW); } +static void test_GetEnvironmentStringsW(void) +{ + PWCHAR env1; + PWCHAR env2; + + env1 = GetEnvironmentStringsW(); + env2 = GetEnvironmentStringsW(); + ok(env1 != env2 || + broken(env1 == env2), /* NT <= 5.1 */ + "should return different copies\n"); + FreeEnvironmentStringsW(env1); + FreeEnvironmentStringsW(env2); +} + START_TEST(environ) { init_functionpointers(); @@ -565,4 +579,5 @@ START_TEST(environ) test_GetComputerName(); test_GetComputerNameExA(); test_GetComputerNameExW(); + test_GetEnvironmentStringsW(); }