From d2ba20e8fa67e2be5789adba1ed8ad9d7fcce974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 Feb 2009 19:52:41 +0000 Subject: [PATCH] Take into account environment variables specified by gina DLL svn path=/trunk/; revision=39274 --- reactos/base/system/winlogon/sas.c | 50 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/reactos/base/system/winlogon/sas.c b/reactos/base/system/winlogon/sas.c index 898aa311079..f560187d702 100644 --- a/reactos/base/system/winlogon/sas.c +++ b/reactos/base/system/winlogon/sas.c @@ -170,6 +170,9 @@ HandleLogon( { PROFILEINFOW ProfileInfo; LPVOID lpEnvironment = NULL; + LPWSTR lpFullEnv = NULL; + LPCWSTR wstr; + SIZE_T EnvBlockSize = 0, ProfileSize = 0; BOOLEAN Old; BOOL ret = FALSE; @@ -215,7 +218,48 @@ HandleLogon( WARN("WL: CreateEnvironmentBlock() failed\n"); goto cleanup; } - /* FIXME: Append variables of Session->Profile->pszEnvironment */ + + if (Session->Profile->dwType == WLX_PROFILE_TYPE_V2_0 && Session->Profile->pszEnvironment) + { + /* Count required size for full environment */ + wstr = (LPCWSTR)lpEnvironment; + while (*wstr != UNICODE_NULL) + { + SIZE_T size = wcslen(wstr) + 1; + wstr += size; + EnvBlockSize += size; + } + wstr = Session->Profile->pszEnvironment; + while (*wstr != UNICODE_NULL) + { + SIZE_T size = wcslen(wstr) + 1; + wstr += size; + ProfileSize += size; + } + + /* Allocate enough memory */ + lpFullEnv = HeapAlloc(GetProcessHeap, 0, (EnvBlockSize + ProfileSize + 1) * sizeof(WCHAR)); + if (!lpFullEnv) + { + TRACE("HeapAlloc() failed\n"); + goto cleanup; + } + + /* Fill user environment block */ + CopyMemory( + lpFullEnv, + lpEnvironment, + EnvBlockSize * sizeof(WCHAR)); + CopyMemory( + &lpFullEnv[EnvBlockSize], + Session->Profile->pszEnvironment, + ProfileSize * sizeof(WCHAR)); + lpFullEnv[EnvBlockSize + ProfileSize] = UNICODE_NULL; + } + else + { + lpFullEnv = (LPWSTR)lpEnvironment; + } DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGYOURPERSONALSETTINGS); UpdatePerUserSystemParameters(0, TRUE); @@ -236,7 +280,7 @@ HandleLogon( Session->Gina.Context, L"Default", NULL, /* FIXME */ - lpEnvironment)) + lpFullEnv)) { //WCHAR StatusMsg[256]; WARN("WL: WlxActivateUserShell() failed\n"); @@ -263,6 +307,8 @@ cleanup: { UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile); } + if (lpFullEnv != lpEnvironment) + HeapFree(GetProcessHeap(), 0, lpFullEnv); if (lpEnvironment) DestroyEnvironmentBlock(lpEnvironment); RemoveStatusMessage(Session);