if (hEvent == NULL)
{
dwError = GetLastError();
- TRACE("WL: Failed to create the notication event (Error %lu)\n", dwError);
+ TRACE("WL: Failed to create the notification event (Error %lu)\n", dwError);
if (dwError == ERROR_ALREADY_EXISTS)
{
/* Open registry key with preloaded layouts */
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
- while(TRUE)
+ while (TRUE)
{
/* Read values with integer names only */
swprintf(wszKeyName, L"%d", i++);
hAppInstance = hInstance;
+ /* Make us critical */
+ RtlSetProcessIsCritical(TRUE, NULL, FALSE);
+ RtlSetThreadIsCritical(TRUE, NULL, FALSE);
+
if (!RegisterLogonProcess(GetCurrentProcessId(), TRUE))
{
ERR("WL: Could not register logon process\n");
- NtShutdownSystem(ShutdownNoReboot);
- ExitProcess(0);
+ NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+ ExitProcess(1);
}
WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), 0, sizeof(WLSESSION));
ExitProcess(1);
}
+ if (!StartRpcServer())
+ {
+ ERR("WL: Could not start the RPC server\n");
+ NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
+ ExitProcess(1);
+ }
+
if (!StartServicesManager())
{
ERR("WL: Could not start services.exe\n");
if (!StartLsass())
{
ERR("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError());
- NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, OptionOk, &HardErrorResponse);
+ NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
ExitProcess(1);
}
/* Wait for the LSA server */
WaitForLsass();
+ /* Init Notifications */
+ InitNotifications();
+
/* Load and initialize gina */
if (!GinaInit(WLSession))
{
ERR("WL: Failed to initialize Gina\n");
- DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L"");
+ // FIXME: Retrieve the real name of the GINA DLL we were trying to load.
+ // It is known only inside the GinaInit function...
+ DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), GetDesktopWindow(), GinaLoadFailedWindowProc, (LPARAM)L"msgina.dll");
HandleShutdown(WLSession, WLX_SAS_ACTION_SHUTDOWN_REBOOT);
ExitProcess(1);
}
}
#endif
+ CallNotificationDlls(WLSession, StartupHandler);
+
/* Create a hidden window to get SAS notifications */
if (!InitializeSAS(WLSession))
{
ExitProcess(2);
}
- //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
- //DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
+ // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
+ // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
/* Display logged out screen */
WLSession->LogonState = STATE_INIT;
/* Check for pending setup */
if (GetSetupType() != 0)
{
- TRACE("WL: Setup mode detected\n");
-
/* Run setup and reboot when done */
- SwitchDesktop(WLSession->ApplicationDesktop);
+ TRACE("WL: Setup mode detected\n");
RunSetup();
}
else
+ {
PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_CTRL_ALT_DEL, 0);
+ }
+
+ (void)LoadLibraryW(L"sfc_os.dll");
/* Tell kernel that CurrentControlSet is good (needed
* to support Last good known configuration boot) */
DispatchMessageW(&Msg);
}
+ CleanupNotifications();
+
/* We never go there */
return 0;