983 lines
30 KiB
C
983 lines
30 KiB
C
|
/*++ BUILD Version: 0001 Increment this if a change has global effects
|
|||
|
|
|||
|
Copyright (c) 1985-1999, Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
winwlx.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
WLX == WinLogon eXtension
|
|||
|
|
|||
|
This file contains definitions, data types, and routine prototypes
|
|||
|
necessary to produce a replacement Graphical Identification aNd
|
|||
|
Authentication (GINA) DLL for Winlogon.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Richard Ward (RichardW) and Jim Kelly (JimK) May-1994
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _WINWLX_
|
|||
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
|||
|
#define _WINWLX_
|
|||
|
|
|||
|
#if _MSC_VER > 1000
|
|||
|
#pragma once
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// #defines //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Revisions of Winlogon API available for use by GINAs
|
|||
|
// Version is two parts: Major revision and minor revision.
|
|||
|
// Major revision is the upper 16-bits, minor is the lower
|
|||
|
// 16-bits.
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_VERSION_1_0 (0X00010000)
|
|||
|
#define WLX_VERSION_1_1 (0X00010001)
|
|||
|
#define WLX_VERSION_1_2 (0X00010002)
|
|||
|
#define WLX_VERSION_1_3 (0X00010003)
|
|||
|
#define WLX_CURRENT_VERSION (WLX_VERSION_1_3)
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Secure attention sequence types
|
|||
|
// These values are passed to routines that have a dwSasType
|
|||
|
// parameter.
|
|||
|
//
|
|||
|
// ALL VALUES FROM 0 TO 127 ARE RESERVED FOR MICROSOFT DEFINITION.
|
|||
|
// VALUES ABOVE 127 ARE RESERVED FOR CUSTOMER DEFINITION.
|
|||
|
//
|
|||
|
// CTRL_ALT_DEL - used to indicate that the standard ctrl-alt-del
|
|||
|
// secure attention sequence has been entered.
|
|||
|
//
|
|||
|
// SCRNSVR_TIMEOUT - used to indicate that keyboard/mouse inactivity
|
|||
|
// has lead to a screensaver activation. It is up to the GINA
|
|||
|
// DLL whether this constitutes a workstation locking event.
|
|||
|
//
|
|||
|
// SCRNSVR_ACTIVITY - used to indicate that keyboard or mouse
|
|||
|
// activity occured while a secure screensaver was active.
|
|||
|
//
|
|||
|
// SC_INSERT - used to indicate that a smart card has been inserted
|
|||
|
// to a compatible device
|
|||
|
//
|
|||
|
// SC_REMOVE - used to indicate that a smart card has been removed
|
|||
|
// from a compatible device
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_SAS_TYPE_TIMEOUT (0)
|
|||
|
#define WLX_SAS_TYPE_CTRL_ALT_DEL (1)
|
|||
|
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT (2)
|
|||
|
#define WLX_SAS_TYPE_SCRNSVR_ACTIVITY (3)
|
|||
|
#define WLX_SAS_TYPE_USER_LOGOFF (4)
|
|||
|
#define WLX_SAS_TYPE_SC_INSERT (5)
|
|||
|
#define WLX_SAS_TYPE_SC_REMOVE (6)
|
|||
|
#define WLX_SAS_TYPE_MAX_MSFT_VALUE (127)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This structure is available through WlxGetOption, and is
|
|||
|
// passed as the lParam for any S/C SAS notices sent to windows
|
|||
|
//
|
|||
|
typedef struct _WLX_SC_NOTIFICATION_INFO {
|
|||
|
PWSTR pszCard ;
|
|||
|
PWSTR pszReader ;
|
|||
|
PWSTR pszContainer ;
|
|||
|
PWSTR pszCryptoProvider ;
|
|||
|
} WLX_SC_NOTIFICATION_INFO, * PWLX_SC_NOTIFICATION_INFO ;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Upon successful logon, the GINA DLL may specify any of the following
|
|||
|
// options to Winlogon (via the dwOptions parameter of the WlxLoggedOutSas()
|
|||
|
// api). When set, these options specify:
|
|||
|
//
|
|||
|
// NO_PROFILE - Winlogon must NOT load a profile for the logged
|
|||
|
// on user. Either the GINA DLL will take care of
|
|||
|
// this activity, or the user does not need a profile.
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_LOGON_OPT_NO_PROFILE (0x00000001)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// GINA DLLs are expected to return account information to Winlogon
|
|||
|
// following a successful logon. This information allows Winlogon
|
|||
|
// to support profile loading and supplemental network providers.
|
|||
|
//
|
|||
|
// To allow different sets of profile information to be returned
|
|||
|
// by GINAs over time, the first DWORD of each profile structure
|
|||
|
// is expected to contain a type-identifier. The following constants
|
|||
|
// are the defined profile type identifiers.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Standard profile is V2_0
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_PROFILE_TYPE_V1_0 (1)
|
|||
|
#define WLX_PROFILE_TYPE_V2_0 (2)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// WlxLoggedOnSas() and WlxWkstaLockedSas() return an action
|
|||
|
// value to Winlogon directing Winlogon to either remain unchanged
|
|||
|
// or to perform some action (such as force-log the user off).
|
|||
|
// These are the values that may be returned. Note, however, that
|
|||
|
// not all of the values may be returned by both of these api. See
|
|||
|
// the description of each api to see which values are expected from
|
|||
|
// each.
|
|||
|
//
|
|||
|
// LOGON - User has logged on
|
|||
|
// NONE - Don't change the state of the window station.
|
|||
|
// LOCK_WKSTA - Lock the workstation, wait for next SAS.
|
|||
|
// LOGOFF - Log the user off of the workstation.
|
|||
|
// SHUTDOWN - Log the user off and shutdown the machine.
|
|||
|
// PWD_CHANGED - Indicates that the user changed their password. Notify network providers.
|
|||
|
// TASKLIST - Invoke the task list.
|
|||
|
// UNLOCK_WKSTA - Unlock the workstation.
|
|||
|
// FORCE_LOGOFF - Forcibly log the user off.
|
|||
|
// SHUTDOWN_POWER_OFF - Turn off machine after shutting down.
|
|||
|
// SHUTDOWN_REBOOT - Reboot machine after shutting down.
|
|||
|
// SHUTDOWN_SLEEP - Put the machine to sleep
|
|||
|
// SHUTDOWN_SLEEP2 - Put the machine to sleep and disable wakeup events
|
|||
|
// SHUTDOWN_HIBERNATE - Hibernate the machine
|
|||
|
// RECONNECTED - Session was reconnected to an earlier session
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_SAS_ACTION_LOGON (1)
|
|||
|
#define WLX_SAS_ACTION_NONE (2)
|
|||
|
#define WLX_SAS_ACTION_LOCK_WKSTA (3)
|
|||
|
#define WLX_SAS_ACTION_LOGOFF (4)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN (5)
|
|||
|
#define WLX_SAS_ACTION_PWD_CHANGED (6)
|
|||
|
#define WLX_SAS_ACTION_TASKLIST (7)
|
|||
|
#define WLX_SAS_ACTION_UNLOCK_WKSTA (8)
|
|||
|
#define WLX_SAS_ACTION_FORCE_LOGOFF (9)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF (10)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT (11)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP (12)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP2 (13)
|
|||
|
#define WLX_SAS_ACTION_SHUTDOWN_HIBERNATE (14)
|
|||
|
#define WLX_SAS_ACTION_RECONNECTED (15)
|
|||
|
#define WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF (16)
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Window Messages //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// The WM_SAS is defined as follows
|
|||
|
//
|
|||
|
// The wParam parameter has the SAS Type (above)
|
|||
|
|
|||
|
#define WLX_WM_SAS (WM_USER + 601)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Dialog return values
|
|||
|
//
|
|||
|
// These may be returned by dialogs started by a GINA dll.
|
|||
|
//
|
|||
|
#define WLX_DLG_SAS 101
|
|||
|
#define WLX_DLG_INPUT_TIMEOUT 102 // Input (keys, etc) timed out
|
|||
|
#define WLX_DLG_SCREEN_SAVER_TIMEOUT 103 // Screen Saver activated
|
|||
|
#define WLX_DLG_USER_LOGOFF 104 // User logged off
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// #data types //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// The WLX_PROFILE_* structure is returned from a GINA DLL
|
|||
|
// following authentication. This information is used by Winlogon
|
|||
|
// to support supplemental Network Providers and to load the
|
|||
|
// newly logged-on user's profile.
|
|||
|
//
|
|||
|
// Winlogon is responsible for freeing both the profile structure
|
|||
|
// and the fields within the structure that are marked as separately
|
|||
|
// deallocatable.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _WLX_PROFILE_V1_0 {
|
|||
|
|
|||
|
//
|
|||
|
// This field identifies the type of profile being returned by a
|
|||
|
// GINA DLL. Profile types are defined with the prefix
|
|||
|
// WLX_PROFILE_TYPE_xxx. It allows Winlogon to typecast the
|
|||
|
// structure so the remainder of the structure may be referenced.
|
|||
|
//
|
|||
|
|
|||
|
DWORD dwType;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// pathname of profile to load for user.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
PWSTR pszProfile;
|
|||
|
|
|||
|
} WLX_PROFILE_V1_0, * PWLX_PROFILE_V1_0;
|
|||
|
|
|||
|
|
|||
|
typedef struct _WLX_PROFILE_V2_0 {
|
|||
|
|
|||
|
//
|
|||
|
// This field identifies the type of profile being returned by a
|
|||
|
// GINA DLL. Profile types are defined with the prefix
|
|||
|
// WLX_PROFILE_TYPE_xxx. It allows Winlogon to typecast the
|
|||
|
// structure so the remainder of the structure may be referenced.
|
|||
|
//
|
|||
|
|
|||
|
DWORD dwType;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// pathname of profile to load for user.
|
|||
|
//
|
|||
|
// This parameter can be NULL. If so, the user has a local
|
|||
|
// profile only.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszProfile;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// pathname of policy to load for user.
|
|||
|
//
|
|||
|
// This parameter can be NULL which prevents network wide policy
|
|||
|
// from being applied.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszPolicy;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// pathname of network default user profile
|
|||
|
//
|
|||
|
// This parameter can be NULL, which causes the Default User
|
|||
|
// profile on the local machine to be used.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszNetworkDefaultUserProfile;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// name of the server which validated the user account
|
|||
|
//
|
|||
|
// This is used to enumerate globals groups the user belongs
|
|||
|
// to for policy support. This parameter can be NULL.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszServerName;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// pointer to a series of null terminated environment variables
|
|||
|
//
|
|||
|
// envname=environment variable value
|
|||
|
// - or -
|
|||
|
// envname=%OtherVar%\more text
|
|||
|
//
|
|||
|
// Each environment variable is NULL terminated with the last
|
|||
|
// environment variable double NULL terminated. These variables
|
|||
|
// are set into the user's initial environment. The environment
|
|||
|
// variable value can contain other environment variables wrapped
|
|||
|
// in "%" signs. This parameter can be NULL.
|
|||
|
//
|
|||
|
// The buffer pointed to by this field must be separately allocated.
|
|||
|
// Winlogon will free the buffer when it is no longer needed.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszEnvironment;
|
|||
|
|
|||
|
} WLX_PROFILE_V2_0, * PWLX_PROFILE_V2_0;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// The WLX_NPR_NOTIFICATION_INFO structure is returned
|
|||
|
// from a GINA DLL following successful authentication.
|
|||
|
// This information is used by Winlogon to provide
|
|||
|
// identification and authentication information already
|
|||
|
// collected to network providers. Winlogon is
|
|||
|
// responsible for freeing both the main structure and all
|
|||
|
// string and other buffers pointed to from within the
|
|||
|
// structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _WLX_MPR_NOTIFY_INFO {
|
|||
|
|
|||
|
//
|
|||
|
// The name of the account logged onto (e.g. REDMOND\Joe).
|
|||
|
// The string pointed to by this field must be separately
|
|||
|
// allocated and will be separately deallocated by Winlogon.
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszUserName;
|
|||
|
|
|||
|
//
|
|||
|
// The string pointed to by this field must be separately
|
|||
|
// allocated and will be separately deallocated by Winlogon.
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszDomain;
|
|||
|
|
|||
|
//
|
|||
|
// Cleartext password of the user account. If the OldPassword
|
|||
|
// field is non-null, then this field contains the new password
|
|||
|
// in a password change operation. The string pointed to by
|
|||
|
// this field must be separately allocated and will be seperately
|
|||
|
// deallocated by Winlogon.
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszPassword;
|
|||
|
|
|||
|
//
|
|||
|
// Cleartext old password of the user account whose password
|
|||
|
// has just been changed. The Password field contains the new
|
|||
|
// password. The string pointed to by this field must be
|
|||
|
// separately allocated and will be separately deallocated by
|
|||
|
// Winlogon.
|
|||
|
//
|
|||
|
|
|||
|
PWSTR pszOldPassword;
|
|||
|
|
|||
|
} WLX_MPR_NOTIFY_INFO, * PWLX_MPR_NOTIFY_INFO;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// WLX_TERMINAL_SERVICES_DATA is used by the GINA during a
|
|||
|
// WlxQueryTerminalServicesData() callback into WinLogon from the
|
|||
|
// WlxLoggedOutSAS() context, after the user name and domain are known.
|
|||
|
// This structure relates to TS user configuration information which is
|
|||
|
// retrieved from the Domain Controller and SAM database. Having WinLogon
|
|||
|
// pass this information means the GINA does not need to do the same
|
|||
|
// off-machines lookups again.
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_DIRECTORY_LENGTH 256
|
|||
|
|
|||
|
typedef struct _WLX_TERMINAL_SERVICES_DATA {
|
|||
|
|
|||
|
//
|
|||
|
// TS profile path, overrides the standard profile path.
|
|||
|
//
|
|||
|
|
|||
|
WCHAR ProfilePath[WLX_DIRECTORY_LENGTH + 1];
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// TS home directory, overrides standard home directory.
|
|||
|
//
|
|||
|
|
|||
|
WCHAR HomeDir[WLX_DIRECTORY_LENGTH + 1];
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// TS home directory drive, overrides standard drive.
|
|||
|
//
|
|||
|
|
|||
|
WCHAR HomeDirDrive[4];
|
|||
|
|
|||
|
} WLX_TERMINAL_SERVICES_DATA, *PWLX_TERMINAL_SERVICES_DATA;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// The WLX_CLIENT_CREDENTIALS_INFO structure is returned
|
|||
|
// from winlogon from the WlxQueryClientCredentials() call.
|
|||
|
//
|
|||
|
// This allows a network client WinStation to pass client
|
|||
|
// credentials for automatic logon.
|
|||
|
//
|
|||
|
// The MSGINA DLL is responsible for freeing the memory
|
|||
|
// and substrings with LocalFree().
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_CREDENTIAL_TYPE_V1_0 (1)
|
|||
|
|
|||
|
typedef struct _WLX_CLIENT_CREDENTIALS_INFO {
|
|||
|
|
|||
|
//
|
|||
|
// This field identifies the type of credentials structure being allocated
|
|||
|
// by GINA DLL. Credential types are defined with the prefix
|
|||
|
// WLX_CREDENTIAL_TYPE_xxx. It allows Winlogon to typecast the
|
|||
|
// structure so the remainder of the structure may be referenced.
|
|||
|
//
|
|||
|
|
|||
|
DWORD dwType;
|
|||
|
|
|||
|
PWSTR pszUserName;
|
|||
|
PWSTR pszDomain;
|
|||
|
PWSTR pszPassword;
|
|||
|
|
|||
|
//
|
|||
|
// This field forces a prompt for the password. This
|
|||
|
// is due to an administrator override.
|
|||
|
//
|
|||
|
// This allows the distinguishing of autologon
|
|||
|
// with no password.
|
|||
|
//
|
|||
|
BOOL fPromptForPassword;
|
|||
|
|
|||
|
} WLX_CLIENT_CREDENTIALS_INFO_V1_0, * PWLX_CLIENT_CREDENTIALS_INFO_V1_0;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Services that replacement GINAs ** MUST ** provide //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxNegotiate(
|
|||
|
DWORD dwWinlogonVersion,
|
|||
|
PDWORD pdwDllVersion
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxInitialize(
|
|||
|
LPWSTR lpWinsta,
|
|||
|
HANDLE hWlx,
|
|||
|
PVOID pvReserved,
|
|||
|
PVOID pWinlogonFunctions,
|
|||
|
PVOID * pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
WlxDisplaySASNotice(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
WINAPI
|
|||
|
WlxLoggedOutSAS(
|
|||
|
PVOID pWlxContext,
|
|||
|
DWORD dwSasType,
|
|||
|
PLUID pAuthenticationId,
|
|||
|
PSID pLogonSid,
|
|||
|
PDWORD pdwOptions,
|
|||
|
PHANDLE phToken,
|
|||
|
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
|
|||
|
PVOID * pProfile
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxActivateUserShell(
|
|||
|
PVOID pWlxContext,
|
|||
|
PWSTR pszDesktopName,
|
|||
|
PWSTR pszMprLogonScript,
|
|||
|
PVOID pEnvironment
|
|||
|
);
|
|||
|
|
|||
|
int
|
|||
|
WINAPI
|
|||
|
WlxLoggedOnSAS(
|
|||
|
PVOID pWlxContext,
|
|||
|
DWORD dwSasType,
|
|||
|
PVOID pReserved
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
WlxDisplayLockedNotice(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
int
|
|||
|
WINAPI
|
|||
|
WlxWkstaLockedSAS(
|
|||
|
PVOID pWlxContext,
|
|||
|
DWORD dwSasType
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxIsLockOk(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxIsLogoffOk(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
WlxLogoff(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
WINAPI
|
|||
|
WlxShutdown(
|
|||
|
PVOID pWlxContext,
|
|||
|
DWORD ShutdownType
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// NEW for version 1.1
|
|||
|
//
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxScreenSaverNotify(
|
|||
|
PVOID pWlxContext,
|
|||
|
BOOL * pSecure);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxStartApplication(
|
|||
|
PVOID pWlxContext,
|
|||
|
PWSTR pszDesktopName,
|
|||
|
PVOID pEnvironment,
|
|||
|
PWSTR pszCmdLine
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// New for 1.3
|
|||
|
//
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxNetworkProviderLoad(
|
|||
|
PVOID pWlxContext,
|
|||
|
PWLX_MPR_NOTIFY_INFO pNprNotifyInfo
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
#define STATUSMSG_OPTION_NOANIMATION 0x00000001
|
|||
|
#define STATUSMSG_OPTION_SETFOREGROUND 0x00000002
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxDisplayStatusMessage(
|
|||
|
PVOID pWlxContext,
|
|||
|
HDESK hDesktop,
|
|||
|
DWORD dwOptions,
|
|||
|
PWSTR pTitle,
|
|||
|
PWSTR pMessage
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxGetStatusMessage(
|
|||
|
PVOID pWlxContext,
|
|||
|
DWORD * pdwOptions,
|
|||
|
PWSTR pMessage,
|
|||
|
DWORD dwBufferSize
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
WINAPI
|
|||
|
WlxRemoveStatusMessage(
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Services that Winlogon provides //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _WLX_DESKTOP {
|
|||
|
DWORD Size;
|
|||
|
DWORD Flags;
|
|||
|
HDESK hDesktop;
|
|||
|
PWSTR pszDesktopName;
|
|||
|
} WLX_DESKTOP, * PWLX_DESKTOP;
|
|||
|
|
|||
|
#define WLX_DESKTOP_NAME 0x00000001 // Name present
|
|||
|
#define WLX_DESKTOP_HANDLE 0x00000002 // Handle present
|
|||
|
|
|||
|
|
|||
|
|
|||
|
typedef VOID
|
|||
|
(WINAPI * PWLX_USE_CTRL_ALT_DEL)(
|
|||
|
HANDLE hWlx
|
|||
|
);
|
|||
|
|
|||
|
typedef VOID
|
|||
|
(WINAPI * PWLX_SET_CONTEXT_POINTER)(
|
|||
|
HANDLE hWlx,
|
|||
|
PVOID pWlxContext
|
|||
|
);
|
|||
|
|
|||
|
typedef VOID
|
|||
|
(WINAPI * PWLX_SAS_NOTIFY)(
|
|||
|
HANDLE hWlx,
|
|||
|
DWORD dwSasType
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_SET_TIMEOUT)(
|
|||
|
HANDLE hWlx,
|
|||
|
DWORD Timeout);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_ASSIGN_SHELL_PROTECTION)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hToken,
|
|||
|
HANDLE hProcess,
|
|||
|
HANDLE hThread
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_MESSAGE_BOX)(
|
|||
|
HANDLE hWlx,
|
|||
|
HWND hwndOwner,
|
|||
|
LPWSTR lpszText,
|
|||
|
LPWSTR lpszTitle,
|
|||
|
UINT fuStyle
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_DIALOG_BOX)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hInst,
|
|||
|
LPWSTR lpszTemplate,
|
|||
|
HWND hwndOwner,
|
|||
|
DLGPROC dlgprc
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_DIALOG_BOX_INDIRECT)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hInst,
|
|||
|
LPCDLGTEMPLATE hDialogTemplate,
|
|||
|
HWND hwndOwner,
|
|||
|
DLGPROC dlgprc
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_DIALOG_BOX_PARAM)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hInst,
|
|||
|
LPWSTR lpszTemplate,
|
|||
|
HWND hwndOwner,
|
|||
|
DLGPROC dlgprc,
|
|||
|
LPARAM dwInitParam
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_DIALOG_BOX_INDIRECT_PARAM)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hInst,
|
|||
|
LPCDLGTEMPLATE hDialogTemplate,
|
|||
|
HWND hwndOwner,
|
|||
|
DLGPROC dlgprc,
|
|||
|
LPARAM dwInitParam
|
|||
|
);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_SWITCH_DESKTOP_TO_USER)(
|
|||
|
HANDLE hWlx);
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_SWITCH_DESKTOP_TO_WINLOGON)(
|
|||
|
HANDLE hWlx);
|
|||
|
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_CHANGE_PASSWORD_NOTIFY)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
|||
|
DWORD dwChangeInfo
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_GET_SOURCE_DESKTOP)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_DESKTOP * ppDesktop);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_SET_RETURN_DESKTOP)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_DESKTOP pDesktop);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_CREATE_USER_DESKTOP)(
|
|||
|
HANDLE hWlx,
|
|||
|
HANDLE hToken,
|
|||
|
DWORD Flags,
|
|||
|
PWSTR pszDesktopName,
|
|||
|
PWLX_DESKTOP * ppDesktop);
|
|||
|
|
|||
|
#define WLX_CREATE_INSTANCE_ONLY 0x00000001
|
|||
|
#define WLX_CREATE_USER 0x00000002
|
|||
|
|
|||
|
typedef int
|
|||
|
(WINAPI * PWLX_CHANGE_PASSWORD_NOTIFY_EX)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_MPR_NOTIFY_INFO pMprInfo,
|
|||
|
DWORD dwChangeInfo,
|
|||
|
PWSTR ProviderName,
|
|||
|
PVOID Reserved);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_CLOSE_USER_DESKTOP)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_DESKTOP pDesktop,
|
|||
|
HANDLE hToken );
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_SET_OPTION)(
|
|||
|
HANDLE hWlx,
|
|||
|
DWORD Option,
|
|||
|
ULONG_PTR Value,
|
|||
|
ULONG_PTR * OldValue
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_GET_OPTION)(
|
|||
|
HANDLE hWlx,
|
|||
|
DWORD Option,
|
|||
|
ULONG_PTR * Value
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
typedef VOID
|
|||
|
(WINAPI * PWLX_WIN31_MIGRATE)(
|
|||
|
HANDLE hWlx
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_QUERY_CLIENT_CREDENTIALS)(
|
|||
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_QUERY_IC_CREDENTIALS)(
|
|||
|
PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_DISCONNECT)(
|
|||
|
);
|
|||
|
|
|||
|
typedef BOOL
|
|||
|
(WINAPI * PWLX_QUERY_TERMINAL_SERVICES_DATA)(
|
|||
|
HANDLE hWlx,
|
|||
|
PWLX_TERMINAL_SERVICES_DATA pTSData,
|
|||
|
PWSTR UserName,
|
|||
|
PWSTR Domain
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Options that can be get or set:
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_OPTION_USE_CTRL_ALT_DEL 0x00000001
|
|||
|
#define WLX_OPTION_CONTEXT_POINTER 0x00000002
|
|||
|
#define WLX_OPTION_USE_SMART_CARD 0x00000003
|
|||
|
#define WLX_OPTION_FORCE_LOGOFF_TIME 0x00000004
|
|||
|
#define WLX_OPTION_IGNORE_AUTO_LOGON 0x00000008
|
|||
|
|
|||
|
//
|
|||
|
// Options that can be queried only:
|
|||
|
//
|
|||
|
|
|||
|
#define WLX_OPTION_SMART_CARD_PRESENT 0x00010001
|
|||
|
#define WLX_OPTION_SMART_CARD_INFO 0x00010002
|
|||
|
#define WLX_OPTION_DISPATCH_TABLE_SIZE 0x00010003
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Function dispatch tables. //
|
|||
|
// One of the following tables will be passed to the GINA DLL //
|
|||
|
// in the WlxInitialize() call during initialization. //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _WLX_DISPATCH_VERSION_1_0 {
|
|||
|
PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel;
|
|||
|
PWLX_SET_CONTEXT_POINTER WlxSetContextPointer;
|
|||
|
PWLX_SAS_NOTIFY WlxSasNotify;
|
|||
|
PWLX_SET_TIMEOUT WlxSetTimeout;
|
|||
|
PWLX_ASSIGN_SHELL_PROTECTION WlxAssignShellProtection;
|
|||
|
PWLX_MESSAGE_BOX WlxMessageBox;
|
|||
|
PWLX_DIALOG_BOX WlxDialogBox;
|
|||
|
PWLX_DIALOG_BOX_PARAM WlxDialogBoxParam;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT WlxDialogBoxIndirect;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT_PARAM WlxDialogBoxIndirectParam;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_USER WlxSwitchDesktopToUser;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_WINLOGON WlxSwitchDesktopToWinlogon;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY WlxChangePasswordNotify;
|
|||
|
} WLX_DISPATCH_VERSION_1_0, *PWLX_DISPATCH_VERSION_1_0;
|
|||
|
|
|||
|
typedef struct _WLX_DISPATCH_VERSION_1_1 {
|
|||
|
PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel;
|
|||
|
PWLX_SET_CONTEXT_POINTER WlxSetContextPointer;
|
|||
|
PWLX_SAS_NOTIFY WlxSasNotify;
|
|||
|
PWLX_SET_TIMEOUT WlxSetTimeout;
|
|||
|
PWLX_ASSIGN_SHELL_PROTECTION WlxAssignShellProtection;
|
|||
|
PWLX_MESSAGE_BOX WlxMessageBox;
|
|||
|
PWLX_DIALOG_BOX WlxDialogBox;
|
|||
|
PWLX_DIALOG_BOX_PARAM WlxDialogBoxParam;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT WlxDialogBoxIndirect;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT_PARAM WlxDialogBoxIndirectParam;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_USER WlxSwitchDesktopToUser;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_WINLOGON WlxSwitchDesktopToWinlogon;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY WlxChangePasswordNotify;
|
|||
|
PWLX_GET_SOURCE_DESKTOP WlxGetSourceDesktop;
|
|||
|
PWLX_SET_RETURN_DESKTOP WlxSetReturnDesktop;
|
|||
|
PWLX_CREATE_USER_DESKTOP WlxCreateUserDesktop;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY_EX WlxChangePasswordNotifyEx;
|
|||
|
} WLX_DISPATCH_VERSION_1_1, * PWLX_DISPATCH_VERSION_1_1;
|
|||
|
|
|||
|
typedef struct _WLX_DISPATCH_VERSION_1_2 {
|
|||
|
PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel;
|
|||
|
PWLX_SET_CONTEXT_POINTER WlxSetContextPointer;
|
|||
|
PWLX_SAS_NOTIFY WlxSasNotify;
|
|||
|
PWLX_SET_TIMEOUT WlxSetTimeout;
|
|||
|
PWLX_ASSIGN_SHELL_PROTECTION WlxAssignShellProtection;
|
|||
|
PWLX_MESSAGE_BOX WlxMessageBox;
|
|||
|
PWLX_DIALOG_BOX WlxDialogBox;
|
|||
|
PWLX_DIALOG_BOX_PARAM WlxDialogBoxParam;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT WlxDialogBoxIndirect;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT_PARAM WlxDialogBoxIndirectParam;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_USER WlxSwitchDesktopToUser;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_WINLOGON WlxSwitchDesktopToWinlogon;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY WlxChangePasswordNotify;
|
|||
|
PWLX_GET_SOURCE_DESKTOP WlxGetSourceDesktop;
|
|||
|
PWLX_SET_RETURN_DESKTOP WlxSetReturnDesktop;
|
|||
|
PWLX_CREATE_USER_DESKTOP WlxCreateUserDesktop;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY_EX WlxChangePasswordNotifyEx;
|
|||
|
PWLX_CLOSE_USER_DESKTOP WlxCloseUserDesktop ;
|
|||
|
} WLX_DISPATCH_VERSION_1_2, * PWLX_DISPATCH_VERSION_1_2;
|
|||
|
|
|||
|
typedef struct _WLX_DISPATCH_VERSION_1_3 {
|
|||
|
PWLX_USE_CTRL_ALT_DEL WlxUseCtrlAltDel;
|
|||
|
PWLX_SET_CONTEXT_POINTER WlxSetContextPointer;
|
|||
|
PWLX_SAS_NOTIFY WlxSasNotify;
|
|||
|
PWLX_SET_TIMEOUT WlxSetTimeout;
|
|||
|
PWLX_ASSIGN_SHELL_PROTECTION WlxAssignShellProtection;
|
|||
|
PWLX_MESSAGE_BOX WlxMessageBox;
|
|||
|
PWLX_DIALOG_BOX WlxDialogBox;
|
|||
|
PWLX_DIALOG_BOX_PARAM WlxDialogBoxParam;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT WlxDialogBoxIndirect;
|
|||
|
PWLX_DIALOG_BOX_INDIRECT_PARAM WlxDialogBoxIndirectParam;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_USER WlxSwitchDesktopToUser;
|
|||
|
PWLX_SWITCH_DESKTOP_TO_WINLOGON WlxSwitchDesktopToWinlogon;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY WlxChangePasswordNotify;
|
|||
|
PWLX_GET_SOURCE_DESKTOP WlxGetSourceDesktop;
|
|||
|
PWLX_SET_RETURN_DESKTOP WlxSetReturnDesktop;
|
|||
|
PWLX_CREATE_USER_DESKTOP WlxCreateUserDesktop;
|
|||
|
PWLX_CHANGE_PASSWORD_NOTIFY_EX WlxChangePasswordNotifyEx;
|
|||
|
PWLX_CLOSE_USER_DESKTOP WlxCloseUserDesktop ;
|
|||
|
PWLX_SET_OPTION WlxSetOption;
|
|||
|
PWLX_GET_OPTION WlxGetOption;
|
|||
|
PWLX_WIN31_MIGRATE WlxWin31Migrate;
|
|||
|
PWLX_QUERY_CLIENT_CREDENTIALS WlxQueryClientCredentials;
|
|||
|
PWLX_QUERY_IC_CREDENTIALS WlxQueryInetConnectorCredentials;
|
|||
|
PWLX_DISCONNECT WlxDisconnect;
|
|||
|
PWLX_QUERY_TERMINAL_SERVICES_DATA WlxQueryTerminalServicesData;
|
|||
|
} WLX_DISPATCH_VERSION_1_3, * PWLX_DISPATCH_VERSION_1_3;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Non-GINA notification DLLs
|
|||
|
//
|
|||
|
|
|||
|
typedef DWORD (*PFNMSGECALLBACK)(BOOL bVerbose, LPWSTR lpMessage);
|
|||
|
|
|||
|
typedef struct _WLX_NOTIFICATION_INFO {
|
|||
|
ULONG Size ;
|
|||
|
ULONG Flags ;
|
|||
|
PWSTR UserName ;
|
|||
|
PWSTR Domain ;
|
|||
|
PWSTR WindowStation ;
|
|||
|
HANDLE hToken ;
|
|||
|
HDESK hDesktop ;
|
|||
|
PFNMSGECALLBACK pStatusCallback ;
|
|||
|
} WLX_NOTIFICATION_INFO, * PWLX_NOTIFICATION_INFO ;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#pragma option pop /*P_O_Pop*/
|
|||
|
#endif /* _WINWLX_ */
|