mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +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(
|
||||
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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
<!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">
|
||||
<module name="winlogon" type="win32gui" installbase="system32" installname="winlogon.exe">
|
||||
<include base="winlogon">.</include>
|
||||
<define name="UNICODE" />
|
||||
<define name="_UNICODE" />
|
||||
<define name="__USE_W32API" />
|
||||
<library>ntdll</library>
|
||||
<library>kernel32</library>
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue