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