/*
 * WinWlx.h
 *
 * WinLogon eXtension
 *
 * Contributors:
 *   Created by Thomas Weidenmueller <w3seek@users.sourceforge.net>
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef __WINWLX_H
#define __WINWLX_H

#if __GNUC__ >=3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif

#pragma pack(push,4)


#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_VERSION_1_4				(0x00010004)
#define WLX_CURRENT_VERSION			(WLX_VERSION_1_4)

#define WLX_SAS_TYPE_TIMEOUT			(0x0000)
#define WLX_SAS_TYPE_CTRL_ALT_DEL		(0x0001)
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT		(0x0002)
#define WLX_SAS_TYPE_SCRNSVR_ACTIVITY		(0x0003)
#define WLX_SAS_TYPE_USER_LOGOFF		(0x0004)
#define WLX_SAS_TYPE_SC_INSERT			(0x0005)
#define WLX_SAS_TYPE_SC_REMOVE			(0x0006)
#define WLX_SAS_TYPE_AUTHENTICATED		(0x0007)
#define WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED	(0x0008)
#define WLX_SAS_TYPE_SC_LAST_READER_REMOVED	(0x0009)
#define WLX_SAS_TYPE_SWITCHUSER			(0x000A)
#define WLX_SAS_TYPE_MAX_MSFT_VALUE		(0x007F)

#define WLX_LOGON_OPT_NO_PROFILE		(0x0001)

#define WLX_PROFILE_TYPE_V1_0			(0x0001)
#define WLX_PROFILE_TYPE_V2_0			(0x0002) /* default */

#define WLX_SAS_ACTION_LOGON			(0x0001)
#define WLX_SAS_ACTION_NONE			(0x0002)
#define WLX_SAS_ACTION_LOCK_WKSTA		(0x0003)
#define WLX_SAS_ACTION_LOGOFF			(0x0004)
#define WLX_SAS_ACTION_SHUTDOWN			(0x0005)
#define WLX_SAS_ACTION_PWD_CHANGED		(0x0006)
#define WLX_SAS_ACTION_TASKLIST			(0x0007)
#define WLX_SAS_ACTION_UNLOCK_WKSTA		(0x0008)
#define WLX_SAS_ACTION_FORCE_LOGOFF		(0x0009)
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF	(0x000A)
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT		(0x000B)
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP		(0x000C)
#define WLX_SAS_ACTION_SHUTDOWN_SLEEP2		(0x000D)
#define WLX_SAS_ACTION_SHUTDOWN_HIBERNATE	(0x000E)
#define WLX_SAS_ACTION_RECONNECTED		(0x000F)
#define WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF	(0x0010)
#define WLX_SAS_ACTION_SWITCH_CONSOLE		(0x0011)

#define WLX_WM_SAS				(WM_USER + 0x0259)

#define WLX_DLG_SAS				(0x0065)
#define WLX_DLG_INPUT_TIMEOUT			(0x0066) /* Input (keys, ...) timed out */
#define WLX_DLG_SCREEN_SAVER_TIMEOUT		(0x0067) /* Screen saver activated */
#define WLX_DLG_USER_LOGOFF			(0x0068) /* User logged off */

#define WLX_DIRECTORY_LENGTH			(0x0100)

#define WLX_CREDENTIAL_TYPE_V1_0		(0x0001)
#define WLX_CREDENTIAL_TYPE_V2_0		(0x0002)

#define WLX_CONSOLESWITCHCREDENTIAL_TYPE_V1_0	(0x0001)

#define STATUSMSG_OPTION_NOANIMATION		(0x0001)
#define STATUSMSG_OPTION_SETFOREGROUND		(0x0002)


typedef
struct _WLX_CLIENT_CREDENTIALS_INFO
{
	DWORD dwType;
	PWSTR pszUserName;
	PWSTR pszDomain;
	PWSTR pszPassword;
	BOOL  fPromptForPassword;
} WLX_CLIENT_CREDENTIALS_INFO_V1_0, *PWLX_CLIENT_CREDENTIALS_INFO_V1_0;

typedef
struct _WLX_CLIENT_CREDENTIALS_INFO_2_0
{
	DWORD dwType;
	PWSTR pszUserName;
	PWSTR pszDomain;
	PWSTR pszPassword;
	BOOL  fPromptForPassword;
	BOOL  fDisconnectOnLogonFailure;
} WLX_CLIENT_CREDENTIALS_INFO_V2_0, *PWLX_CLIENT_CREDENTIALS_INFO_V2_0;

typedef
struct _WLX_CONSOLESWITCH_CREDENTIALS_INFO
{
	DWORD         dwType;
	HANDLE        UserToken;
	LUID          LogonId;
	QUOTA_LIMITS  Quotas;
	PWSTR         UserName;
	PWSTR         Domain;
	LARGE_INTEGER LogonTime;
	BOOL          SmartCardLogon;
	ULONG         ProfileLength;
	DWORD         MessageType;
	USHORT        LogonCount;
	USHORT        BadPasswordCount;
	LARGE_INTEGER ProfileLogonTime;
	LARGE_INTEGER LogoffTime;
	LARGE_INTEGER KickOffTime;
	LARGE_INTEGER PasswordLastSet;
	LARGE_INTEGER PasswordCanChange;
	LARGE_INTEGER PasswordMustChange;
	PWSTR         LogonScript;
	PWSTR         HomeDirectory;
	PWSTR         FullName;
	PWSTR         ProfilePath;
	PWSTR         HomeDirectoryDrive;
	PWSTR         LogonServer;
	ULONG         UserFlags;
	ULONG         PrivateDataLen;
	PBYTE         PrivateData;
} WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0, *PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;

typedef
struct _WLX_MPR_NOTIFY_INFO
{
	PWSTR pszUserName;
	PWSTR pszDomain;
	PWSTR pszPassword;
	PWSTR pszOldPassword;
} WLX_MPR_NOTIFY_INFO, *PWLX_MPR_NOTIFY_INFO;

typedef
struct _WLX_PROFILE_V1_0
{
	DWORD dwType;
	PWSTR pszProfile;
} WLX_PROFILE_V1_0, *PWLX_PROFILE_V1_0;

typedef
struct _WLX_PROFILE_V2_0
{
	DWORD dwType;
	PWSTR pszProfile;
	PWSTR pszPolicy;
	PWSTR pszNetworkDefaultUserProfile;
	PWSTR pszServerName;
	PWSTR pszEnvironment;
} WLX_PROFILE_V2_0, *PWLX_PROFILE_V2_0;

typedef
struct _WLX_SC_NOTIFICATION_INFO
{
	PWSTR pszCard;
	PWSTR pszReader;
	PWSTR pszContainer;
	PWSTR pszCryptoProvider;
} WLX_SC_NOTIFICATION_INFO, *PWLX_SC_NOTIFICATION_INFO;

typedef
struct _WLX_TERMINAL_SERVICES_DATA
{
	WCHAR ProfilePath[WLX_DIRECTORY_LENGTH + 1];
	WCHAR HomeDir[WLX_DIRECTORY_LENGTH + 1];
	WCHAR HomeDirDrive[4];
} WLX_TERMINAL_SERVICES_DATA, *PWLX_TERMINAL_SERVICES_DATA;


/* GINA Version 1.0 */

BOOL WINAPI
WlxActivateUserShell(
	PVOID pWlxContext,
	PWSTR pszDesktopName,
	PWSTR pszMprLogonScript,
	PVOID pEnvironment);

VOID WINAPI
WlxDisplayLockedNotice(
	PVOID pWlxContext);

VOID WINAPI
WlxDisplaySASNotice(
	PVOID pWlxContext);

BOOL WINAPI
WlxInitialize(
	LPWSTR lpWinsta,
	HANDLE hWlx,
	PVOID  pvReserved,
	PVOID  pWinlogonFunctions,
	PVOID  *pWlxContext);

BOOL WINAPI
WlxIsLockOk(
	PVOID pWlxContext);

BOOL WINAPI
WlxIsLogoffOk(
	PVOID pWlxContext);

int WINAPI
WlxLoggedOnSAS(
	PVOID pWlxContext,
	DWORD dwSasType,
	PVOID pReserved);

int WINAPI
WlxLoggedOutSAS(
	PVOID                pWlxContext,
	DWORD                dwSasType,
	PLUID                pAuthenticationId,
	PSID                 pLogonSid,
	PDWORD               pdwOptions,
	PHANDLE              phToken,
	PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
	PVOID                *pProfile);

VOID WINAPI
WlxLogoff(
	PVOID pWlxContext);

BOOL WINAPI
WlxNegotiate(
	DWORD  dwWinlogonVersion,
	PDWORD pdwDllVersion);

VOID WINAPI
WlxShutdown(
	PVOID pWlxContext,
	DWORD ShutdownType);

int WINAPI
WlxWkstaLockedSAS(
	PVOID pWlxContext,
	DWORD dwSasType);


/* GINA Version 1.1 */

BOOL WINAPI
WlxScreenSaverNotify(
	PVOID pWlxContext,
	BOOL  *pSecure);

BOOL WINAPI
WlxStartApplication(
	PVOID pWlxContext,
	PWSTR pszDesktopName,
	PVOID pEnvironment,
	PWSTR pszCmdLine);


/* GINA Version 1.3 */

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
WlxNetworkProviderLoad(
	PVOID                pWlxContext,
	PWLX_MPR_NOTIFY_INFO pNprNotifyInfo);

BOOL WINAPI
WlxRemoveStatusMessage(
	PVOID pWlxContext);


/* GINA Version 1.4 */

VOID WINAPI
WlxDisconnectNotify(
	PVOID pWlxContext);

BOOL WINAPI
WlxGetConsoleSwitchCredentials(
	PVOID pWlxContext,
	PVOID pCredInfo);

VOID WINAPI
WlxReconnectNotify(
	PVOID pWlxContext);


/* Services that Winlogon provides */

#define WLX_DESKTOP_NAME			(0x0001) /* Name present */
#define WLX_DESKTOP_HANDLE			(0x0002) /* Handle present */

#define WLX_CREATE_INSTANCE_ONLY		(0x0001)
#define WLX_CREATE_USER				(0x0002)

#define WLX_OPTION_USE_CTRL_ALT_DEL		(0x0001)
#define WLX_OPTION_CONTEXT_POINTER		(0x0002)
#define WLX_OPTION_USE_SMART_CARD		(0x0003)
#define WLX_OPTION_FORCE_LOGOFF_TIME		(0x0004)
#define WLX_OPTION_IGNORE_AUTO_LOGON		(0x0008)
#define WLX_OPTION_NO_SWITCH_ON_SAS		(0x0009)

#define WLX_OPTION_SMART_CARD_PRESENT		(0x00010001)
#define WLX_OPTION_SMART_CARD_INFO		(0x00010002)
#define WLX_OPTION_DISPATCH_TABLE_SIZE		(0x00010003)

typedef
struct _WLX_DESKTOP
{
	DWORD Size;
	DWORD Flags;
	HDESK hDesktop;
	PWSTR pszDesktopName;
} WLX_DESKTOP, *PWLX_DESKTOP;

typedef
int (WINAPI *PWLX_ASSIGN_SHELL_PROTECTION)(
	HANDLE hWlx,
	HANDLE hToken,
	HANDLE hProcess,
	HANDLE hThread);

typedef
BOOL (WINAPI *PWLX_CLOSE_USER_DESKTOP)(
	HANDLE       hWlx,
	PWLX_DESKTOP pDesktop,
	HANDLE       hToken);

typedef
int (WINAPI *PWLX_CHANGE_PASSWORD_NOTIFY)(
	HANDLE               hWlx,
	PWLX_MPR_NOTIFY_INFO pMprInfo,
	DWORD                dwChangeInfo);

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_CREATE_USER_DESKTOP)(
	HANDLE       hWlx,
	HANDLE       hToken,
	DWORD        Flags,
	PWSTR        pszDesktopName,
	PWLX_DESKTOP *ppDesktop);

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_INDIRECT_PARAM)(
	HANDLE         hWlx,
	HANDLE         hInst,
	LPCDLGTEMPLATE hDialogTemplate,
	HWND           hwndOwner,
	DLGPROC        dlgprc,
	LPARAM         dwInitParam);

typedef
int (WINAPI *PWLX_DIALOG_BOX_PARAM)(
	HANDLE  hWlx,
	HANDLE  hInst,
	LPWSTR  lpszTemplate,
	HWND    hwndOwner,
	DLGPROC dlgprc,
	LPARAM  dwInitParam);

typedef
BOOL (WINAPI *PWLX_DISCONNECT)();

typedef
BOOL (WINAPI *PWLX_GET_OPTION)(
	HANDLE    hWlx,
	DWORD     Option,
	ULONG_PTR *Value);

typedef
BOOL (WINAPI *PWLX_GET_SOURCE_DESKTOP)(
	HANDLE       hWlx,
	PWLX_DESKTOP *ppDesktop);

typedef
int (WINAPI *PWLX_MESSAGE_BOX)(
	HANDLE hWlx,
	HWND   hwndOwner,
	LPWSTR lpszText,
	LPWSTR lpszTitle,
	UINT   fuStyle);

typedef
BOOL (WINAPI *PWLX_QUERY_CLIENT_CREDENTIALS)(
	PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred);

typedef
DWORD (WINAPI *PWLX_QUERY_CONSOLESWITCH_CREDENTIALS)(
	PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred);

typedef
BOOL (WINAPI *PWLX_QUERY_IC_CREDENTIALS)(
	PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred);

typedef
DWORD (WINAPI *PWLX_QUERY_TERMINAL_SERVICES_DATA)(
	HANDLE                      hWlx,
	PWLX_TERMINAL_SERVICES_DATA pTSData,
	WCHAR                       *UserName,
	WCHAR                       *Domain);

typedef
BOOL (WINAPI *PWLX_QUERY_TS_LOGON_CREDENTIALS)(
	PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred);

typedef
VOID (WINAPI *PWLX_SAS_NOTIFY)(
	HANDLE hWlx,
	DWORD  dwSasType);

typedef
VOID (WINAPI *PWLX_SET_CONTEXT_POINTER)(
	HANDLE hWlx,
	PVOID  pWlxContext);

typedef
BOOL (WINAPI *PWLX_SET_RETURN_DESKTOP)(
	HANDLE       hWlx,
	PWLX_DESKTOP pDesktop);

typedef
BOOL (WINAPI *PWLX_SET_OPTION)(
	HANDLE    hWlx,
	DWORD     Option,
	ULONG_PTR Value,
	ULONG_PTR *OldValue);

typedef
BOOL (WINAPI *PWLX_SET_TIMEOUT)(
	HANDLE hWlx,
	DWORD  Timeout);

typedef
int (WINAPI *PWLX_SWITCH_DESKTOP_TO_USER)(
	HANDLE hWlx);

typedef
int (WINAPI *PWLX_SWITCH_DESKTOP_TO_WINLOGON)(
	HANDLE hWlx);

typedef
VOID (WINAPI *PWLX_USE_CTRL_ALT_DEL)(
	HANDLE hWlx);

typedef
VOID (WINAPI *PWLX_WIN31_MIGRATE)(
	HANDLE hWlx);


/* function dispatch tables */

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;

typedef
struct _WLX_DISPATCH_VERSION_1_4
{
	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;
	PWLX_QUERY_CONSOLESWITCH_CREDENTIALS WlxQueryConsoleSwitchCredentials;
	PWLX_QUERY_TS_LOGON_CREDENTIALS      WlxQueryTsLogonCredentials;
} WLX_DISPATCH_VERSION_1_4, *PWLX_DISPATCH_VERSION_1_4;


/* 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 pack(pop)

#ifdef __cplusplus
}
#endif

#endif /*__WINWLX_H */

/* EOF */
