[MSIEXEC] Sync with Wine Staging 2.16. CORE-13762
[reactos.git] / base / system / winlogon / winlogon.h
index f344fe3..f54ac7a 100644 (file)
@@ -18,7 +18,7 @@
  */
 /* COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS winlogon
- * FILE:            subsys/system/winlogon/winlogon.h
+ * FILE:            base/system/winlogon/winlogon.h
  * PURPOSE:         Winlogon
  * PROGRAMMER:
  */
 #ifndef __WINLOGON_MAIN_H__
 #define __WINLOGON_MAIN_H__
 
+#include <stdarg.h>
+
 #define USE_GETLASTINPUTINFO
 
 #define WIN32_NO_STATUS
-#include <stdio.h>
-#include <windows.h>
-#include <userenv.h>
+#include <windef.h>
+#include <winbase.h>
+#include <wingdi.h>
+#include <winuser.h>
+#include <winreg.h>
 #include <winwlx.h>
-#include <cmfuncs.h>
-#include <rtlfuncs.h>
-#include <exfuncs.h>
-#include <setypes.h>
-#include <sefuncs.h>
-#include <ntsecapi.h>
-#include <accctrl.h>
-#include <aclapi.h>
+#include <ndk/rtlfuncs.h>
+#include <ndk/exfuncs.h>
 #include <strsafe.h>
 
 #include <reactos/undocuser.h>
-#include <reactos/winlogon.h>
 
-#include "setup.h"
+#include <wine/debug.h>
+WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
+
 #include "resource.h"
 
 typedef BOOL (WINAPI * PFWLXNEGOTIATE)  (DWORD, DWORD *);
@@ -78,92 +77,185 @@ typedef BOOL (WINAPI * PFWLXREMOVESTATUSMESSAGE) (PVOID);
 
 typedef struct _GINAFUNCTIONS
 {
-       /* Functions always available for a valid GINA */
-       PFWLXNEGOTIATE            WlxNegotiate; /* optional */
-       PFWLXINITIALIZE           WlxInitialize;
-
-       /* Functions available if WlxVersion >= WLX_VERSION_1_0 (MS Windows 3.5.0) */
-       PFWLXDISPLAYSASNOTICE     WlxDisplaySASNotice;
-       PFWLXLOGGEDOUTSAS         WlxLoggedOutSAS;
-       PFWLXACTIVATEUSERSHELL    WlxActivateUserShell;
-       PFWLXLOGGEDONSAS          WlxLoggedOnSAS;
-       PFWLXDISPLAYLOCKEDNOTICE  WlxDisplayLockedNotice;
-       PFWLXWKSTALOCKEDSAS       WlxWkstaLockedSAS;
-       PFWLXISLOCKOK             WlxIsLockOk;
-       PFWLXISLOGOFFOK           WlxIsLogoffOk;
-       PFWLXLOGOFF               WlxLogoff;
-       PFWLXSHUTDOWN             WlxShutdown;
-
-       /* Functions available if WlxVersion >= WLX_VERSION_1_1 (MS Windows 3.5.1) */
-       PFWLXSCREENSAVERNOTIFY    WlxScreenSaverNotify; /* optional */
-       PFWLXSTARTAPPLICATION     WlxStartApplication; /* optional */
-
-       /* Functions available if WlxVersion >= WLX_VERSION_1_2 (MS Windows NT 4.0) */
-
-       /* Functions available if WlxVersion >= WLX_VERSION_1_3 (MS Windows 2000) */
-       PFWLXNETWORKPROVIDERLOAD  WlxNetworkProviderLoad; /* not called ATM */
-       PFWLXDISPLAYSTATUSMESSAGE WlxDisplayStatusMessage;
-       PFWLXGETSTATUSMESSAGE     WlxGetStatusMessage; /* doesn't need to be called */
-       PFWLXREMOVESTATUSMESSAGE  WlxRemoveStatusMessage;
-
-       /* Functions available if WlxVersion >= WLX_VERSION_1_4 (MS Windows XP) */
+    /* Functions always available for a valid GINA */
+    PFWLXNEGOTIATE            WlxNegotiate; /* optional */
+    PFWLXINITIALIZE           WlxInitialize;
+
+    /* Functions available if WlxVersion >= WLX_VERSION_1_0 (MS Windows 3.5.0) */
+    PFWLXDISPLAYSASNOTICE     WlxDisplaySASNotice;
+    PFWLXLOGGEDOUTSAS         WlxLoggedOutSAS;
+    PFWLXACTIVATEUSERSHELL    WlxActivateUserShell;
+    PFWLXLOGGEDONSAS          WlxLoggedOnSAS;
+    PFWLXDISPLAYLOCKEDNOTICE  WlxDisplayLockedNotice;
+    PFWLXWKSTALOCKEDSAS       WlxWkstaLockedSAS;
+    PFWLXISLOCKOK             WlxIsLockOk;
+    PFWLXISLOGOFFOK           WlxIsLogoffOk;
+    PFWLXLOGOFF               WlxLogoff;
+    PFWLXSHUTDOWN             WlxShutdown;
+
+    /* Functions available if WlxVersion >= WLX_VERSION_1_1 (MS Windows 3.5.1) */
+    PFWLXSCREENSAVERNOTIFY    WlxScreenSaverNotify; /* optional */
+    PFWLXSTARTAPPLICATION     WlxStartApplication; /* optional */
+
+    /* Functions available if WlxVersion >= WLX_VERSION_1_2 (MS Windows NT 4.0) */
+
+    /* Functions available if WlxVersion >= WLX_VERSION_1_3 (MS Windows 2000) */
+    PFWLXNETWORKPROVIDERLOAD  WlxNetworkProviderLoad; /* not called ATM */
+    PFWLXDISPLAYSTATUSMESSAGE WlxDisplayStatusMessage;
+    PFWLXGETSTATUSMESSAGE     WlxGetStatusMessage; /* doesn't need to be called */
+    PFWLXREMOVESTATUSMESSAGE  WlxRemoveStatusMessage;
+
+    /* Functions available if WlxVersion >= WLX_VERSION_1_4 (MS Windows XP) */
 } GINAFUNCTIONS, *PGINAFUNCTIONS;
 
 typedef struct _GINAINSTANCE
 {
-       HMODULE hDllInstance;
-       GINAFUNCTIONS Functions;
-       PVOID Context;
-       DWORD Version;
-       BOOL UseCtrlAltDelete;
+    HMODULE hDllInstance;
+    GINAFUNCTIONS Functions;
+    PVOID Context;
+    DWORD Version;
+    BOOL UseCtrlAltDelete;
 } GINAINSTANCE, *PGINAINSTANCE;
 
-/* FIXME: put in an enum */
-/* See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/winlogon_states.asp */
-#define WKSTA_IS_LOGGED_OFF 0
-#define WKSTA_IS_LOGGED_ON  1
-#define WKSTA_IS_LOCKED     2
+
+/*
+ * The picture Microsoft is trying to paint here
+ * (http://msdn.microsoft.com/en-us/library/windows/desktop/aa380547%28v=vs.85%29.aspx)
+ * about the Winlogon states is a little too simple.
+ *
+ * The real picture should look more like this:
+ * 
+ * STATE_INIT
+ *    Initial state. Required for session initialization. After initialization,
+ *    the state will automatically change to STATE_LOGGED_OFF.
+ *
+ * STATE_LOGGED_OFF
+ *    User is logged off. Winlogon shows the "Press Ctrl-Alt-Del for logon"
+ *    dialog. The state changes to STATE_LOGGED_OFF_SAS when the user presses
+ *    "Ctrl-Alt-Del". If DisableCAD is true, the state will automatically
+ *    change to STATE_LOGGED_OFF_SAS without showing the dialog.
+ *
+ * STATE_LOGGED_OFF_SAS
+ *    State shows the logon dialog. Entering the right credentials and pressing
+ *    "OK" changes the state to STATE_LOGGED_ON. Pressing "Cancel" or a timeout
+ *    changes the state back to STATE_LOGGED_OFF.
+ *
+ * STATE_LOGGED_ON
+ *    User is logged on. Winlogon does not show any dialog. Pressing
+ *    "Ctrl-Alt-Del" changes the state to STATE_LOGGED_ON_SAS and user
+ *    inactivity changes the state to STATE_SCREENSAVER.
+ *
+ * STATE_LOGGED_ON_SAS
+ *    Winlogon shows the security dialog. Pressing "Cancel" or "Task Manager"
+ *    or a timeout change the state back to STATE_LOGGED_ON. Pressing "Change
+ *    Password" does not change the state, because the security dialog is still
+ *    visible behind the change password dialog. Pressing "Log off" changes the
+ *    state to STATE_LOGGING_OFF. Pressing "Lock Computer" changes the state to
+ *    STATE_LOCKED. Pressing "Shutdown" changes the state to
+ *    STATE_SHUTTING_DOWN.
+ *
+ * STATE_LOCKED
+ *    Winlogon shows the locked message dialog. When the user presses "Ctrl-
+ *    Alt-Del" the state changes to STATE_LOCKED_SAS. If DisableCAD is true,
+ *    the state will automatically change to STATE_LOCKED_SAS without showing
+ *    the dialog.
+ *
+ * STATE_LOCKED_SAS
+ *    Winlogon shows the unlock dialog. Pressing "Cancel" or a timeout will
+ *    change the state back to STATE_LOCKED. Entering the right credentials and
+ *    pressing "OK" unlocks the computer and changes the state to
+ *    STATE_LOGGED_ON.
+ *
+ * STATE_LOGGING_OFF
+ *    Winlogon shows the logoff dialog. Pressing "Cancel" or a timeout changes
+ *    the state back to STATE_LOGGED_ON_SAS. Pressing "OK" logs off the user
+ *    and changes the state to STATE_LOGGED_OFF.
+ *
+ * STATE_SHUTTING_DOWN
+ *    Winlogon shows the shutdown dialog. Pressing "Cancel" or a timeout will
+ *    change the state back to STATE_LOGGED_ON_SAS. Pressing "OK" will change
+ *    the state to STATE_SHUT_DOWN.
+ *
+ * STATE_SHUT_DOWN
+ *    Terminates Winlogon and initiates shut-down.
+ *
+ * STATE_SCREENSAVER
+ *    Winlogon runs the screen saver. Upon user activity, the screensaver
+ *    terminates and the state changes back to STATE_LOGGED_ON if the secure
+ *    screen saver option is off. Otherwise, the state changes to STATE_LOCKED.
+ */
+typedef enum _LOGON_STATE
+{
+    STATE_INIT,
+    STATE_LOGGED_OFF,
+    STATE_LOGGED_OFF_SAS,
+    STATE_LOGGED_ON,
+    STATE_LOGGED_ON_SAS,
+    STATE_LOCKED,
+    STATE_LOCKED_SAS,
+    STATE_LOGGING_OFF,     // not used yet
+    STATE_SHUTTING_DOWN,   // not used yet
+    STATE_SHUT_DOWN,       // not used yet
+    STATE_SCREENSAVER      // not used yet
+} LOGON_STATE, *PLOGON_STATE;
 
 #define LockWorkstation(Session)
 #define UnlockWorkstation(Session)
 
 typedef struct _WLSESSION
 {
-  GINAINSTANCE Gina;
-  DWORD SASAction;
-  BOOL SuppressStatus;
-  BOOL TaskManHotkey;
-  HWND SASWindow;
-  HWINSTA InteractiveWindowStation;
-  LPWSTR InteractiveWindowStationName;
-  HDESK ApplicationDesktop;
-  HDESK WinlogonDesktop;
-  HDESK ScreenSaverDesktop;
-  LUID LogonId;
-  HANDLE UserToken;
-  HANDLE hProfileInfo;
-  DWORD LogonStatus;
-  DWORD DialogTimeout; /* Timeout for dialog boxes, in seconds */
-
-  /* Screen-saver informations */
+    GINAINSTANCE Gina;
+    DWORD SASAction;
+    BOOL SuppressStatus;
+    BOOL TaskManHotkey;
+    HWND SASWindow;
+    HWINSTA InteractiveWindowStation;
+    LPWSTR InteractiveWindowStationName;
+    HDESK ApplicationDesktop;
+    HDESK WinlogonDesktop;
+    HDESK ScreenSaverDesktop;
+    LUID LogonId;
+    HANDLE UserToken;
+    HANDLE hProfileInfo;
+    LOGON_STATE LogonState;
+    DWORD DialogTimeout; /* Timeout for dialog boxes, in seconds */
+
+    /* Screen-saver informations */
 #ifndef USE_GETLASTINPUTINFO
-  HHOOK KeyboardHook;
-  HHOOK MouseHook;
+    HHOOK KeyboardHook;
+    HHOOK MouseHook;
 #endif
-  HANDLE hEndOfScreenSaverThread;
-  HANDLE hScreenSaverParametersChanged;
-  HANDLE hUserActivity;
-  HANDLE hEndOfScreenSaver;
+    HANDLE hEndOfScreenSaverThread;
+    HANDLE hScreenSaverParametersChanged;
+    HANDLE hUserActivity;
+    HANDLE hEndOfScreenSaver;
 #ifndef USE_GETLASTINPUTINFO
-  DWORD LastActivity;
+    DWORD LastActivity;
 #endif
 
-  /* Logon informations */
-  DWORD Options;
-  WLX_MPR_NOTIFY_INFO MprNotifyInfo;
-  WLX_PROFILE_V2_0 *Profile;
+    /* Logon informations */
+    DWORD Options;
+    WLX_MPR_NOTIFY_INFO MprNotifyInfo;
+    WLX_PROFILE_V2_0 *Profile;
 } WLSESSION, *PWLSESSION;
 
+typedef enum _NOTIFICATION_TYPE
+{
+    LogonHandler,
+    LogoffHandler,
+    LockHandler,
+    UnlockHandler,
+    StartupHandler,
+    ShutdownHandler,
+    StartScreenSaverHandler,
+    StopScreenSaverHandler,
+    DisconnectHandler,
+    ReconnectHandler,
+    StartShellHandler,
+    PostShellHandler,
+    LastHandler
+} NOTIFICATION_TYPE, *PNOTIFICATION_TYPE;
+
 extern HINSTANCE hAppInstance;
 extern PWLSESSION WLSession;
 
@@ -183,54 +275,73 @@ extern PWLSESSION WLSession;
 BOOL
 CreateUserEnvironment(IN PWLSESSION Session);
 
+/* notify.c */
+BOOL
+InitNotifications(VOID);
+
+VOID
+CleanupNotifications(VOID);
+
+VOID
+CallNotificationDlls(
+    PWLSESSION pSession,
+    NOTIFICATION_TYPE Type);
+
+/* rpcserver.c */
+BOOL
+StartRpcServer(VOID);
+
 /* sas.c */
 BOOL
-SetDefaultLanguage(
-       IN BOOL UserProfile);
+SetDefaultLanguage(IN PWLSESSION Session);
 
 BOOL
-InitializeSAS(
-       IN OUT PWLSESSION Session);
+InitializeSAS(IN OUT PWLSESSION Session);
 
 /* screensaver.c */
 BOOL
-InitializeScreenSaver(
-       IN OUT PWLSESSION Session);
+InitializeScreenSaver(IN OUT PWLSESSION Session);
 
 VOID
-StartScreenSaver(
-       IN PWLSESSION Session);
+StartScreenSaver(IN PWLSESSION Session);
 
-/* winlogon.c */
+/* setup.c */
+DWORD
+GetSetupType(VOID);
 
 BOOL
-PlaySoundRoutine(
-       IN LPCWSTR FileName,
-       IN UINT Logon,
-       IN UINT Flags);
+RunSetup(VOID);
 
+/* winlogon.c */
 BOOL
-DisplayStatusMessage(
-       IN PWLSESSION Session,
-       IN HDESK hDesktop,
-       IN UINT ResourceId);
+PlaySoundRoutine(IN LPCWSTR FileName,
+                 IN UINT Logon,
+                 IN UINT Flags);
 
 BOOL
-RemoveStatusMessage(
-       IN PWLSESSION Session);
+DisplayStatusMessage(IN PWLSESSION Session,
+                     IN HDESK hDesktop,
+                     IN UINT ResourceId);
+
+BOOL
+RemoveStatusMessage(IN PWLSESSION Session);
 
 /* wlx.c */
+VOID
+InitDialogListHead(VOID);
+
+HWND
+GetTopDialogWindow(VOID);
+
 BOOL
-GinaInit(
-       IN OUT PWLSESSION Session);
+GinaInit(IN OUT PWLSESSION Session);
+
 BOOL
-CreateWindowStationAndDesktops(
-       IN OUT PWLSESSION Session);
+CreateWindowStationAndDesktops(IN OUT PWLSESSION Session);
 
 NTSTATUS
-HandleShutdown(
-       IN OUT PWLSESSION Session,
-       IN DWORD wlxAction);
+HandleShutdown(IN OUT PWLSESSION Session,
+               IN DWORD wlxAction);
 
 VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx);
 VOID WINAPI WlxSetContextPointer(HANDLE hWlx, PVOID pWlxContext);
@@ -261,5 +372,3 @@ BOOL WINAPI WlxDisconnect(VOID);
 DWORD WINAPI WlxQueryTerminalServicesData(HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATA pTSData, WCHAR* UserName, WCHAR* Domain);
 
 #endif /* __WINLOGON_MAIN_H__ */
-
-/* EOF */