#include "winlogon.h"
-WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
+#include <ndk/cmfuncs.h>
/* GLOBALS ******************************************************************/
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++);
BOOL
-DisplayStatusMessage(IN PWLSESSION Session,
- IN HDESK hDesktop,
- IN UINT ResourceId)
+DisplayStatusMessage(
+ IN PWLSESSION Session,
+ IN HDESK hDesktop,
+ IN UINT ResourceId)
{
WCHAR StatusMsg[MAX_PATH];
BOOL
-RemoveStatusMessage(IN PWLSESSION Session)
+RemoveStatusMessage(
+ IN PWLSESSION Session)
{
if (Session->Gina.Version < WLX_VERSION_1_3)
return TRUE;
static
INT_PTR
CALLBACK
-GinaLoadFailedWindowProc(IN HWND hwndDlg,
- IN UINT uMsg,
- IN WPARAM wParam,
- IN LPARAM lParam)
+GinaLoadFailedWindowProc(
+ IN HWND hwndDlg,
+ IN UINT uMsg,
+ IN WPARAM wParam,
+ IN LPARAM lParam)
{
switch (uMsg)
{
int
WINAPI
-WinMain(IN HINSTANCE hInstance,
- IN HINSTANCE hPrevInstance,
- IN LPSTR lpCmdLine,
- IN int nShowCmd)
+WinMain(
+ IN HINSTANCE hInstance,
+ IN HINSTANCE hPrevInstance,
+ IN LPSTR lpCmdLine,
+ IN int nShowCmd)
{
#if 0
LSA_STRING ProcessName, PackageName;
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));
ZeroMemory(WLSession, sizeof(WLSESSION));
WLSession->DialogTimeout = 120; /* 2 minutes */
+ /* Initialize the dialog tracking list */
+ InitDialogListHead();
+
if (!CreateWindowStationAndDesktops(WLSession))
{
ERR("WL: Could not create window station and desktops\n");
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_LOGGED_OFF;
+ WLSession->LogonState = STATE_INIT;
RemoveStatusMessage(WLSession);
/* 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_TIMEOUT, 0);
+ {
+ 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;