[CMAKE]
[reactos.git] / base / system / winlogon / sas.c
index f560187..11035c1 100644 (file)
@@ -25,8 +25,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
 #define HK_CTRL_ALT_DEL   0
 #define HK_CTRL_SHIFT_ESC 1
 
-extern BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
-
 /* FUNCTIONS ****************************************************************/
 
 static BOOL
@@ -57,6 +55,37 @@ StartTaskManager(
        return ret;
 }
 
+static BOOL
+StartUserShell(
+       IN OUT PWLSESSION Session)
+{
+       LPVOID lpEnvironment = NULL;
+       BOOLEAN Old;
+       BOOL ret;
+
+       /* Create environment block for the user */
+       if (!CreateEnvironmentBlock(&lpEnvironment, Session->UserToken, TRUE))
+       {
+               WARN("WL: CreateEnvironmentBlock() failed\n");
+               return FALSE;
+       }
+
+       /* Get privilege */
+       /* FIXME: who should do it? winlogon or gina? */
+       /* FIXME: reverting to lower privileges after creating user shell? */
+       RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old);
+
+       ret = Session->Gina.Functions.WlxActivateUserShell(
+                               Session->Gina.Context,
+                               L"Default",
+                               NULL, /* FIXME */
+                               lpEnvironment);
+
+       DestroyEnvironmentBlock(lpEnvironment);
+       return ret;
+}
+
+
 BOOL
 SetDefaultLanguage(
        IN BOOL UserProfile)
@@ -169,11 +198,6 @@ HandleLogon(
        IN OUT PWLSESSION Session)
 {
        PROFILEINFOW ProfileInfo;
-       LPVOID lpEnvironment = NULL;
-       LPWSTR lpFullEnv = NULL;
-       LPCWSTR wstr;
-       SIZE_T EnvBlockSize = 0, ProfileSize = 0;
-       BOOLEAN Old;
        BOOL ret = FALSE;
 
        /* Loading personal settings */
@@ -210,57 +234,12 @@ HandleLogon(
        }
 
        /* Create environment block for the user */
-       if (!CreateEnvironmentBlock(
-               &lpEnvironment,
-               Session->UserToken,
-               TRUE))
+       if (!CreateUserEnvironment(Session))
        {
-               WARN("WL: CreateEnvironmentBlock() failed\n");
+               WARN("WL: SetUserEnvironment() failed\n");
                goto cleanup;
        }
 
-       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);
 
@@ -271,16 +250,7 @@ HandleLogon(
                goto cleanup;
        }
 
-       /* Get privilege */
-       /* FIXME: who should do it? winlogon or gina? */
-       /* FIXME: reverting to lower privileges after creating user shell? */
-       RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old);
-
-       if (!Session->Gina.Functions.WlxActivateUserShell(
-               Session->Gina.Context,
-               L"Default",
-               NULL, /* FIXME */
-               lpFullEnv))
+       if (!StartUserShell(Session))
        {
                //WCHAR StatusMsg[256];
                WARN("WL: WlxActivateUserShell() failed\n");
@@ -307,10 +277,6 @@ cleanup:
        {
                UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile);
        }
-       if (lpFullEnv != lpEnvironment)
-               HeapFree(GetProcessHeap(), 0, lpFullEnv);
-       if (lpEnvironment)
-               DestroyEnvironmentBlock(lpEnvironment);
        RemoveStatusMessage(Session);
        if (!ret)
        {
@@ -886,6 +852,40 @@ CheckForShutdownPrivilege(
        return STATUS_SUCCESS;
 }
 
+BOOL
+WINAPI
+HandleMessageBeep(UINT uType)
+{
+       LPWSTR EventName;
+
+       switch(uType)
+       {
+       case 0xFFFFFFFF:
+               EventName = NULL;
+               break;
+       case MB_OK:
+               EventName = L"SystemDefault";
+               break;
+       case MB_ICONASTERISK:
+               EventName = L"SystemAsterisk";
+               break;
+       case MB_ICONEXCLAMATION:
+               EventName = L"SystemExclamation";
+               break;
+       case MB_ICONHAND:
+               EventName = L"SystemHand";
+               break;
+       case MB_ICONQUESTION:
+               EventName = L"SystemQuestion";
+               break;
+       default:
+               WARN("Unhandled type %d\n", uType);
+               EventName = L"SystemDefault";
+       }
+
+       return PlaySoundRoutine(EventName, FALSE, SND_ALIAS | SND_NOWAIT | SND_NOSTOP | SND_ASYNC);
+}
+
 static LRESULT CALLBACK
 SASWindowProc(
        IN HWND hwndDlg,
@@ -945,6 +945,39 @@ SASWindowProc(
                        }
                        return TRUE;
                }
+        case WM_LOGONNOTIFY:
+        {
+            switch(wParam)
+            {
+                case LN_MESSAGE_BEEP:
+                {
+                    return HandleMessageBeep(lParam);
+                }
+                case LN_SHELL_EXITED:
+                {
+                    /* lParam is the exit code */
+                    if(lParam != 1)
+                    {
+                        SetTimer(hwndDlg, 1, 1000, NULL);
+                    }
+                    break;
+                }
+                default:
+                {
+                    ERR("WM_LOGONNOTIFY case %d is unimplemented\n", wParam);
+                }
+            }
+            return 0;
+        }
+        case WM_TIMER:
+        {
+            if (wParam == 1)
+            {
+                KillTimer(hwndDlg, 1);
+                StartUserShell(Session);
+            }
+            break;
+        }
                case WLX_WM_SAS:
                {
                        DispatchSAS(Session, (DWORD)wParam);