mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
Implement shutdown and unlocking
Remove some useless code Implement Timeout for dialogs svn path=/trunk/; revision=23433
This commit is contained in:
parent
21ea0d9494
commit
e202c810ac
4 changed files with 113 additions and 189 deletions
|
@ -28,35 +28,11 @@ static BOOL
|
|||
StartTaskManager(
|
||||
IN OUT PWLSESSION Session)
|
||||
{
|
||||
STARTUPINFO StartupInfo;
|
||||
PROCESS_INFORMATION ProcessInformation;
|
||||
|
||||
if (Session->LogonStatus == WKSTA_IS_LOGGED_OFF)
|
||||
return FALSE;
|
||||
|
||||
StartupInfo.cb = sizeof(StartupInfo);
|
||||
StartupInfo.lpReserved = NULL;
|
||||
StartupInfo.lpDesktop = NULL;
|
||||
StartupInfo.lpTitle = NULL;
|
||||
StartupInfo.dwFlags = 0;
|
||||
StartupInfo.cbReserved2 = 0;
|
||||
StartupInfo.lpReserved2 = 0;
|
||||
|
||||
CreateProcessW(
|
||||
L"taskmgr.exe",
|
||||
return Session->MsGina.Functions.WlxStartApplication(
|
||||
Session->MsGina.Context,
|
||||
L"Default",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS,
|
||||
NULL,
|
||||
NULL,
|
||||
&StartupInfo,
|
||||
&ProcessInformation);
|
||||
|
||||
CloseHandle (ProcessInformation.hProcess);
|
||||
CloseHandle (ProcessInformation.hThread);
|
||||
return TRUE;
|
||||
L"taskmgr.exe");
|
||||
}
|
||||
|
||||
static BOOL
|
||||
|
@ -107,25 +83,31 @@ HandleLogon(
|
|||
|
||||
return Session->MsGina.Functions.WlxActivateUserShell(
|
||||
Session->MsGina.Context,
|
||||
L"WinSta0\\Default",//NULL, /* FIXME */
|
||||
L"Default",//NULL, /* FIXME */
|
||||
NULL, /* FIXME */
|
||||
lpEnvironment);
|
||||
}
|
||||
|
||||
static BOOL
|
||||
static VOID
|
||||
HandleLogoff(
|
||||
IN OUT PWLSESSION Session)
|
||||
{
|
||||
FIXME("FIXME: HandleLogoff() unimplemented\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
HandleShutdown(
|
||||
IN OUT PWLSESSION Session)
|
||||
IN OUT PWLSESSION Session,
|
||||
IN DWORD wlxAction)
|
||||
{
|
||||
FIXME("FIXME: HandleShutdown() unimplemented\n");
|
||||
return FALSE;
|
||||
if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT)
|
||||
NtShutdownSystem(ShutdownReboot);
|
||||
else if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_POWER_OFF)
|
||||
NtShutdownSystem(ShutdownPowerOff);
|
||||
else
|
||||
NtShutdownSystem(ShutdownNoReboot);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static VOID
|
||||
|
@ -138,8 +120,8 @@ DoGenericAction(
|
|||
case WLX_SAS_ACTION_LOGON: /* 0x01 */
|
||||
if (HandleLogon(Session))
|
||||
{
|
||||
SwitchDesktop(Session->ApplicationDesktop);
|
||||
Session->LogonStatus = WKSTA_IS_LOGGED_ON;
|
||||
SwitchDesktop(WLSession->ApplicationDesktop);
|
||||
}
|
||||
break;
|
||||
case WLX_SAS_ACTION_NONE: /* 0x02 */
|
||||
|
@ -154,6 +136,8 @@ DoGenericAction(
|
|||
break;
|
||||
case WLX_SAS_ACTION_LOGOFF: /* 0x04 */
|
||||
case WLX_SAS_ACTION_SHUTDOWN: /* 0x05 */
|
||||
case WLX_SAS_ACTION_SHUTDOWN_POWER_OFF: /* 0x0a */
|
||||
case WLX_SAS_ACTION_SHUTDOWN_REBOOT: /* 0x0b */
|
||||
if (Session->LogonStatus != WKSTA_IS_LOGGED_OFF)
|
||||
{
|
||||
if (!Session->MsGina.Functions.WlxIsLogoffOk(Session->MsGina.Context))
|
||||
|
@ -165,11 +149,16 @@ DoGenericAction(
|
|||
Session->MsGina.Functions.WlxDisplaySASNotice(Session->MsGina.Context);
|
||||
}
|
||||
if (WLX_SHUTTINGDOWN(wlxAction))
|
||||
HandleShutdown(Session);
|
||||
HandleShutdown(Session, wlxAction);
|
||||
break;
|
||||
case WLX_SAS_ACTION_TASKLIST: /* 0x07 */
|
||||
SwitchDesktop(WLSession->ApplicationDesktop);
|
||||
StartTaskManager(Session);
|
||||
break;
|
||||
case WLX_SAS_ACTION_UNLOCK_WKSTA: /* 0x08 */
|
||||
SwitchDesktop(WLSession->ApplicationDesktop);
|
||||
Session->LogonStatus = WKSTA_IS_LOGGED_ON;
|
||||
break;
|
||||
default:
|
||||
WARN("Unknown SAS action 0x%lx\n", wlxAction);
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ ShutdownComputerWindowProc(
|
|||
}
|
||||
|
||||
static BOOL
|
||||
StartServicesManager(void)
|
||||
StartServicesManager(VOID)
|
||||
{
|
||||
HANDLE ServicesInitEvent;
|
||||
BOOLEAN Result;
|
||||
|
@ -182,6 +182,7 @@ StartLsass(VOID)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static BOOL
|
||||
OpenRegistryKey(
|
||||
OUT HKEY *WinLogonKey)
|
||||
|
@ -192,6 +193,7 @@ OpenRegistryKey(
|
|||
KEY_QUERY_VALUE,
|
||||
WinLogonKey);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static BOOL
|
||||
|
@ -228,7 +230,8 @@ StartProcess(
|
|||
#endif
|
||||
|
||||
/*
|
||||
static BOOL RestartShell(void)
|
||||
static BOOL RestartShell(
|
||||
IN OUT PWLSESSION Session)
|
||||
{
|
||||
HKEY WinLogonKey;
|
||||
DWORD Type, Size, Value;
|
||||
|
@ -255,6 +258,7 @@ static BOOL RestartShell(void)
|
|||
}
|
||||
*/
|
||||
|
||||
#if 0
|
||||
static PWCHAR
|
||||
GetUserInit(
|
||||
OUT WCHAR *CommandLine,
|
||||
|
@ -300,8 +304,7 @@ GetUserInit(
|
|||
return CommandLine;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
static BOOL
|
||||
DoBrokenLogonUser(
|
||||
IN PWLSESSION WLSession,
|
||||
IN PWLX_MPR_NOTIFY_INFO pMprNotifyInfo)
|
||||
|
@ -423,6 +426,7 @@ DoBrokenLogonUser(
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static BOOL
|
||||
DisplayStatusMessage(
|
||||
|
@ -441,70 +445,6 @@ DisplayStatusMessage(
|
|||
return Session->MsGina.Functions.WlxDisplayStatusMessage(Session->MsGina.Context, hDesktop, 0, NULL, StatusMsg);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static BOOL
|
||||
InitServices(VOID)
|
||||
{
|
||||
/*WCHAR StatusMsg[256];
|
||||
|
||||
LoadString(hAppInstance, IDS_REACTOSISSTARTINGUP, StatusMsg, 256 * sizeof(WCHAR));
|
||||
DisplayStatusMessage(WLSession, WLSession->ApplicationDesktop, 0, NULL, StatusMsg);*/
|
||||
|
||||
/* start system processes (services.exe & lsass.exe) */
|
||||
if(StartProcess(L"StartServices"))
|
||||
{
|
||||
if(!StartServicesManager())
|
||||
{
|
||||
DPRINT1("WL: Failed to start Services (0x%X)\n", GetLastError());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("WL: StartProcess() failed!\n");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static DWORD
|
||||
DoLogin(
|
||||
IN OUT PWLSESSION Session)
|
||||
{
|
||||
DWORD WlxAction, Options;
|
||||
WLX_MPR_NOTIFY_INFO MprNotifyInfo;
|
||||
PWLX_PROFILE_V2_0 Profile;
|
||||
PSID LogonSid = NULL;
|
||||
HANDLE Token;
|
||||
|
||||
/* FIXME - Create a Logon Sid
|
||||
if(!(LogonSid = CreateUserLogonSid(NULL)))
|
||||
{
|
||||
return WLX_SAS_ACTION_NONE;
|
||||
}
|
||||
*/
|
||||
|
||||
Options = 0;
|
||||
WlxAction = Session->MsGina.Functions.WlxLoggedOutSAS(Session->MsGina.Context,
|
||||
Session->SASAction,
|
||||
&Session->LogonId,
|
||||
LogonSid,
|
||||
&Options,
|
||||
&Token,
|
||||
&MprNotifyInfo,
|
||||
(PVOID*)&Profile);
|
||||
|
||||
if (WlxAction == WLX_SAS_ACTION_LOGON)
|
||||
{
|
||||
Session->UserToken = Token;
|
||||
if (!DoBrokenLogonUser(Session, &MprNotifyInfo))
|
||||
WlxAction = WLX_SAS_ACTION_NONE;
|
||||
}
|
||||
return WlxAction;
|
||||
}
|
||||
#endif
|
||||
|
||||
static VOID
|
||||
SessionLoop(
|
||||
IN OUT PWLSESSION Session)
|
||||
|
@ -526,73 +466,20 @@ SessionLoop(
|
|||
|
||||
/* Don't go there! */
|
||||
|
||||
#if 0
|
||||
/* FIXME - don't leave the loop when suspending the computer */
|
||||
if(WLX_SUSPENDING(WlxAction))
|
||||
{
|
||||
Session->LogonStatus = LOGON_NONE;
|
||||
WlxAction = WLX_SAS_ACTION_NONE;
|
||||
/* don't leave the loop */
|
||||
continue;
|
||||
}
|
||||
|
||||
if(WLX_SHUTTINGDOWN(WlxAction))
|
||||
{
|
||||
Session->LogonStatus = LOGON_SHUTDOWN;
|
||||
/* leave the loop here */
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
LoadString(hAppInstance, IDS_PREPARENETWORKCONNECTIONS, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
|
||||
Sleep(150);
|
||||
|
||||
LoadString(hAppInstance, IDS_APPLYINGCOMPUTERSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
|
||||
Sleep(150);
|
||||
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
|
||||
|
||||
Sleep(250);
|
||||
|
||||
LoadString(hAppInstance, IDS_LOADINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_LOADINGYOURPERSONALSETTINGS);
|
||||
Sleep(150);
|
||||
|
||||
LoadString(hAppInstance, IDS_APPLYINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGYOURPERSONALSETTINGS);
|
||||
Sleep(150);
|
||||
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
RemoveStatusMessage(Session);
|
||||
|
||||
if(!MsGinaInst->Functions->WlxActivateUserShell(MsGinaInst->Context,
|
||||
L"WinSta0\\Default",
|
||||
|
@ -604,34 +491,19 @@ SessionLoop(
|
|||
SetEvent(hShutdownEvent);
|
||||
}
|
||||
|
||||
|
||||
WaitForSingleObject(hShutdownEvent, INFINITE);
|
||||
CloseHandle(hShutdownEvent);
|
||||
|
||||
LoadString(hAppInstance, IDS_SAVEYOURSETTINGS, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_SAVEYOURSETTINGS);
|
||||
|
||||
Sleep(150);
|
||||
|
||||
MsGinaInst->Functions->WlxShutdown(MsGinaInst->Context, WLX_SAS_ACTION_SHUTDOWN);
|
||||
|
||||
LoadString(hAppInstance, IDS_REACTOSISSHUTTINGDOWN, StatusMsg, 256 * sizeof(WCHAR));
|
||||
MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context,
|
||||
ApplicationDesktop,
|
||||
0,
|
||||
NULL,
|
||||
StatusMsg);
|
||||
|
||||
DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_REACTOSISSHUTTINGDOWN);
|
||||
|
||||
Sleep(250);
|
||||
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context);
|
||||
RemoveStatusMessage(Session);
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -668,6 +540,7 @@ WinMain(
|
|||
ExitProcess(1);
|
||||
return 1;
|
||||
}
|
||||
WLSession->DialogTimeout = 120; /* 2 minutes */
|
||||
|
||||
if (!CreateWindowStationAndDesktops(WLSession))
|
||||
{
|
||||
|
@ -675,6 +548,7 @@ WinMain(
|
|||
ExitProcess(1);
|
||||
return 1;
|
||||
}
|
||||
LockWorkstation(WLSession);
|
||||
|
||||
/* Check for pending setup */
|
||||
if (GetSetupType() != 0)
|
||||
|
@ -682,6 +556,7 @@ WinMain(
|
|||
DPRINT("Winlogon: CheckForSetup() in setup mode\n");
|
||||
|
||||
/* Run setup and reboot when done */
|
||||
RemoveStatusMessage(WLSession);
|
||||
SwitchDesktop(WLSession->ApplicationDesktop);
|
||||
RunSetup();
|
||||
|
||||
|
|
|
@ -114,6 +114,9 @@ typedef struct _MSGINAINSTANCE
|
|||
#define WKSTA_IS_LOGGED_ON 1
|
||||
#define WKSTA_IS_LOCKED 2
|
||||
|
||||
#define LockWorkstation(Session)
|
||||
#define UnlockWorkstation(Session)
|
||||
|
||||
typedef struct _WLSESSION
|
||||
{
|
||||
MSGINAINSTANCE MsGina;
|
||||
|
@ -130,6 +133,8 @@ typedef struct _WLSESSION
|
|||
LUID LogonId;
|
||||
HANDLE UserToken;
|
||||
|
||||
DWORD DialogTimeout; /* Timeout for dialog boxes, in seconds */
|
||||
|
||||
/* Logon informations */
|
||||
DWORD Options;
|
||||
WLX_MPR_NOTIFY_INFO MprNotifyInfo;
|
||||
|
|
|
@ -15,9 +15,49 @@
|
|||
#define YDEBUG
|
||||
#include <wine/debug.h>
|
||||
|
||||
//#define UNIMPLEMENTED DbgPrint("WL: %S() at %S:%i unimplemented!\n", __FUNCTION__, __FILE__, __LINE__)
|
||||
static DLGPROC PreviousWindowProc;
|
||||
static UINT_PTR IdTimer;
|
||||
|
||||
#define WINLOGON_DESKTOP L"Winlogon"
|
||||
static INT_PTR CALLBACK
|
||||
DefaultWlxWindowProc(
|
||||
IN HWND hwndDlg,
|
||||
IN UINT uMsg,
|
||||
IN WPARAM wParam,
|
||||
IN LPARAM lParam)
|
||||
{
|
||||
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;
|
||||
}
|
||||
else if (uMsg == WM_NCDESTROY)
|
||||
{
|
||||
CHECKPOINT1;
|
||||
PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
||||
CHECKPOINT1;
|
||||
PreviousWindowProc = NULL;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
INT_PTR ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
||||
ret = PreviousWindowProc(hwndDlg, uMsg, wParam, lParam);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
@ -52,15 +92,16 @@ WlxSasNotify(
|
|||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
BOOL WINAPI
|
||||
WlxSetTimeout(
|
||||
HANDLE hWlx,
|
||||
DWORD Timeout)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
PWLSESSION Session = (PWLSESSION)hWlx;
|
||||
Session->DialogTimeout = Timeout;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -88,6 +129,7 @@ WlxMessageBox(
|
|||
LPWSTR lpszTitle,
|
||||
UINT fuStyle)
|
||||
{
|
||||
/* FIXME: Provide a custom window proc to be able to handle timeout */
|
||||
return MessageBoxW(hwndOwner, lpszText, lpszTitle, fuStyle);
|
||||
}
|
||||
|
||||
|
@ -102,7 +144,10 @@ WlxDialogBox(
|
|||
HWND hwndOwner,
|
||||
DLGPROC dlgprc)
|
||||
{
|
||||
return (int)DialogBox(hInst, lpszTemplate, hwndOwner, dlgprc);
|
||||
if (PreviousWindowProc != NULL)
|
||||
return -1;
|
||||
PreviousWindowProc = dlgprc;
|
||||
return (int)DialogBox(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -117,7 +162,10 @@ WlxDialogBoxParam(
|
|||
DLGPROC dlgprc,
|
||||
LPARAM dwInitParam)
|
||||
{
|
||||
return (int)DialogBoxParam(hInst, lpszTemplate, hwndOwner, dlgprc, dwInitParam);
|
||||
if (PreviousWindowProc != NULL)
|
||||
return -1;
|
||||
PreviousWindowProc = dlgprc;
|
||||
return (int)DialogBoxParam(hInst, lpszTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -131,7 +179,10 @@ WlxDialogBoxIndirect(
|
|||
HWND hwndOwner,
|
||||
DLGPROC dlgprc)
|
||||
{
|
||||
return (int)DialogBoxIndirect(hInst, hDialogTemplate, hwndOwner, dlgprc);
|
||||
if (PreviousWindowProc != NULL)
|
||||
return -1;
|
||||
PreviousWindowProc = dlgprc;
|
||||
return (int)DialogBoxIndirect(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -146,7 +197,10 @@ WlxDialogBoxIndirectParam(
|
|||
DLGPROC dlgprc,
|
||||
LPARAM dwInitParam)
|
||||
{
|
||||
return (int)DialogBoxIndirectParam(hInst, hDialogTemplate, hwndOwner, dlgprc, dwInitParam);
|
||||
if (PreviousWindowProc != NULL)
|
||||
return -1;
|
||||
PreviousWindowProc = dlgprc;
|
||||
return (int)DialogBoxIndirectParam(hInst, hDialogTemplate, hwndOwner, DefaultWlxWindowProc, dwInitParam);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -626,6 +680,7 @@ GinaInit(
|
|||
Session->MsGina.Context = NULL;
|
||||
Session->MsGina.Version = GinaDllVersion;
|
||||
Session->SuppressStatus = FALSE;
|
||||
PreviousWindowProc = NULL;
|
||||
|
||||
return Session->MsGina.Functions.WlxInitialize(
|
||||
Session->InteractiveWindowStationName,
|
||||
|
@ -675,7 +730,7 @@ CreateWindowStationAndDesktops(
|
|||
* Create the winlogon desktop
|
||||
*/
|
||||
Session->WinlogonDesktop = CreateDesktop(
|
||||
WINLOGON_DESKTOP,
|
||||
L"Winlogon",
|
||||
NULL,
|
||||
NULL,
|
||||
0, /* FIXME: Set some flags */
|
||||
|
|
Loading…
Reference in a new issue