xref: /reactos/base/system/winlogon/winlogon.h (revision 234f89c0)
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 2003 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License along
16  *  with this program; if not, write to the Free Software Foundation, Inc.,
17  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /* COPYRIGHT:       See COPYING in the top level directory
20  * PROJECT:         ReactOS winlogon
21  * FILE:            base/system/winlogon/winlogon.h
22  * PURPOSE:         Winlogon
23  * PROGRAMMER:
24  */
25 
26 #ifndef __WINLOGON_MAIN_H__
27 #define __WINLOGON_MAIN_H__
28 
29 #include <stdarg.h>
30 
31 #define USE_GETLASTINPUTINFO
32 
33 #define WIN32_NO_STATUS
34 #include <windef.h>
35 #include <winbase.h>
36 #include <wingdi.h>
37 #include <winuser.h>
38 #include <winreg.h>
39 #include <winwlx.h>
40 #include <ndk/rtlfuncs.h>
41 #include <ndk/exfuncs.h>
42 #include <strsafe.h>
43 
44 #include <reactos/undocuser.h>
45 
46 #include <wine/debug.h>
47 WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
48 
49 #include "resource.h"
50 
51 typedef BOOL (WINAPI * PFWLXNEGOTIATE)  (DWORD, DWORD *);
52 typedef BOOL (WINAPI * PFWLXINITIALIZE) (LPWSTR, HANDLE, PVOID, PVOID, PVOID *);
53 typedef VOID (WINAPI * PFWLXDISPLAYSASNOTICE) (PVOID);
54 typedef int  (WINAPI * PFWLXLOGGEDOUTSAS) (PVOID, DWORD, PLUID, PSID, PDWORD,
55                                            PHANDLE, PWLX_MPR_NOTIFY_INFO,
56                                            PVOID *);
57 typedef BOOL (WINAPI * PFWLXACTIVATEUSERSHELL) (PVOID, PWSTR, PWSTR, PVOID);
58 typedef int  (WINAPI * PFWLXLOGGEDONSAS) (PVOID, DWORD, PVOID);
59 typedef VOID (WINAPI * PFWLXDISPLAYLOCKEDNOTICE) (PVOID);
60 typedef int  (WINAPI * PFWLXWKSTALOCKEDSAS) (PVOID, DWORD);
61 typedef BOOL (WINAPI * PFWLXISLOCKOK) (PVOID);
62 typedef BOOL (WINAPI * PFWLXISLOGOFFOK) (PVOID);
63 typedef VOID (WINAPI * PFWLXLOGOFF) (PVOID);
64 typedef VOID (WINAPI * PFWLXSHUTDOWN) (PVOID, DWORD);
65 
66 /* version 1.1 */
67 
68 typedef BOOL (WINAPI * PFWLXSCREENSAVERNOTIFY) (PVOID, BOOL *);
69 typedef BOOL (WINAPI * PFWLXSTARTAPPLICATION) (PVOID, PWSTR, PVOID, PWSTR);
70 
71 /* version 1.3 */
72 
73 typedef BOOL (WINAPI * PFWLXNETWORKPROVIDERLOAD) (PVOID, PWLX_MPR_NOTIFY_INFO);
74 typedef BOOL (WINAPI * PFWLXDISPLAYSTATUSMESSAGE) (PVOID, HDESK, DWORD, PWSTR, PWSTR);
75 typedef BOOL (WINAPI * PFWLXGETSTATUSMESSAGE) (PVOID, DWORD *, PWSTR, DWORD);
76 typedef BOOL (WINAPI * PFWLXREMOVESTATUSMESSAGE) (PVOID);
77 
78 typedef struct _GINAFUNCTIONS
79 {
80     /* Functions always available for a valid GINA */
81     PFWLXNEGOTIATE            WlxNegotiate; /* optional */
82     PFWLXINITIALIZE           WlxInitialize;
83 
84     /* Functions available if WlxVersion >= WLX_VERSION_1_0 (MS Windows 3.5.0) */
85     PFWLXDISPLAYSASNOTICE     WlxDisplaySASNotice;
86     PFWLXLOGGEDOUTSAS         WlxLoggedOutSAS;
87     PFWLXACTIVATEUSERSHELL    WlxActivateUserShell;
88     PFWLXLOGGEDONSAS          WlxLoggedOnSAS;
89     PFWLXDISPLAYLOCKEDNOTICE  WlxDisplayLockedNotice;
90     PFWLXWKSTALOCKEDSAS       WlxWkstaLockedSAS;
91     PFWLXISLOCKOK             WlxIsLockOk;
92     PFWLXISLOGOFFOK           WlxIsLogoffOk;
93     PFWLXLOGOFF               WlxLogoff;
94     PFWLXSHUTDOWN             WlxShutdown;
95 
96     /* Functions available if WlxVersion >= WLX_VERSION_1_1 (MS Windows 3.5.1) */
97     PFWLXSCREENSAVERNOTIFY    WlxScreenSaverNotify; /* optional */
98     PFWLXSTARTAPPLICATION     WlxStartApplication; /* optional */
99 
100     /* Functions available if WlxVersion >= WLX_VERSION_1_2 (MS Windows NT 4.0) */
101 
102     /* Functions available if WlxVersion >= WLX_VERSION_1_3 (MS Windows 2000) */
103     PFWLXNETWORKPROVIDERLOAD  WlxNetworkProviderLoad; /* not called ATM */
104     PFWLXDISPLAYSTATUSMESSAGE WlxDisplayStatusMessage;
105     PFWLXGETSTATUSMESSAGE     WlxGetStatusMessage; /* doesn't need to be called */
106     PFWLXREMOVESTATUSMESSAGE  WlxRemoveStatusMessage;
107 
108     /* Functions available if WlxVersion >= WLX_VERSION_1_4 (MS Windows XP) */
109 } GINAFUNCTIONS, *PGINAFUNCTIONS;
110 
111 typedef struct _GINAINSTANCE
112 {
113     HMODULE hDllInstance;
114     GINAFUNCTIONS Functions;
115     PVOID Context;
116     DWORD Version;
117     BOOL UseCtrlAltDelete;
118 } GINAINSTANCE, *PGINAINSTANCE;
119 
120 
121 /*
122  * The picture Microsoft is trying to paint here
123  * (http://msdn.microsoft.com/en-us/library/windows/desktop/aa380547%28v=vs.85%29.aspx)
124  * about the Winlogon states is a little too simple.
125  *
126  * The real picture should look more like this:
127  *
128  * STATE_INIT
129  *    Initial state. Required for session initialization. After initialization,
130  *    the state will automatically change to STATE_LOGGED_OFF.
131  *
132  * STATE_LOGGED_OFF
133  *    User is logged off. Winlogon shows the "Press Ctrl-Alt-Del for logon"
134  *    dialog. The state changes to STATE_LOGGED_OFF_SAS when the user presses
135  *    "Ctrl-Alt-Del". If DisableCAD is true, the state will automatically
136  *    change to STATE_LOGGED_OFF_SAS without showing the dialog.
137  *
138  * STATE_LOGGED_OFF_SAS
139  *    State shows the logon dialog. Entering the right credentials and pressing
140  *    "OK" changes the state to STATE_LOGGED_ON. Pressing "Cancel" or a timeout
141  *    changes the state back to STATE_LOGGED_OFF.
142  *
143  * STATE_LOGGED_ON
144  *    User is logged on. Winlogon does not show any dialog. Pressing
145  *    "Ctrl-Alt-Del" changes the state to STATE_LOGGED_ON_SAS and user
146  *    inactivity changes the state to STATE_SCREENSAVER.
147  *
148  * STATE_LOGGED_ON_SAS
149  *    Winlogon shows the security dialog. Pressing "Cancel" or "Task Manager"
150  *    or a timeout change the state back to STATE_LOGGED_ON. Pressing "Change
151  *    Password" does not change the state, because the security dialog is still
152  *    visible behind the change password dialog. Pressing "Log off" changes the
153  *    state to STATE_LOGGING_OFF. Pressing "Lock Computer" changes the state to
154  *    STATE_LOCKED. Pressing "Shutdown" changes the state to
155  *    STATE_SHUTTING_DOWN.
156  *
157  * STATE_LOCKED
158  *    Winlogon shows the locked message dialog. When the user presses "Ctrl-
159  *    Alt-Del" the state changes to STATE_LOCKED_SAS. If DisableCAD is true,
160  *    the state will automatically change to STATE_LOCKED_SAS without showing
161  *    the dialog.
162  *
163  * STATE_LOCKED_SAS
164  *    Winlogon shows the unlock dialog. Pressing "Cancel" or a timeout will
165  *    change the state back to STATE_LOCKED. Entering the right credentials and
166  *    pressing "OK" unlocks the computer and changes the state to
167  *    STATE_LOGGED_ON.
168  *
169  * STATE_LOGGING_OFF
170  *    Winlogon shows the logoff dialog. Pressing "Cancel" or a timeout changes
171  *    the state back to STATE_LOGGED_ON_SAS. Pressing "OK" logs off the user
172  *    and changes the state to STATE_LOGGED_OFF.
173  *
174  * STATE_SHUTTING_DOWN
175  *    Winlogon shows the shutdown dialog. Pressing "Cancel" or a timeout will
176  *    change the state back to STATE_LOGGED_ON_SAS. Pressing "OK" will change
177  *    the state to STATE_SHUT_DOWN.
178  *
179  * STATE_SHUT_DOWN
180  *    Terminates Winlogon and initiates shut-down.
181  *
182  * STATE_SCREENSAVER
183  *    Winlogon runs the screen saver. Upon user activity, the screensaver
184  *    terminates and the state changes back to STATE_LOGGED_ON if the secure
185  *    screen saver option is off. Otherwise, the state changes to STATE_LOCKED.
186  */
187 typedef enum _LOGON_STATE
188 {
189     STATE_INIT,
190     STATE_LOGGED_OFF,
191     STATE_LOGGED_OFF_SAS,
192     STATE_LOGGED_ON,
193     STATE_LOGGED_ON_SAS,
194     STATE_LOCKED,
195     STATE_LOCKED_SAS,
196     STATE_LOGGING_OFF,     // not used yet
197     STATE_SHUTTING_DOWN,   // not used yet
198     STATE_SHUT_DOWN,       // not used yet
199     STATE_SCREENSAVER      // not used yet
200 } LOGON_STATE, *PLOGON_STATE;
201 
202 #define LockWorkstation(Session)
203 #define UnlockWorkstation(Session)
204 
205 typedef struct _WLSESSION
206 {
207     GINAINSTANCE Gina;
208     DWORD SASAction;
209     BOOL SuppressStatus;
210     BOOL TaskManHotkey;
211     HWND SASWindow;
212     HWINSTA InteractiveWindowStation;
213     LPWSTR InteractiveWindowStationName;
214     HDESK ApplicationDesktop;
215     HDESK WinlogonDesktop;
216     HDESK ScreenSaverDesktop;
217     LUID LogonId;
218     HANDLE UserToken;
219     HANDLE hProfileInfo;
220     LOGON_STATE LogonState;
221     DWORD DialogTimeout; /* Timeout for dialog boxes, in seconds */
222 
223     /* Screen-saver informations */
224 #ifndef USE_GETLASTINPUTINFO
225     HHOOK KeyboardHook;
226     HHOOK MouseHook;
227 #endif
228     HANDLE hEndOfScreenSaverThread;
229     HANDLE hScreenSaverParametersChanged;
230     HANDLE hUserActivity;
231     HANDLE hEndOfScreenSaver;
232 #ifndef USE_GETLASTINPUTINFO
233     DWORD LastActivity;
234 #endif
235 
236     /* Logon informations */
237     DWORD Options;
238     WLX_MPR_NOTIFY_INFO MprNotifyInfo;
239     WLX_PROFILE_V2_0 *Profile;
240 } WLSESSION, *PWLSESSION;
241 
242 typedef enum _NOTIFICATION_TYPE
243 {
244     LogonHandler,
245     LogoffHandler,
246     LockHandler,
247     UnlockHandler,
248     StartupHandler,
249     ShutdownHandler,
250     StartScreenSaverHandler,
251     StopScreenSaverHandler,
252     DisconnectHandler,
253     ReconnectHandler,
254     StartShellHandler,
255     PostShellHandler,
256     LastHandler
257 } NOTIFICATION_TYPE, *PNOTIFICATION_TYPE;
258 
259 extern HINSTANCE hAppInstance;
260 extern PWLSESSION WLSession;
261 
262 #define WLX_SHUTTINGDOWN(Status) \
263   (((Status) == WLX_SAS_ACTION_SHUTDOWN) || \
264    ((Status) == WLX_SAS_ACTION_SHUTDOWN_POWER_OFF) || \
265    ((Status) == WLX_SAS_ACTION_SHUTDOWN_REBOOT) \
266   )
267 
268 #define WLX_SUSPENDING(Status) \
269   (((Status) == WLX_SAS_ACTION_SHUTDOWN_SLEEP) || \
270    ((Status) == WLX_SAS_ACTION_SHUTDOWN_SLEEP2) || \
271    ((Status) == WLX_SAS_ACTION_SHUTDOWN_HIBERNATE) \
272   )
273 
274 /* environment.c */
275 BOOL
276 CreateUserEnvironment(IN PWLSESSION Session);
277 
278 /* notify.c */
279 BOOL
280 InitNotifications(VOID);
281 
282 VOID
283 CleanupNotifications(VOID);
284 
285 VOID
286 CallNotificationDlls(
287     PWLSESSION pSession,
288     NOTIFICATION_TYPE Type);
289 
290 /* rpcserver.c */
291 BOOL
292 StartRpcServer(VOID);
293 
294 /* sas.c */
295 BOOL
296 SetDefaultLanguage(IN PWLSESSION Session);
297 
298 BOOL
299 InitializeSAS(IN OUT PWLSESSION Session);
300 
301 /* screensaver.c */
302 BOOL
303 InitializeScreenSaver(IN OUT PWLSESSION Session);
304 
305 VOID
306 StartScreenSaver(IN PWLSESSION Session);
307 
308 /* setup.c */
309 DWORD
310 GetSetupType(VOID);
311 
312 BOOL
313 RunSetup(VOID);
314 
315 /* shutdown.h*/
316 DWORD
317 TerminateSystemShutdown(VOID);
318 
319 DWORD
320 StartSystemShutdown(
321     PUNICODE_STRING lpMessage,
322     ULONG dwTimeout,
323     BOOLEAN bForceAppsClosed,
324     BOOLEAN bRebootAfterShutdown,
325     ULONG dwReason);
326 
327 /* winlogon.c */
328 BOOL
329 PlaySoundRoutine(IN LPCWSTR FileName,
330                  IN UINT Logon,
331                  IN UINT Flags);
332 
333 BOOL
334 DisplayStatusMessage(IN PWLSESSION Session,
335                      IN HDESK hDesktop,
336                      IN UINT ResourceId);
337 
338 BOOL
339 RemoveStatusMessage(IN PWLSESSION Session);
340 
341 /* wlx.c */
342 VOID
343 InitDialogListHead(VOID);
344 
345 VOID
346 CloseAllDialogWindows(VOID);
347 
348 BOOL
349 GinaInit(IN OUT PWLSESSION Session);
350 
351 BOOL
352 CreateWindowStationAndDesktops(IN OUT PWLSESSION Session);
353 
354 NTSTATUS
355 HandleShutdown(IN OUT PWLSESSION Session,
356                IN DWORD wlxAction);
357 
358 VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx);
359 VOID WINAPI WlxSetContextPointer(HANDLE hWlx, PVOID pWlxContext);
360 VOID WINAPI WlxSasNotify(HANDLE hWlx, DWORD dwSasType);
361 BOOL WINAPI WlxSetTimeout(HANDLE hWlx, DWORD Timeout);
362 int WINAPI WlxAssignShellProtection(HANDLE hWlx, HANDLE hToken, HANDLE hProcess, HANDLE hThread);
363 int WINAPI WlxMessageBox(HANDLE hWlx, HWND hwndOwner, LPWSTR lpszText, LPWSTR lpszTitle, UINT fuStyle);
364 int WINAPI WlxDialogBox(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);
365 int WINAPI WlxDialogBoxParam(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam);
366 int WINAPI WlxDialogBoxIndirect(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc);
367 int WINAPI WlxDialogBoxIndirectParam(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam);
368 int WINAPI WlxSwitchDesktopToUser(HANDLE hWlx);
369 int WINAPI WlxSwitchDesktopToWinlogon(HANDLE hWlx);
370 int WINAPI WlxChangePasswordNotify(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo);
371 BOOL WINAPI WlxGetSourceDesktop(HANDLE hWlx, PWLX_DESKTOP* ppDesktop);
372 BOOL WINAPI WlxSetReturnDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop);
373 BOOL WINAPI WlxCreateUserDesktop(HANDLE hWlx, HANDLE hToken, DWORD Flags, PWSTR pszDesktopName, PWLX_DESKTOP* ppDesktop);
374 int WINAPI WlxChangePasswordNotifyEx(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo, PWSTR ProviderName, PVOID Reserved);
375 BOOL WINAPI WlxCloseUserDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop, HANDLE hToken);
376 BOOL WINAPI WlxSetOption(HANDLE hWlx, DWORD Option, ULONG_PTR Value, ULONG_PTR* OldValue);
377 BOOL WINAPI WlxGetOption(HANDLE hWlx, DWORD Option, ULONG_PTR* Value);
378 VOID WINAPI WlxWin31Migrate(HANDLE hWlx);
379 BOOL WINAPI WlxQueryClientCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred);
380 BOOL WINAPI WlxQueryInetConnectorCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred);
381 DWORD WINAPI WlxQueryConsoleSwitchCredentials(PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred);
382 BOOL WINAPI WlxQueryTsLogonCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred);
383 BOOL WINAPI WlxDisconnect(VOID);
384 DWORD WINAPI WlxQueryTerminalServicesData(HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATA pTSData, WCHAR* UserName, WCHAR* Domain);
385 
386 #endif /* __WINLOGON_MAIN_H__ */
387