diff --git a/reactos/base/system/winlogon/sas.c b/reactos/base/system/winlogon/sas.c index 9c10dc26db3..8b4662b129c 100644 --- a/reactos/base/system/winlogon/sas.c +++ b/reactos/base/system/winlogon/sas.c @@ -28,8 +28,8 @@ static BOOL StartTaskManager( IN OUT PWLSESSION Session) { - return Session->MsGina.Functions.WlxStartApplication( - Session->MsGina.Context, + return Session->Gina.Functions.WlxStartApplication( + Session->Gina.Context, L"Default", NULL, L"taskmgr.exe"); @@ -81,8 +81,8 @@ HandleLogon( /* FIXME: reverting to lower privileges after creating user shell? */ RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old); - return Session->MsGina.Functions.WlxActivateUserShell( - Session->MsGina.Context, + return Session->Gina.Functions.WlxActivateUserShell( + Session->Gina.Context, L"Default",//NULL, /* FIXME */ NULL, /* FIXME */ lpEnvironment); @@ -127,11 +127,11 @@ DoGenericAction( case WLX_SAS_ACTION_NONE: /* 0x02 */ break; case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */ - if (Session->MsGina.Functions.WlxIsLockOk(Session->MsGina.Context)) + if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context)) { SwitchDesktop(WLSession->WinlogonDesktop); Session->LogonStatus = WKSTA_IS_LOCKED; - Session->MsGina.Functions.WlxDisplayLockedNotice(Session->MsGina.Context); + Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context); } break; case WLX_SAS_ACTION_LOGOFF: /* 0x04 */ @@ -140,13 +140,13 @@ DoGenericAction( case WLX_SAS_ACTION_SHUTDOWN_REBOOT: /* 0x0b */ if (Session->LogonStatus != WKSTA_IS_LOGGED_OFF) { - if (!Session->MsGina.Functions.WlxIsLogoffOk(Session->MsGina.Context)) + if (!Session->Gina.Functions.WlxIsLogoffOk(Session->Gina.Context)) break; SwitchDesktop(WLSession->WinlogonDesktop); - Session->MsGina.Functions.WlxLogoff(Session->MsGina.Context); + Session->Gina.Functions.WlxLogoff(Session->Gina.Context); HandleLogoff(Session); Session->LogonStatus = WKSTA_IS_LOGGED_OFF; - Session->MsGina.Functions.WlxDisplaySASNotice(Session->MsGina.Context); + Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context); } if (WLX_SHUTTINGDOWN(wlxAction)) HandleShutdown(Session, wlxAction); @@ -172,9 +172,9 @@ DispatchSAS( DWORD wlxAction = WLX_SAS_ACTION_NONE; if (Session->LogonStatus == WKSTA_IS_LOGGED_ON) - wlxAction = Session->MsGina.Functions.WlxLoggedOnSAS(Session->MsGina.Context, dwSasType, NULL); + wlxAction = Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL); else if (Session->LogonStatus == WKSTA_IS_LOCKED) - wlxAction = Session->MsGina.Functions.WlxWkstaLockedSAS(Session->MsGina.Context, dwSasType); + wlxAction = Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType); else { /* Display a new dialog (if necessary) */ @@ -182,7 +182,7 @@ DispatchSAS( { case WLX_SAS_TYPE_TIMEOUT: /* 0x00 */ { - Session->MsGina.Functions.WlxDisplaySASNotice(Session->MsGina.Context); + Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context); break; } case WLX_SAS_TYPE_CTRL_ALT_DEL: /* 0x01 */ @@ -192,8 +192,8 @@ DispatchSAS( ZeroMemory(&Session->Profile, sizeof(Session->Profile)); Session->Options = 0; - wlxAction = Session->MsGina.Functions.WlxLoggedOutSAS( - Session->MsGina.Context, + wlxAction = Session->Gina.Functions.WlxLoggedOutSAS( + Session->Gina.Context, Session->SASAction, &Session->LogonId, LogonSid, @@ -384,6 +384,8 @@ SASWindowProc( case MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE): { TRACE("SAS: CONTROL+ALT+DELETE\n"); + if (!Session->Gina.UseCtrlAltDelete) + break; DispatchSAS(Session, WLX_SAS_TYPE_CTRL_ALT_DEL); return TRUE; } @@ -435,7 +437,7 @@ BOOL InitializeSAS( IN OUT PWLSESSION Session) { - WNDCLASSEX swc; + WNDCLASSEXW swc; /* register SAS window class. * WARNING! MAKE SURE WE ARE IN THE WINLOGON DESKTOP! */ @@ -451,11 +453,11 @@ InitializeSAS( swc.lpszMenuName = NULL; swc.lpszClassName = WINLOGON_SAS_CLASS; swc.hIconSm = NULL; - RegisterClassEx(&swc); /* FIXME: check return code */ + RegisterClassExW(&swc); /* FIXME: check return code */ /* create invisible SAS window */ DPRINT1("Session %p\n", Session); - Session->SASWindow = CreateWindowEx( + Session->SASWindow = CreateWindowExW( 0, WINLOGON_SAS_CLASS, WINLOGON_SAS_TITLE, diff --git a/reactos/base/system/winlogon/setup.c b/reactos/base/system/winlogon/setup.c index 6af03f89a49..1421a6a8e33 100644 --- a/reactos/base/system/winlogon/setup.c +++ b/reactos/base/system/winlogon/setup.c @@ -43,7 +43,7 @@ GetSetupType(VOID) DWORD dwSize; DWORD dwSetupType; - dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"), 0, KEY_QUERY_VALUE, @@ -54,7 +54,7 @@ GetSetupType(VOID) } dwSize = sizeof(DWORD); - dwError = RegQueryValueEx (hKey, + dwError = RegQueryValueExW (hKey, L"SetupType", //TEXT("SetupType"), NULL, &dwType, @@ -76,7 +76,7 @@ SetSetupType (DWORD dwSetupType) DWORD dwError; HKEY hKey; - dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"), 0, KEY_SET_VALUE, @@ -86,7 +86,7 @@ SetSetupType (DWORD dwSetupType) return FALSE; } - dwError = RegSetValueEx (hKey, + dwError = RegSetValueExW (hKey, L"SetupType", //TEXT("SetupType"), 0, REG_DWORD, @@ -106,7 +106,7 @@ BOOL RunSetup (VOID) { PROCESS_INFORMATION ProcessInformation; - STARTUPINFO StartupInfo; + STARTUPINFOW StartupInfo; WCHAR Shell[MAX_PATH]; WCHAR CommandLine[MAX_PATH]; BOOLEAN Result; diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c index b4f7d6b2d2f..6875ecc847a 100644 --- a/reactos/base/system/winlogon/winlogon.c +++ b/reactos/base/system/winlogon/winlogon.c @@ -36,7 +36,7 @@ ShutdownComputerWindowProc( { case IDC_BTNSHTDOWNCOMPUTER: EndDialog(hwndDlg, IDC_BTNSHTDOWNCOMPUTER); - break; + return TRUE; } break; } @@ -44,10 +44,10 @@ ShutdownComputerWindowProc( { RemoveMenu(GetSystemMenu(hwndDlg, FALSE), SC_CLOSE, MF_BYCOMMAND); SetFocus(GetDlgItem(hwndDlg, IDC_BTNSHTDOWNCOMPUTER)); - break; + return TRUE; } } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static BOOL @@ -55,7 +55,7 @@ StartServicesManager(VOID) { HANDLE ServicesInitEvent; BOOLEAN Result; - STARTUPINFO StartupInfo; + STARTUPINFOW StartupInfo; PROCESS_INFORMATION ProcessInformation; DWORD Count; WCHAR ServiceString[] = L"services.exe"; @@ -74,7 +74,7 @@ StartServicesManager(VOID) DPRINT1(L"WL: Creating new process - \"services.exe\".\n"); #endif - Result = CreateProcess(NULL, + Result = CreateProcessW(NULL, ServiceString, NULL, NULL, @@ -96,7 +96,7 @@ StartServicesManager(VOID) Sleep(1000); DPRINT("WL: Attempting to open event \"SvcctrlStartEvent_A3725DX\"\n"); - ServicesInitEvent = OpenEvent(EVENT_ALL_ACCESS, //SYNCHRONIZE, + ServicesInitEvent = OpenEventW(EVENT_ALL_ACCESS, //SYNCHRONIZE, FALSE, L"SvcctrlStartEvent_A3725DX"); if (ServicesInitEvent != NULL) @@ -133,7 +133,7 @@ StartCustomService( if (!hSCManager) goto cleanup; - hService = OpenService(hSCManager, ServiceName, SERVICE_START); + hService = OpenServiceW(hSCManager, ServiceName, SERVICE_START); if (!hService) goto cleanup; #if 0 @@ -156,7 +156,7 @@ StartLsass(VOID) { HANDLE LsassInitEvent; - LsassInitEvent = CreateEvent( + LsassInitEvent = CreateEventW( NULL, TRUE, FALSE, @@ -393,7 +393,7 @@ DoBrokenLogonUser( DestroyEnvironmentBlock (lpEnvironment); return FALSE; } - /*WLSession->MsGina.Functions.WlxActivateUserShell(WLSession->MsGina.Context, + /*WLSession->Gina.Functions.WlxActivateUserShell(WLSession->Gina.Context, L"WinSta0\\Default", NULL, NULL);*/ @@ -439,10 +439,10 @@ DisplayStatusMessage( if (Session->SuppressStatus) return TRUE; - if (LoadString(hAppInstance, ResourceId, StatusMsg, MAX_PATH) == 0) + if (LoadStringW(hAppInstance, ResourceId, StatusMsg, MAX_PATH) == 0) return FALSE; - return Session->MsGina.Functions.WlxDisplayStatusMessage(Session->MsGina.Context, hDesktop, 0, NULL, StatusMsg); + return Session->Gina.Functions.WlxDisplayStatusMessage(Session->Gina.Context, hDesktop, 0, NULL, StatusMsg); } static VOID @@ -481,7 +481,7 @@ SessionLoop( RemoveStatusMessage(Session); - if(!MsGinaInst->Functions->WlxActivateUserShell(MsGinaInst->Context, + if(!GinaInst->Functions->WlxActivateUserShell(GinaInst->Context, L"WinSta0\\Default", NULL, NULL)) @@ -498,7 +498,7 @@ SessionLoop( Sleep(150); - MsGinaInst->Functions->WlxShutdown(MsGinaInst->Context, WLX_SAS_ACTION_SHUTDOWN); + GinaInst->Functions->WlxShutdown(GinaInst->Context, WLX_SAS_ACTION_SHUTDOWN); DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_REACTOSISSHUTTINGDOWN); Sleep(250); @@ -507,6 +507,49 @@ SessionLoop( */ } +static INT_PTR CALLBACK +GinaLoadFailedWindowProc( + 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; +} + int WINAPI WinMain( IN HINSTANCE hInstance, @@ -550,10 +593,18 @@ WinMain( } LockWorkstation(WLSession); + if (!StartServicesManager()) + { + ERR("WL: Could not start services.exe\n"); + NtShutdownSystem(ShutdownNoReboot); + ExitProcess(0); + return 0; + } + /* Check for pending setup */ if (GetSetupType() != 0) { - DPRINT("Winlogon: CheckForSetup() in setup mode\n"); + TRACE("WL: Setup mode detected\n"); /* Run setup and reboot when done */ SwitchDesktop(WLSession->ApplicationDesktop); @@ -568,21 +619,14 @@ WinMain( if (!GinaInit(WLSession)) { ERR("WL: Failed to initialize Gina\n"); - NtShutdownSystem(ShutdownNoReboot); + DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), 0, GinaLoadFailedWindowProc, (LPARAM)L""); + NtShutdownSystem(ShutdownReboot); ExitProcess(0); return 0; } DisplayStatusMessage(WLSession, WLSession->WinlogonDesktop, IDS_REACTOSISSTARTINGUP); - if (!StartServicesManager()) - { - ERR("WL: Could not start services.exe\n"); - NtShutdownSystem(ShutdownNoReboot); - ExitProcess(0); - return 0; - } - if (!StartLsass()) { DPRINT1("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError()); @@ -597,7 +641,12 @@ WinMain( if (Status == STATUS_PORT_CONNECTION_REFUSED) { /* Add the 'SeTcbPrivilege' privilege and try again */ - RtlAdjustPrivilege(SE_TCB_PRIVILEGE, TRUE, TRUE, &Old); + 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)) diff --git a/reactos/base/system/winlogon/winlogon.h b/reactos/base/system/winlogon/winlogon.h index 298346ac785..1d5814f479b 100644 --- a/reactos/base/system/winlogon/winlogon.h +++ b/reactos/base/system/winlogon/winlogon.h @@ -68,7 +68,7 @@ typedef BOOL (WINAPI * PFWLXDISPLAYSTATUSMESSAGE) (PVOID, HDESK, DWORD, PWSTR, P typedef BOOL (WINAPI * PFWLXGETSTATUSMESSAGE) (PVOID, DWORD *, PWSTR, DWORD); typedef BOOL (WINAPI * PFWLXREMOVESTATUSMESSAGE) (PVOID); -typedef struct _MSGINAFUNCTIONS +typedef struct _GINAFUNCTIONS { /* Functions always available for a valid GINA */ PFWLXNEGOTIATE WlxNegotiate; @@ -99,15 +99,16 @@ typedef struct _MSGINAFUNCTIONS PFWLXREMOVESTATUSMESSAGE WlxRemoveStatusMessage; /* Functions available if WlxVersion >= WLX_VERSION_1_4 (MS Windows XP) */ -} MSGINAFUNCTIONS, *PMSGINAFUNCTIONS; +} GINAFUNCTIONS, *PGINAFUNCTIONS; -typedef struct _MSGINAINSTANCE +typedef struct _GINAINSTANCE { HMODULE hDllInstance; - MSGINAFUNCTIONS Functions; + GINAFUNCTIONS Functions; PVOID Context; DWORD Version; -} MSGINAINSTANCE, *PMSGINAINSTANCE; + BOOL UseCtrlAltDelete; +} GINAINSTANCE, *PGINAINSTANCE; /* FIXME: put in an enum */ #define WKSTA_IS_LOGGED_OFF 0 @@ -119,7 +120,7 @@ typedef struct _MSGINAINSTANCE typedef struct _WLSESSION { - MSGINAINSTANCE MsGina; + GINAINSTANCE Gina; DWORD SASAction; DWORD LogonStatus; BOOL SuppressStatus; @@ -157,9 +158,9 @@ extern PWLSESSION WLSession; ) #define RemoveStatusMessage(Session) \ - Session->MsGina.Functions.WlxRemoveStatusMessage(Session->MsGina.Context); + Session->Gina.Functions.WlxRemoveStatusMessage(Session->Gina.Context); #define DisplaySASNotice(Session) \ - Session->MsGina.Functions.WlxDisplaySASNotice(Session->MsGina.Context); + Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context); /* user32 */ BOOL WINAPI diff --git a/reactos/base/system/winlogon/winlogon.rbuild b/reactos/base/system/winlogon/winlogon.rbuild index a6724137609..3c3515e8cac 100644 --- a/reactos/base/system/winlogon/winlogon.rbuild +++ b/reactos/base/system/winlogon/winlogon.rbuild @@ -2,8 +2,6 @@ . - - ntdll kernel32 diff --git a/reactos/base/system/winlogon/wlx.c b/reactos/base/system/winlogon/wlx.c index 85ce7eb72d5..a7b87f4b46e 100644 --- a/reactos/base/system/winlogon/wlx.c +++ b/reactos/base/system/winlogon/wlx.c @@ -27,35 +27,25 @@ DefaultWlxWindowProc( { if (uMsg == WM_TIMER && (UINT_PTR)wParam == IdTimer) { - CHECKPOINT1; EndDialog(hwndDlg, -1); KillTimer(hwndDlg, IdTimer); - CHECKPOINT1; return TRUE; } else if (uMsg == WM_INITDIALOG) { - CHECKPOINT1; - PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); IdTimer = SetTimer(hwndDlg, 0, WLSession->DialogTimeout * 1000, NULL); - CHECKPOINT1; - if (IdTimer == 0) - return FALSE; - return TRUE; + return PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);; } else if (uMsg == WM_NCDESTROY) { - CHECKPOINT1; - PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); - CHECKPOINT1; + BOOL ret; + ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); PreviousWindowProc = NULL; - return TRUE; + return ret; } else { - INT_PTR ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); - ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); - return ret; + return PreviousWindowProc(hwndDlg, uMsg, wParam, lParam); } } @@ -66,7 +56,8 @@ VOID WINAPI WlxUseCtrlAltDel( HANDLE hWlx) { - WlxSetOption(hWlx, WLX_OPTION_USE_CTRL_ALT_DEL, TRUE, NULL); + ULONG_PTR OldValue; + WlxSetOption(hWlx, WLX_OPTION_USE_CTRL_ALT_DEL, TRUE, &OldValue); } /* @@ -77,7 +68,8 @@ WlxSetContextPointer( HANDLE hWlx, PVOID pWlxContext) { - WlxSetOption(hWlx, WLX_OPTION_CONTEXT_POINTER, (ULONG_PTR)pWlxContext, NULL); + ULONG_PTR OldValue; + WlxSetOption(hWlx, WLX_OPTION_CONTEXT_POINTER, (ULONG_PTR)pWlxContext, &OldValue); } /* @@ -147,7 +139,7 @@ WlxDialogBox( if (PreviousWindowProc != NULL) return -1; PreviousWindowProc = dlgprc; - return (int)DialogBox(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc); + return (int)DialogBoxW(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc); } /* @@ -165,7 +157,7 @@ WlxDialogBoxParam( if (PreviousWindowProc != NULL) return -1; PreviousWindowProc = dlgprc; - return (int)DialogBoxParam(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); + return (int)DialogBoxParamW(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); } /* @@ -182,7 +174,7 @@ WlxDialogBoxIndirect( if (PreviousWindowProc != NULL) return -1; PreviousWindowProc = dlgprc; - return (int)DialogBoxIndirect(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc); + return (int)DialogBoxIndirectW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc); } /* @@ -200,7 +192,7 @@ WlxDialogBoxIndirectParam( if (PreviousWindowProc != NULL) return -1; PreviousWindowProc = dlgprc; - return (int)DialogBoxIndirectParam(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); + return (int)DialogBoxIndirectParamW(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam); } /* @@ -316,30 +308,27 @@ WlxSetOption( ULONG_PTR* OldValue) { PWLSESSION Session = (PWLSESSION)hWlx; - UNIMPLEMENTED; - if (Session || !Value) + switch (Option) { - switch (Option) - { - case WLX_OPTION_USE_CTRL_ALT_DEL: - return TRUE; - case WLX_OPTION_CONTEXT_POINTER: - { - *OldValue = (ULONG_PTR)Session->MsGina.Context; - Session->MsGina.Context = (PVOID)Value; - return TRUE; - } - case WLX_OPTION_USE_SMART_CARD: - return FALSE; - } + case WLX_OPTION_USE_CTRL_ALT_DEL: + *OldValue = (ULONG_PTR)Session->Gina.UseCtrlAltDelete; + Session->Gina.UseCtrlAltDelete = (BOOL)Value; + return TRUE; + case WLX_OPTION_CONTEXT_POINTER: + *OldValue = (ULONG_PTR)Session->Gina.Context; + Session->Gina.Context = (PVOID)Value; + return TRUE; + case WLX_OPTION_USE_SMART_CARD: + UNIMPLEMENTED; + return FALSE; } return FALSE; } /* - * @unimplemented + * @implemented */ BOOL WINAPI WlxGetOption( @@ -347,28 +336,26 @@ WlxGetOption( DWORD Option, ULONG_PTR* Value) { - PMSGINAINSTANCE Instance = (PMSGINAINSTANCE)hWlx; - UNIMPLEMENTED; + PWLSESSION Session = (PWLSESSION)hWlx; - if (Instance || !Value) + switch (Option) { - switch (Option) + case WLX_OPTION_USE_CTRL_ALT_DEL: + *Value = (ULONG_PTR)Session->Gina.UseCtrlAltDelete; + return TRUE; + case WLX_OPTION_CONTEXT_POINTER: { - case WLX_OPTION_USE_CTRL_ALT_DEL: - return TRUE; - case WLX_OPTION_CONTEXT_POINTER: - { - *Value = (ULONG_PTR)Instance->Context; - return TRUE; - } - case WLX_OPTION_USE_SMART_CARD: - case WLX_OPTION_SMART_CARD_PRESENT: - case WLX_OPTION_SMART_CARD_INFO: - *Value = 0; - return FALSE; - case WLX_OPTION_DISPATCH_TABLE_SIZE: - { - switch (Instance->Version) + *Value = (ULONG_PTR)Session->Gina.Context; + return TRUE; + } + case WLX_OPTION_USE_SMART_CARD: + case WLX_OPTION_SMART_CARD_PRESENT: + case WLX_OPTION_SMART_CARD_INFO: + UNIMPLEMENTED; + return FALSE; + case WLX_OPTION_DISPATCH_TABLE_SIZE: + { + switch (Session->Gina.Version) { case WLX_VERSION_1_0: *Value = sizeof(WLX_DISPATCH_VERSION_1_0); @@ -387,9 +374,8 @@ WlxGetOption( break; default: return FALSE; - } - return TRUE; } + return TRUE; } } @@ -516,7 +502,7 @@ GetGinaPath( DWORD Type, Size; HKEY hKey; - Status = RegOpenKeyEx( + Status = RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", 0, @@ -530,7 +516,7 @@ GetGinaPath( } Size = Len * sizeof(WCHAR); - Status = RegQueryValueEx( + Status = RegQueryValueExW( hKey, L"GinaDLL", NULL, @@ -543,74 +529,30 @@ GetGinaPath( return TRUE; } -static INT_PTR CALLBACK -GinaLoadFailedWindowProc( - 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); - break; - } - break; - } - case WM_INITDIALOG: - { - int len; - WCHAR templateText[MAX_PATH], text[MAX_PATH]; - - len = GetDlgItemText(hwndDlg, IDC_GINALOADFAILED, templateText, MAX_PATH); - if (len) - { - wsprintf(text, templateText, (LPWSTR)lParam); - SetDlgItemText(hwndDlg, IDC_GINALOADFAILED, text); - } - SetFocus(GetDlgItem(hwndDlg, IDOK)); - break; - } - case WM_CLOSE: - { - EndDialog(hwndDlg, IDCANCEL); - return TRUE; - } - } - - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); -} - -#define FAIL_AND_RETURN() return DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), 0, GinaLoadFailedWindowProc, (LPARAM)GinaDll) && FALSE static BOOL LoadGina( - IN OUT PMSGINAFUNCTIONS Functions, + IN OUT PGINAFUNCTIONS Functions, OUT DWORD *DllVersion, OUT HMODULE *GinaInstance) { - HMODULE hGina; + HMODULE hGina = NULL; WCHAR GinaDll[MAX_PATH + 1]; + BOOL ret = FALSE; GinaDll[0] = '\0'; if (!GetGinaPath(GinaDll, MAX_PATH)) - FAIL_AND_RETURN(); + goto cleanup; /* Terminate string */ GinaDll[MAX_PATH] = '\0'; - if (!(hGina = LoadLibrary(GinaDll))) - FAIL_AND_RETURN(); - *GinaInstance = hGina; + if (!(hGina = LoadLibraryW(GinaDll))) + goto cleanup; Functions->WlxNegotiate = (PFWLXNEGOTIATE)GetProcAddress(hGina, "WlxNegotiate"); Functions->WlxInitialize = (PFWLXINITIALIZE)GetProcAddress(hGina, "WlxInitialize"); if (!Functions->WlxInitialize) - FAIL_AND_RETURN(); + goto cleanup; if (!Functions->WlxNegotiate) { @@ -618,55 +560,64 @@ LoadGina( *DllVersion = WLX_CURRENT_VERSION; } else if (!Functions->WlxNegotiate(WLX_CURRENT_VERSION, DllVersion)) - FAIL_AND_RETURN(); + goto cleanup; if (*DllVersion >= WLX_VERSION_1_0) { Functions->WlxActivateUserShell = (PFWLXACTIVATEUSERSHELL)GetProcAddress(hGina, "WlxActivateUserShell"); - if (!Functions->WlxActivateUserShell) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxDisplayLockedNotice = (PFWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hGina, "WlxDisplayLockedNotice"); - if (!Functions->WlxDisplayLockedNotice) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxDisplaySASNotice = (PFWLXDISPLAYSASNOTICE)GetProcAddress(hGina, "WlxDisplaySASNotice"); - if (!Functions->WlxDisplaySASNotice) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxIsLockOk = (PFWLXISLOCKOK)GetProcAddress(hGina, "WlxIsLockOk"); - if (!Functions->WlxIsLockOk) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxIsLogoffOk = (PFWLXISLOGOFFOK)GetProcAddress(hGina, "WlxIsLogoffOk"); - if (!Functions->WlxIsLogoffOk) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxLoggedOnSAS = (PFWLXLOGGEDONSAS)GetProcAddress(hGina, "WlxLoggedOnSAS"); - if (!Functions->WlxLoggedOnSAS) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxLoggedOutSAS = (PFWLXLOGGEDOUTSAS)GetProcAddress(hGina, "WlxLoggedOutSAS"); - if (!Functions->WlxLoggedOutSAS) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxLogoff = (PFWLXLOGOFF)GetProcAddress(hGina, "WlxLogoff"); - if (!Functions->WlxLogoff) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxShutdown = (PFWLXSHUTDOWN)GetProcAddress(hGina, "WlxShutdown"); - if (!Functions->WlxShutdown) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxWkstaLockedSAS = (PFWLXWKSTALOCKEDSAS)GetProcAddress(hGina, "WlxWkstaLockedSAS"); - if (!Functions->WlxWkstaLockedSAS) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; } if (*DllVersion >= WLX_VERSION_1_1) { Functions->WlxScreenSaverNotify = (PFWLXSCREENSAVERNOTIFY)GetProcAddress(hGina, "WlxScreenSaverNotify"); - if (!Functions->WlxScreenSaverNotify) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxStartApplication = (PFWLXSTARTAPPLICATION)GetProcAddress(hGina, "WlxStartApplication"); - if (!Functions->WlxStartApplication) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; } if (*DllVersion >= WLX_VERSION_1_3) { Functions->WlxDisplayStatusMessage = (PFWLXDISPLAYSTATUSMESSAGE)GetProcAddress(hGina, "WlxDisplayStatusMessage"); - if (!Functions->WlxDisplayStatusMessage) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxGetStatusMessage = (PFWLXGETSTATUSMESSAGE)GetProcAddress(hGina, "WlxGetStatusMessage"); - if (!Functions->WlxGetStatusMessage) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD)GetProcAddress(hGina, "WlxNetworkProviderLoad"); - if (!Functions->WlxNetworkProviderLoad) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; Functions->WlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE)GetProcAddress(hGina, "WlxRemoveStatusMessage"); - if (!Functions->WlxRemoveStatusMessage) FAIL_AND_RETURN(); + if (!Functions->WlxActivateUserShell) goto cleanup; } - return TRUE; + ret = TRUE; + +cleanup: + if (!ret) + { + if (hGina) + FreeLibrary(hGina); + } + else + *GinaInstance = hGina; + return ret; } -#undef FAIL_AND_RETURN BOOL GinaInit( @@ -674,20 +625,21 @@ GinaInit( { DWORD GinaDllVersion; - if (!LoadGina(&Session->MsGina.Functions, &GinaDllVersion, &Session->MsGina.hDllInstance)) + if (!LoadGina(&Session->Gina.Functions, &GinaDllVersion, &Session->Gina.hDllInstance)) return FALSE; - Session->MsGina.Context = NULL; - Session->MsGina.Version = GinaDllVersion; + Session->Gina.Context = NULL; + Session->Gina.Version = GinaDllVersion; + Session->Gina.UseCtrlAltDelete = FALSE; Session->SuppressStatus = FALSE; PreviousWindowProc = NULL; - return Session->MsGina.Functions.WlxInitialize( + return Session->Gina.Functions.WlxInitialize( Session->InteractiveWindowStationName, (HANDLE)Session, NULL, (PVOID)&FunctionTable, - &Session->MsGina.Context); + &Session->Gina.Context); } BOOL @@ -698,7 +650,7 @@ CreateWindowStationAndDesktops( * Create the interactive window station */ Session->InteractiveWindowStationName = L"WinSta0"; - Session->InteractiveWindowStation = CreateWindowStation( + Session->InteractiveWindowStation = CreateWindowStationW( Session->InteractiveWindowStationName, 0, WINSTA_CREATEDESKTOP, @@ -713,7 +665,7 @@ CreateWindowStationAndDesktops( /* * Create the application desktop */ - Session->ApplicationDesktop = CreateDesktop( + Session->ApplicationDesktop = CreateDesktopW( L"Default", NULL, NULL, @@ -729,7 +681,7 @@ CreateWindowStationAndDesktops( /* * Create the winlogon desktop */ - Session->WinlogonDesktop = CreateDesktop( + Session->WinlogonDesktop = CreateDesktopW( L"Winlogon", NULL, NULL, @@ -745,7 +697,7 @@ CreateWindowStationAndDesktops( /* * Create the screen saver desktop */ - Session->ScreenSaverDesktop = CreateDesktop( + Session->ScreenSaverDesktop = CreateDesktopW( L"Screen-Saver", NULL, NULL,