[WINLOGON]
[reactos.git] / reactos / base / system / winlogon / winlogon.c
index 3f977d0..0ffa0d2 100644 (file)
@@ -12,8 +12,6 @@
 
 #include "winlogon.h"
 
-#include <wine/debug.h>
-
 WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
 
 /* GLOBALS ******************************************************************/
@@ -23,184 +21,97 @@ PWLSESSION WLSession = NULL;
 
 /* FUNCTIONS *****************************************************************/
 
-DWORD
-WINAPI
-PlayLogonSoundThread(
-       IN LPVOID lpParameter)
+static
+BOOL
+StartServicesManager(VOID)
 {
-       HKEY hKey;
-       WCHAR szBuffer[MAX_PATH] = {0};
-       WCHAR szDest[MAX_PATH];
-       DWORD dwSize = sizeof(szBuffer);
-       HMODULE hLibrary;
-       SERVICE_STATUS_PROCESS Info;
-       typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
-       PLAYSOUNDW Play;
-       ULONG Index = 0;
-
-       if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
-       {
-               ExitThread(0);
-       }
-
-       if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szBuffer, &dwSize) != ERROR_SUCCESS)
-       {
-               RegCloseKey(hKey);
-               ExitThread(0);
-       }
-
-
-       RegCloseKey(hKey);
-
-       if (!szBuffer[0])
-               ExitThread(0);
-
-
-       szBuffer[MAX_PATH-1] = L'\0';
-       if (ExpandEnvironmentStringsW(szBuffer, szDest, MAX_PATH))
-       {
-               SC_HANDLE hSCManager, hService;
-
-               hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
-               if (!hSCManager)
-                       ExitThread(0);;
-
-               hService = OpenServiceW(hSCManager, L"wdmaud", GENERIC_READ);
-               if (!hService)
-               {
-                       CloseServiceHandle(hSCManager);
-                       TRACE("WL: failed to open sysaudio Status %x\n", GetLastError());
-                       ExitThread(0);
-               }
-
-               do
-               {
-                       if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
-                       {
-                               TRACE("WL: QueryServiceStatusEx failed %x\n", GetLastError());
-                               break;
-                       }
-
-                       if (Info.dwCurrentState == SERVICE_RUNNING)
-                               break;
-
-                       Sleep(1000);
-
-               }while(Index++ < 20);
-
-               CloseServiceHandle(hService);
-               CloseServiceHandle(hSCManager);
-
-               if (Info.dwCurrentState != SERVICE_RUNNING)
-                       ExitThread(0);
-
-
-               hLibrary = LoadLibraryW(L"winmm.dll");
-               if (hLibrary)
-               {
-                       Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
-                       if (Play)
-                       {
-                               Play(szDest, NULL, SND_FILENAME);
-                       }
-                       FreeLibrary(hLibrary);
-               }
-       }
-       ExitThread(0);
-}
+    STARTUPINFOW StartupInfo;
+    PROCESS_INFORMATION ProcessInformation;
+    LPCWSTR ServiceString = L"services.exe";
+    BOOL res;
+
+    /* Start the service control manager (services.exe) */
+    ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
+    StartupInfo.cb = sizeof(StartupInfo);
+    StartupInfo.lpReserved = NULL;
+    StartupInfo.lpDesktop = NULL;
+    StartupInfo.lpTitle = NULL;
+    StartupInfo.dwFlags = 0;
+    StartupInfo.cbReserved2 = 0;
+    StartupInfo.lpReserved2 = 0;
+
+    TRACE("WL: Creating new process - %S\n", ServiceString);
+
+    res = CreateProcessW(ServiceString,
+                         NULL,
+                         NULL,
+                         NULL,
+                         FALSE,
+                         DETACHED_PROCESS,
+                         NULL,
+                         NULL,
+                         &StartupInfo,
+                         &ProcessInformation);
+    if (!res)
+    {
+        ERR("WL: Failed to execute services (error %lu)\n", GetLastError());
+        return FALSE;
+    }
 
+    TRACE("WL: Created new process - %S\n", ServiceString);
 
+    CloseHandle(ProcessInformation.hThread);
+    CloseHandle(ProcessInformation.hProcess);
 
-static BOOL
-StartServicesManager(VOID)
-{
-       STARTUPINFOW StartupInfo;
-       PROCESS_INFORMATION ProcessInformation;
-       LPCWSTR ServiceString = L"services.exe";
-       BOOL res;
-
-       /* Start the service control manager (services.exe) */
-       ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
-       StartupInfo.cb = sizeof(StartupInfo);
-       StartupInfo.lpReserved = NULL;
-       StartupInfo.lpDesktop = NULL;
-       StartupInfo.lpTitle = NULL;
-       StartupInfo.dwFlags = 0;
-       StartupInfo.cbReserved2 = 0;
-       StartupInfo.lpReserved2 = 0;
-
-       TRACE("WL: Creating new process - %S\n", ServiceString);
-
-       res = CreateProcessW(
-               ServiceString,
-               NULL,
-               NULL,
-               NULL,
-               FALSE,
-               DETACHED_PROCESS,
-               NULL,
-               NULL,
-               &StartupInfo,
-               &ProcessInformation);
-       if (!res)
-       {
-               ERR("WL: Failed to execute services (error %lu)\n", GetLastError());
-               return FALSE;
-       }
-
-       TRACE("WL: Created new process - %S\n", ServiceString);
-
-       CloseHandle(ProcessInformation.hThread);
-       CloseHandle(ProcessInformation.hProcess);
-
-       TRACE("WL: StartServicesManager() done.\n");
-
-       return TRUE;
+    TRACE("WL: StartServicesManager() done.\n");
+
+    return TRUE;
 }
 
 
-static BOOL
+static
+BOOL
 StartLsass(VOID)
 {
-       STARTUPINFOW StartupInfo;
-       PROCESS_INFORMATION ProcessInformation;
-       LPCWSTR ServiceString = L"lsass.exe";
-       BOOL res;
-
-       /* Start the local security authority subsystem (lsass.exe) */
-       ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
-       StartupInfo.cb = sizeof(StartupInfo);
-       StartupInfo.lpReserved = NULL;
-       StartupInfo.lpDesktop = NULL;
-       StartupInfo.lpTitle = NULL;
-       StartupInfo.dwFlags = 0;
-       StartupInfo.cbReserved2 = 0;
-       StartupInfo.lpReserved2 = 0;
-
-       TRACE("WL: Creating new process - %S\n", ServiceString);
-
-       res = CreateProcessW(
-               ServiceString,
-               NULL,
-               NULL,
-               NULL,
-               FALSE,
-               DETACHED_PROCESS,
-               NULL,
-               NULL,
-               &StartupInfo,
-               &ProcessInformation);
-
-       TRACE("WL: Created new process - %S\n", ServiceString);
-
-       CloseHandle(ProcessInformation.hThread);
-       CloseHandle(ProcessInformation.hProcess);
-
-       return res;
+    STARTUPINFOW StartupInfo;
+    PROCESS_INFORMATION ProcessInformation;
+    LPCWSTR ServiceString = L"lsass.exe";
+    BOOL res;
+
+    /* Start the local security authority subsystem (lsass.exe) */
+    ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
+    StartupInfo.cb = sizeof(StartupInfo);
+    StartupInfo.lpReserved = NULL;
+    StartupInfo.lpDesktop = NULL;
+    StartupInfo.lpTitle = NULL;
+    StartupInfo.dwFlags = 0;
+    StartupInfo.cbReserved2 = 0;
+    StartupInfo.lpReserved2 = 0;
+
+    TRACE("WL: Creating new process - %S\n", ServiceString);
+
+    res = CreateProcessW(ServiceString,
+                         NULL,
+                         NULL,
+                         NULL,
+                         FALSE,
+                         DETACHED_PROCESS,
+                         NULL,
+                         NULL,
+                         &StartupInfo,
+                         &ProcessInformation);
+
+    TRACE("WL: Created new process - %S\n", ServiceString);
+
+    CloseHandle(ProcessInformation.hThread);
+    CloseHandle(ProcessInformation.hProcess);
+
+    return res;
 }
 
 
-static VOID
+static
+VOID
 WaitForLsass(VOID)
 {
     HANDLE hEvent;
@@ -236,236 +147,312 @@ WaitForLsass(VOID)
 }
 
 
+static
+BOOL
+InitKeyboardLayouts(VOID)
+{
+    WCHAR wszKeyName[12], wszKLID[10];
+    DWORD dwSize = sizeof(wszKLID), dwType, i = 1;
+    HKEY hKey;
+    UINT Flags;
+    BOOL bRet = FALSE;
+
+    /* Open registry key with preloaded layouts */
+    if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
+    {
+        while(TRUE)
+        {
+            /* Read values with integer names only */
+            swprintf(wszKeyName, L"%d", i++);
+            if (RegQueryValueExW(hKey, wszKeyName, NULL, &dwType, (LPBYTE)wszKLID, &dwSize) != ERROR_SUCCESS)
+            {
+                /* There is no more entries */
+                break;
+            }
+
+            /* Only REG_SZ values are valid */
+            if (dwType != REG_SZ)
+            {
+                ERR("Wrong type: %ws!\n", wszKLID);
+                continue;
+            }
+
+            /* Load keyboard layout with given locale id */
+            Flags = KLF_SUBSTITUTE_OK;
+            if (i > 1)
+                Flags |= KLF_NOTELLSHELL|KLF_REPLACELANG;
+            else // First layout
+                Flags |= KLF_ACTIVATE; // |0x40000000
+            if (!LoadKeyboardLayoutW(wszKLID, Flags))
+            {
+                ERR("LoadKeyboardLayoutW(%ws) failed!\n", wszKLID);
+                continue;
+            }
+            else
+            {
+                /* We loaded at least one layout - success */
+                bRet = TRUE;
+            }
+        }
+
+        /* Close the key now */
+        RegCloseKey(hKey);
+    }
+    else
+        WARN("RegOpenKeyExW(Keyboard Layout\\Preload) failed!\n");
+
+    if (!bRet)
+    {
+        /* If we failed, load US keyboard layout */
+        if (LoadKeyboardLayoutW(L"00000409", 0x04090409))
+            bRet = TRUE;
+    }
+
+    return bRet;
+}
+
+
 BOOL
 DisplayStatusMessage(
-       IN PWLSESSION Session,
-       IN HDESK hDesktop,
-       IN UINT ResourceId)
+     IN PWLSESSION Session,
+     IN HDESK hDesktop,
+     IN UINT ResourceId)
 {
-       WCHAR StatusMsg[MAX_PATH];
+    WCHAR StatusMsg[MAX_PATH];
 
-       if (Session->Gina.Version < WLX_VERSION_1_3)
-               return TRUE;
+    if (Session->Gina.Version < WLX_VERSION_1_3)
+        return TRUE;
 
-       if (Session->SuppressStatus)
-               return TRUE;
+    if (Session->SuppressStatus)
+        return TRUE;
 
-       if (LoadStringW(hAppInstance, ResourceId, StatusMsg, MAX_PATH) == 0)
-               return FALSE;
+    if (LoadStringW(hAppInstance, ResourceId, StatusMsg, MAX_PATH) == 0)
+        return FALSE;
 
-       return Session->Gina.Functions.WlxDisplayStatusMessage(Session->Gina.Context, hDesktop, 0, NULL, StatusMsg);
+    return Session->Gina.Functions.WlxDisplayStatusMessage(Session->Gina.Context, hDesktop, 0, NULL, StatusMsg);
 }
 
+
 BOOL
 RemoveStatusMessage(
-       IN PWLSESSION Session)
+    IN PWLSESSION Session)
 {
-       if (Session->Gina.Version < WLX_VERSION_1_3)
-               return TRUE;
+    if (Session->Gina.Version < WLX_VERSION_1_3)
+        return TRUE;
 
-       return Session->Gina.Functions.WlxRemoveStatusMessage(Session->Gina.Context);
+    return Session->Gina.Functions.WlxRemoveStatusMessage(Session->Gina.Context);
 }
 
-static INT_PTR CALLBACK
+
+static
+INT_PTR
+CALLBACK
 GinaLoadFailedWindowProc(
-       IN HWND hwndDlg,
-       IN UINT uMsg,
-       IN WPARAM wParam,
-       IN LPARAM lParam)
+    IN HWND hwndDlg,
+    IN UINT uMsg,
+    IN WPARAM wParam,
+    IN LPARAM lParam)
 {
-       switch (uMsg)
-       {
-               case WM_COMMAND:
-               {
-                       switch (LOWORD(wParam))
-                       {
-                               case IDOK:
-                                       EndDialog(hwndDlg, IDOK);
-                                       return TRUE;
-                       }
-                       break;
-               }
-               case WM_INITDIALOG:
-               {
-                       int len;
-                       WCHAR templateText[MAX_PATH], text[MAX_PATH];
-
-                       len = GetDlgItemTextW(hwndDlg, IDC_GINALOADFAILED, templateText, MAX_PATH);
-                       if (len)
-                       {
-                               wsprintfW(text, templateText, (LPWSTR)lParam);
-                               SetDlgItemTextW(hwndDlg, IDC_GINALOADFAILED, text);
-                       }
-                       SetFocus(GetDlgItem(hwndDlg, IDOK));
-                       return TRUE;
-               }
-               case WM_CLOSE:
-               {
-                       EndDialog(hwndDlg, IDCANCEL);
-                       return TRUE;
-               }
-       }
-
-       return FALSE;
+    switch (uMsg)
+    {
+        case WM_COMMAND:
+        {
+            switch (LOWORD(wParam))
+            {
+                case IDOK:
+                    EndDialog(hwndDlg, IDOK);
+                    return TRUE;
+            }
+            break;
+        }
+
+        case WM_INITDIALOG:
+        {
+            int len;
+            WCHAR templateText[MAX_PATH], text[MAX_PATH];
+
+            len = GetDlgItemTextW(hwndDlg, IDC_GINALOADFAILED, templateText, MAX_PATH);
+            if (len)
+            {
+                wsprintfW(text, templateText, (LPWSTR)lParam);
+                SetDlgItemTextW(hwndDlg, IDC_GINALOADFAILED, text);
+            }
+
+            SetFocus(GetDlgItem(hwndDlg, IDOK));
+            return TRUE;
+        }
+
+        case WM_CLOSE:
+        {
+            EndDialog(hwndDlg, IDCANCEL);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
 }
 
-int WINAPI
+
+int
+WINAPI
 WinMain(
-       IN HINSTANCE hInstance,
-       IN HINSTANCE hPrevInstance,
-       IN LPSTR lpCmdLine,
-       IN int nShowCmd)
+    IN HINSTANCE hInstance,
+    IN HINSTANCE hPrevInstance,
+    IN LPSTR lpCmdLine,
+    IN int nShowCmd)
 {
 #if 0
-       LSA_STRING ProcessName, PackageName;
-       HANDLE LsaHandle;
-       LSA_OPERATIONAL_MODE Mode;
-       BOOLEAN Old;
-       ULONG AuthenticationPackage;
-       NTSTATUS Status;
+    LSA_STRING ProcessName, PackageName;
+    HANDLE LsaHandle;
+    LSA_OPERATIONAL_MODE Mode;
+    BOOLEAN Old;
+    ULONG AuthenticationPackage;
+    NTSTATUS Status;
 #endif
-       ULONG HardErrorResponse;
-       MSG Msg;
-       HANDLE hThread;
-
-       UNREFERENCED_PARAMETER(hPrevInstance);
-       UNREFERENCED_PARAMETER(lpCmdLine);
-       UNREFERENCED_PARAMETER(nShowCmd);
-
-       hAppInstance = hInstance;
-
-       if (!RegisterLogonProcess(GetCurrentProcessId(), TRUE))
-       {
-               ERR("WL: Could not register logon process\n");
-               HandleShutdown(NULL, WLX_SAS_ACTION_SHUTDOWN_POWER_OFF);
-               NtShutdownSystem(ShutdownNoReboot);
-               ExitProcess(0);
-       }
-
-       WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), 0, sizeof(WLSESSION));
-       if (!WLSession)
-       {
-               ERR("WL: Could not allocate memory for winlogon instance\n");
-               NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
-               ExitProcess(1);
-       }
-       ZeroMemory(WLSession, sizeof(WLSESSION));
-       WLSession->DialogTimeout = 120; /* 2 minutes */
-
-       if (!CreateWindowStationAndDesktops(WLSession))
-       {
-               ERR("WL: Could not create window station and desktops\n");
-               NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
-               ExitProcess(1);
-       }
-       LockWorkstation(WLSession);
-
-       if (!StartServicesManager())
-       {
-               ERR("WL: Could not start services.exe\n");
-               NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
-               ExitProcess(1);
-       }
-
-       if (!StartLsass())
-       {
-               ERR("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError());
-               NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, OptionOk, &HardErrorResponse);
-               ExitProcess(1);
-       }
-
-       /* Load and initialize gina */
-       if (!GinaInit(WLSession))
-       {
-               ERR("WL: Failed to initialize Gina\n");
-               DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L"");
-               HandleShutdown(WLSession, WLX_SAS_ACTION_SHUTDOWN_REBOOT);
-               ExitProcess(1);
-       }
-
-       DisplayStatusMessage(WLSession, WLSession->WinlogonDesktop, IDS_REACTOSISSTARTINGUP);
-
-
-       /* Wait for the LSA server */
-       WaitForLsass();
+    ULONG HardErrorResponse;
+    MSG Msg;
+
+    UNREFERENCED_PARAMETER(hPrevInstance);
+    UNREFERENCED_PARAMETER(lpCmdLine);
+    UNREFERENCED_PARAMETER(nShowCmd);
+
+    hAppInstance = hInstance;
+
+    if (!RegisterLogonProcess(GetCurrentProcessId(), TRUE))
+    {
+        ERR("WL: Could not register logon process\n");
+        NtShutdownSystem(ShutdownNoReboot);
+        ExitProcess(0);
+    }
+
+    WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), 0, sizeof(WLSESSION));
+    if (!WLSession)
+    {
+        ERR("WL: Could not allocate memory for winlogon instance\n");
+        NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+        ExitProcess(1);
+    }
+
+    ZeroMemory(WLSession, sizeof(WLSESSION));
+    WLSession->DialogTimeout = 120; /* 2 minutes */
+
+    if (!CreateWindowStationAndDesktops(WLSession))
+    {
+        ERR("WL: Could not create window station and desktops\n");
+        NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+        ExitProcess(1);
+    }
+
+    LockWorkstation(WLSession);
+
+    /* Load default keyboard layouts */
+    if (!InitKeyboardLayouts())
+    {
+        ERR("WL: Could not preload keyboard layouts\n");
+        NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+        ExitProcess(1);
+    }
+
+    if (!StartServicesManager())
+    {
+        ERR("WL: Could not start services.exe\n");
+        NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+        ExitProcess(1);
+    }
+
+    if (!StartLsass())
+    {
+        ERR("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError());
+        NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, OptionOk, &HardErrorResponse);
+        ExitProcess(1);
+    }
+
+    /* Wait for the LSA server */
+    WaitForLsass();
+
+    /* Load and initialize gina */
+    if (!GinaInit(WLSession))
+    {
+        ERR("WL: Failed to initialize Gina\n");
+        DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L"");
+        HandleShutdown(WLSession, WLX_SAS_ACTION_SHUTDOWN_REBOOT);
+        ExitProcess(1);
+    }
+
+    DisplayStatusMessage(WLSession, WLSession->WinlogonDesktop, IDS_REACTOSISSTARTINGUP);
 
 #if 0
-       /* Connect to NetLogon service (lsass.exe) */
-       /* Real winlogon uses "Winlogon" */
-       RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon");
-       Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
-       if (Status == STATUS_PORT_CONNECTION_REFUSED)
-       {
-               /* Add the 'SeTcbPrivilege' privilege and try again */
-               Status = RtlAdjustPrivilege(SE_TCB_PRIVILEGE, TRUE, TRUE, &Old);
-               if (!NT_SUCCESS(Status))
-               {
-                       ERR("RtlAdjustPrivilege() failed with error %lu\n", LsaNtStatusToWinError(Status));
-                       return 1;
-               }
-               Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
-       }
-       if (!NT_SUCCESS(Status))
-       {
-               ERR("LsaRegisterLogonProcess() failed with error %lu\n", LsaNtStatusToWinError(Status));
-               return 1;
-       }
-
-       RtlInitUnicodeString((PUNICODE_STRING)&PackageName, MICROSOFT_KERBEROS_NAME_W);
-       Status = LsaLookupAuthenticationPackage(LsaHandle, &PackageName, &AuthenticationPackage);
-       if (!NT_SUCCESS(Status))
-       {
-               ERR("LsaLookupAuthenticationPackage() failed with error %lu\n", LsaNtStatusToWinError(Status));
-               LsaDeregisterLogonProcess(LsaHandle);
-               return 1;
-       }
+    /* Connect to NetLogon service (lsass.exe) */
+    /* Real winlogon uses "Winlogon" */
+    RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon");
+    Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
+    if (Status == STATUS_PORT_CONNECTION_REFUSED)
+    {
+        /* Add the 'SeTcbPrivilege' privilege and try again */
+        Status = RtlAdjustPrivilege(SE_TCB_PRIVILEGE, TRUE, TRUE, &Old);
+        if (!NT_SUCCESS(Status))
+        {
+            ERR("RtlAdjustPrivilege() failed with error %lu\n", LsaNtStatusToWinError(Status));
+            return 1;
+        }
+
+        Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
+    }
+
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("LsaRegisterLogonProcess() failed with error %lu\n", LsaNtStatusToWinError(Status));
+        return 1;
+    }
+
+    RtlInitUnicodeString((PUNICODE_STRING)&PackageName, MICROSOFT_KERBEROS_NAME_W);
+    Status = LsaLookupAuthenticationPackage(LsaHandle, &PackageName, &AuthenticationPackage);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("LsaLookupAuthenticationPackage() failed with error %lu\n", LsaNtStatusToWinError(Status));
+        LsaDeregisterLogonProcess(LsaHandle);
+        return 1;
+    }
 #endif
 
-       /* Create a hidden window to get SAS notifications */
-       if (!InitializeSAS(WLSession))
-       {
-               ERR("WL: Failed to initialize SAS\n");
-               ExitProcess(2);
-       }
-
-       //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
-       //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
-
-       /* Display logged out screen */
-       WLSession->LogonStatus = WKSTA_IS_LOGGED_OFF;
-       RemoveStatusMessage(WLSession);
-
-       /* Check for pending setup */
-       if (GetSetupType() != 0)
-       {
-               TRACE("WL: Setup mode detected\n");
-
-               /* Run setup and reboot when done */
-               SwitchDesktop(WLSession->ApplicationDesktop);
-               RunSetup();
-       }
-       else
-               PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_TIMEOUT, 0);
-
-       /* Play logon sound */
-       hThread = CreateThread(NULL, 0, PlayLogonSoundThread, NULL, 0, NULL);
-       if (hThread)
-       {
-               CloseHandle(hThread);
-       }
-
-       /* Tell kernel that CurrentControlSet is good (needed
-        * to support Last good known configuration boot) */
-       NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED | 1);
-
-       /* Message loop for the SAS window */
-       while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0))
-       {
-               TranslateMessage(&Msg);
-               DispatchMessageW(&Msg);
-       }
-
-       /* We never go there */
-
-       return 0;
+    /* Create a hidden window to get SAS notifications */
+    if (!InitializeSAS(WLSession))
+    {
+        ERR("WL: Failed to initialize SAS\n");
+        ExitProcess(2);
+    }
+
+    //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
+    //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
+
+    /* Display logged out screen */
+    WLSession->LogonState = STATE_LOGGED_OFF;
+    RemoveStatusMessage(WLSession);
+
+    /* Check for pending setup */
+    if (GetSetupType() != 0)
+    {
+        TRACE("WL: Setup mode detected\n");
+
+        /* Run setup and reboot when done */
+        SwitchDesktop(WLSession->ApplicationDesktop);
+        RunSetup();
+    }
+    else
+        PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_TIMEOUT, 0);
+
+    /* Tell kernel that CurrentControlSet is good (needed
+     * to support Last good known configuration boot) */
+    NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED | 1);
+
+    /* Message loop for the SAS window */
+    while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0))
+    {
+        TranslateMessage(&Msg);
+        DispatchMessageW(&Msg);
+    }
+
+    /* We never go there */
+
+    return 0;
 }