X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=base%2Fsystem%2Fwinlogon%2Fsas.c;h=f560187d70246a99864dcc91fe1a192ce9bcba01;hp=750b01fef94374566fbd4ed953000030d810eb23;hb=350dfd1b9d7624fe316eaaca67a35958d1eafc82;hpb=c0fa485960859ce910f79f4994b7cc2719982c29 diff --git a/base/system/winlogon/sas.c b/base/system/winlogon/sas.c index 750b01fef94..f560187d702 100644 --- a/base/system/winlogon/sas.c +++ b/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); @@ -505,7 +551,7 @@ HandleLogoff( return STATUS_SUCCESS; } -static BOOL CALLBACK +static INT_PTR CALLBACK ShutdownComputerWindowProc( IN HWND hwndDlg, IN UINT uMsg,