mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
10 KiB
418 lines
10 KiB
/****************************** Module Header ******************************\
|
|
* Module Name: winlogon.h
|
|
*
|
|
* Copyright (c) 1991, Microsoft Corporation
|
|
*
|
|
* Main header file for winlogon
|
|
*
|
|
* History:
|
|
* 12-09-91 Davidc Created.
|
|
* 6-May-1992 SteveDav Added space for WINMM sound function
|
|
\***************************************************************************/
|
|
|
|
|
|
#ifndef RC_INVOKED
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntlsa.h>
|
|
#include <ntmsv1_0.h>
|
|
#include <lmsname.h>
|
|
#endif
|
|
|
|
|
|
#include <windows.h>
|
|
#include <winbasep.h>
|
|
#include <winuserp.h>
|
|
#include <winsecp.h>
|
|
#include <mmsystem.h>
|
|
#include <winwlx.h>
|
|
|
|
#ifndef RC_INVOKED
|
|
|
|
//
|
|
// Exit Codes, that will show up the bugcheck:
|
|
//
|
|
|
|
#define EXIT_INITIALIZATION_ERROR 1024
|
|
#define EXIT_SECURITY_INIT_ERROR 1025
|
|
#define EXIT_GINA_ERROR 1026
|
|
#define EXIT_SYSTEM_PROCESS_ERROR 1027
|
|
#define EXIT_NO_SAS_ERROR 1028
|
|
#define EXIT_SHUTDOWN_FAILURE 1029
|
|
#define EXIT_GINA_INIT_ERROR 1030
|
|
|
|
//
|
|
// Tempoary development aid - system logon capability
|
|
//
|
|
|
|
#if DBG
|
|
#define SYSTEM_LOGON
|
|
#endif
|
|
|
|
#if DEVL
|
|
#define INIT_REGISTRY 1
|
|
#endif
|
|
|
|
//
|
|
// Temporary development aid - Ctrl-Tasklist starts cmd shell
|
|
//
|
|
#if DBG
|
|
#define CTRL_TASKLIST_SHELL
|
|
#endif
|
|
|
|
|
|
//
|
|
// Define the input timeout delay for logon dialogs (seconds)
|
|
//
|
|
|
|
#define LOGON_TIMEOUT 120
|
|
|
|
|
|
//
|
|
// Define the input timeout delay for the security options dialog (seconds)
|
|
//
|
|
|
|
#define OPTIONS_TIMEOUT 120
|
|
|
|
|
|
//
|
|
// Define the number of days warning we give the user before their password expires
|
|
//
|
|
|
|
#define PASSWORD_EXPIRY_WARNING_DAYS 14
|
|
|
|
|
|
//
|
|
// Define the maximum time we display the 'wait for user to be logged off'
|
|
// dialog. This dialog should be interrupted by the user being logged off.
|
|
// This timeout is a safety measure in case that doesn't happen because
|
|
// of some system error.
|
|
//
|
|
|
|
#define WAIT_FOR_USER_LOGOFF_DLG_TIMEOUT 120 // seconds
|
|
|
|
|
|
//
|
|
// Define the account lockout limits
|
|
//
|
|
// A delay of LOCKOUT_BAD_LOGON_DELAY seconds will be added to
|
|
// each failed logon if more than LOCKOUT_BAD_LOGON_COUNT failed logons
|
|
// have occurred in the last LOCKOUT_BAD_LOGON_PERIOD seconds.
|
|
//
|
|
|
|
#define LOCKOUT_BAD_LOGON_COUNT 5
|
|
#define LOCKOUT_BAD_LOGON_PERIOD 60 // seconds
|
|
#define LOCKOUT_BAD_LOGON_DELAY 30 // seconds
|
|
|
|
|
|
|
|
//
|
|
// Define the maximum length of strings we'll use in winlogon
|
|
//
|
|
|
|
#define MAX_STRING_LENGTH 255
|
|
#define MAX_STRING_BYTES (MAX_STRING_LENGTH + 1)
|
|
|
|
|
|
//
|
|
// Define the typical length of a string
|
|
// This is used as an initial allocation size for most string routines.
|
|
// If this is insufficient, the block is reallocated larger and
|
|
// the operation retried. i.e. Make this big enough for most strings
|
|
// to fit first time.
|
|
//
|
|
|
|
#define TYPICAL_STRING_LENGTH 60
|
|
|
|
|
|
|
|
//
|
|
// Windows object names
|
|
//
|
|
|
|
#define WINDOW_STATION_NAME TEXT("WinSta0")
|
|
#define APPLICATION_DESKTOP_NAME TEXT("Default")
|
|
#define WINLOGON_DESKTOP_NAME TEXT("Winlogon")
|
|
#define SCREENSAVER_DESKTOP_NAME TEXT("Screen-saver")
|
|
|
|
#define APPLICATION_DESKTOP_PATH TEXT("WinSta0\\Default")
|
|
#define WINLOGON_DESKTOP_PATH TEXT("WinSta0\\Winlogon")
|
|
#define SCREENSAVER_DESKTOP_PATH TEXT("WinSta0\\Screen-saver")
|
|
|
|
|
|
//
|
|
// Winlogon's registry location
|
|
//
|
|
|
|
#define WINLOGON_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"
|
|
|
|
|
|
//
|
|
// Define the structure that contains information used when starting
|
|
// user processes.
|
|
// This structure should only be modified by SetUserProcessData()
|
|
//
|
|
|
|
typedef struct {
|
|
HANDLE UserToken; // NULL if no user logged on
|
|
PSID UserSid; // == WinlogonSid if no user logged on
|
|
PSECURITY_DESCRIPTOR NewProcessSD;
|
|
PSECURITY_DESCRIPTOR NewProcessTokenSD;
|
|
PSECURITY_DESCRIPTOR NewThreadSD;
|
|
PSECURITY_DESCRIPTOR NewThreadTokenSD;
|
|
QUOTA_LIMITS Quotas;
|
|
LPTSTR CurrentDirectory;
|
|
PVOID pEnvironment;
|
|
} USER_PROCESS_DATA;
|
|
typedef USER_PROCESS_DATA *PUSER_PROCESS_DATA;
|
|
|
|
//
|
|
// Define the structure that contains information about the user's profile.
|
|
// This is used in SetupUserEnvironment and ResetEnvironment (in usrenv.c)
|
|
// This data is only valid while a user is logged on.
|
|
//
|
|
|
|
typedef struct {
|
|
LPTSTR ProfilePath;
|
|
HANDLE hProfile;
|
|
LPTSTR PolicyPath;
|
|
LPTSTR NetworkDefaultUserProfile;
|
|
LPTSTR ServerName;
|
|
LPTSTR Environment;
|
|
} USER_PROFILE_INFO;
|
|
typedef USER_PROFILE_INFO *PUSER_PROFILE_INFO;
|
|
|
|
|
|
|
|
//
|
|
// Get any data types defined in module headers and used in GLOBALS
|
|
//
|
|
#define TYPES_ONLY
|
|
#include "ginamgr.h"
|
|
#undef TYPES_ONLY
|
|
|
|
|
|
typedef enum _WinstaState {
|
|
Winsta_PreLoad,
|
|
Winsta_Initialize,
|
|
Winsta_NoOne,
|
|
Winsta_NoOne_Display,
|
|
Winsta_NoOne_SAS,
|
|
Winsta_LoggedOnUser_StartShell,
|
|
Winsta_LoggedOnUser,
|
|
Winsta_LoggedOn_SAS,
|
|
Winsta_Locked,
|
|
Winsta_Locked_Display,
|
|
Winsta_Locked_SAS,
|
|
Winsta_WaitForLogoff,
|
|
Winsta_WaitForShutdown,
|
|
Winsta_Shutdown,
|
|
Winsta_InShutdownDlg,
|
|
Winsta_StateMax
|
|
} WinstaState;
|
|
|
|
#define IsSASState(State) ((State == Winsta_NoOne_SAS) || \
|
|
(State == Winsta_LoggedOn_SAS) || \
|
|
(State == Winsta_Locked_SAS) )
|
|
|
|
#define IsDisplayState(State) ((State == Winsta_NoOne_Display) || \
|
|
(State == Winsta_Locked_Display) || \
|
|
(State == Winsta_WaitForLogoff) )
|
|
|
|
#if DBG
|
|
extern char * StateNames[Winsta_StateMax];
|
|
|
|
#define GetState(x) ( x < (sizeof(StateNames) / sizeof(char *)) ? StateNames[x] : "Invalid")
|
|
#endif
|
|
|
|
extern BOOLEAN SasMessages;
|
|
#define DisableSasMessages() SasMessages = FALSE;
|
|
#define TestSasMessages() (SasMessages)
|
|
VOID
|
|
EnableSasMessages(HWND hWnd);
|
|
|
|
BOOL
|
|
QueueSasEvent(
|
|
DWORD dwSasType);
|
|
|
|
BOOL
|
|
FetchPendingSas(
|
|
PDWORD pSasType);
|
|
|
|
BOOL
|
|
TestPendingSas(VOID);
|
|
|
|
BOOL
|
|
KillMessageBox( DWORD SasCode );
|
|
|
|
typedef enum _ActiveDesktops {
|
|
Desktop_Winlogon,
|
|
Desktop_ScreenSaver,
|
|
Desktop_Application,
|
|
Desktop_Previous
|
|
} ActiveDesktops;
|
|
|
|
typedef struct _WinstaDescription {
|
|
HWINSTA hwinsta; // Handle to window station
|
|
HDESK hdeskWinlogon; // Desktop handles
|
|
HDESK hdeskApplication; // ""
|
|
HWND hwndAppDesktop; // "
|
|
HDESK hdeskScreenSaver; // "
|
|
HDESK hdeskPrevious; // Previous
|
|
ActiveDesktops ActiveDesktop; // Current, active desktop
|
|
ActiveDesktops PreviousDesktop; // Previous desktop
|
|
PWSTR pszWinsta; // Name of window station.
|
|
PWSTR pszDesktop; // Name of current desktop.
|
|
DWORD DesktopLength; // Length of name.
|
|
BOOL Locked; // Do I think it's locked?
|
|
PVOID Acl; // Stored ACL
|
|
} WinstaDescription, * PWinstaDescription;
|
|
|
|
|
|
typedef UINT (FAR WINAPI *SOUNDPROC)();
|
|
typedef BOOL (FAR WINAPI *MIDIPROC)();
|
|
|
|
|
|
//
|
|
// Define the winlogon global structure.
|
|
//
|
|
|
|
typedef struct {
|
|
DWORD CheckMark;
|
|
|
|
// Filled in by InitializeGlobals at startup
|
|
HANDLE hInstance;
|
|
PSID WinlogonSid;
|
|
SOUNDPROC PlaySound;
|
|
SOUNDPROC MigrateSoundEvents;
|
|
MIDIPROC MigrateMidiUser;
|
|
HANDLE hMPR; // handle to MPR.DLL
|
|
// Needed to call WNetRestoreConnection when logging
|
|
// on the user (in SetupUserEnviron), and to call
|
|
// WNetNukeConnections when logging of the user.
|
|
// Cannot be called directly beacuse it uses the
|
|
// winreg apis, and thus it has to be loaded
|
|
// after the profiles are loaded (SetupUserEnvironment).
|
|
// Has to be loaded in the user context.
|
|
|
|
HANDLE hEventLog;
|
|
|
|
// Filled in by InitializeSecurity() at startup
|
|
WinstaDescription WindowStation;
|
|
PGINASESSION pGina;
|
|
WinstaState WinlogonState;
|
|
WinstaState PreviousWinlogonState;
|
|
BOOL ForwardCAD;
|
|
DWORD SasType;
|
|
DWORD LastGinaRet;
|
|
DWORD LogoffFlags;
|
|
BOOL ScreenSaverActive;
|
|
BOOL ShutdownStarted;
|
|
|
|
// Filled in during startup
|
|
BOOL AuditLogFull;
|
|
BOOL AuditLogNearFull;
|
|
|
|
// Always valid, indicates if we have a user logged on
|
|
BOOL UserLoggedOn;
|
|
DWORD IniRef;
|
|
DWORD TickCount;
|
|
|
|
// Always valid - used to start new processes and screen-saver
|
|
USER_PROCESS_DATA UserProcessData;
|
|
LUID LogonId;
|
|
|
|
// Filled in during SetupUserEnvironment, and used in ResetEnvironment.
|
|
// Valid only when a user is logged on.
|
|
|
|
PWSTR LogonScripts;
|
|
PWSTR UserName;
|
|
PWSTR Domain;
|
|
USER_PROFILE_INFO UserProfile;
|
|
|
|
|
|
//
|
|
// Value of SetupType from registry
|
|
//
|
|
|
|
ULONG SetupType ;
|
|
|
|
//
|
|
// Boolean flag indicating whether SETUP is to be run
|
|
//
|
|
BOOL fExecuteSetup ;
|
|
|
|
WCHAR DesktopName[ TYPICAL_STRING_LENGTH ];
|
|
DWORD DesktopNameLength;
|
|
|
|
} GLOBALS;
|
|
typedef GLOBALS *PGLOBALS;
|
|
|
|
#define GLOBALS_CHECKMARK 0x616f6947
|
|
#define VerifyHandle(h) ((PGLOBALS) (((PGLOBALS)h)->CheckMark == GLOBALS_CHECKMARK) ? h : NULL)
|
|
|
|
//
|
|
// Global pointer to the pGlobals structure
|
|
//
|
|
|
|
extern PGLOBALS g_pGlobals;
|
|
extern HANDLE hFontThread;
|
|
extern BOOL ExitWindowsInProgress ;
|
|
|
|
|
|
//
|
|
// Define a macro to determine if we're a workstation or not
|
|
// This allows easy changes as new product types are added.
|
|
//
|
|
|
|
#define IsWorkstation(prodtype) (((prodtype) == NtProductWinNt) \
|
|
|| ((prodtype) == NtProductServer))
|
|
|
|
|
|
#define DLG_SUCCESS IDOK
|
|
#define DLG_FAILURE IDCANCEL
|
|
|
|
//
|
|
// Include individual module header files
|
|
//
|
|
#include "wlxutil.h"
|
|
#include "regini.h"
|
|
#include "logon.h"
|
|
#include "loggedon.h"
|
|
#include "sas.h"
|
|
#include "winutil.h"
|
|
#include "sysinit.h"
|
|
#include "ginamgr.h"
|
|
#include "debug.h"
|
|
#include "strings.h"
|
|
#include "wlxutil.h"
|
|
#include "doslog.h"
|
|
#include "regini.h"
|
|
#include "secutil.h"
|
|
#include "logoff.h"
|
|
#include "misc.h"
|
|
#include "msgalias.h"
|
|
#include "usrpro.h"
|
|
#include "usrenv.h"
|
|
#include "envvar.h"
|
|
#include "monitor.h"
|
|
#include "scrnsave.h"
|
|
#include "timeout.h"
|
|
#include "provider.h"
|
|
#include "removabl.h"
|
|
|
|
|
|
#ifdef _X86_
|
|
#include "os2ssmig.h"
|
|
#endif
|
|
|
|
#endif /* !RC_INVOKED */
|
|
|
|
//
|
|
// Include resource header files
|
|
//
|
|
#include "win31mig.h"
|
|
#include "wlevents.h"
|
|
#include "stringid.h"
|
|
#include "dialogs.h"
|