/*
 *  wtsapi32.h  Windows Terminal Server (WTS) functions
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2026 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef _INC_WTSAPI
#define _INC_WTSAPI

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Special values */
#define WTS_CURRENT_SERVER          NULL
#define WTS_CURRENT_SERVER_HANDLE   NULL
#define WTS_CURRENT_SERVER_NAME     NULL
#define WTS_CURRENT_SESSION         0xFFFFFFFFL
#define WTS_ANY_SESSION             0xFFFFFFFEL

/* WTS shutdown flags */
#define WTS_WSD_LOGOFF      0x00000001L
#define WTS_WSD_SHUTDOWN    0x00000002L
#define WTS_WSD_REBOOT      0x00000004L
#define WTS_WSD_POWEROFF    0x00000008L
#define WTS_WSD_FASTREBOOT  0x00000010L

/* Maximum string lengths */
#ifndef __HYDRIX_H__
    #define USERNAME_LENGTH                     20
    #define CLIENTNAME_LENGTH                   20
    #define CLIENTADDRESS_LENGTH                30
#endif
#define MAX_ELAPSED_TIME_LENGTH                 15
#define MAX_DATE_TIME_LENGTH                    56
#define WINSTATIONNAME_LENGTH                   32
#define DOMAIN_LENGTH                           17
#define WTS_DRIVE_LENGTH                        3
#define WTS_LISTENER_NAME_LENGTH                32
#define WTS_COMMENT_LENGTH                      60
#define PRODUCTINFO_COMPANYNAME_LENGTH          256
#define PRODUCTINFO_PRODUCTID_LENGTH            4
#define VALIDATIONINFORMATION_LICENSE_LENGTH    16384
#define VALIDATIONINFORMATION_HARDWAREID_LENGTH 20

/* WTSCreateListener() flags */
#define WTS_LISTENER_CREATE 0x00000001L
#define WTS_LISTENER_UPDATE 0x00000002L

/* WTS access rights */
#define WTS_SECURITY_QUERY_INFORMATION  0x0001L
#define WTS_SECURITY_SET_INFORMATION    0x0002L
#define WTS_SECURITY_RESET              0x0004L
#define WTS_SECURITY_VIRTUAL_CHANNELS   0x0008L
#define WTS_SECURITY_REMOTE_CONTROL     0x0010L
#define WTS_SECURITY_LOGON              0x0020L
#define WTS_SECURITY_LOGOFF             0x0040L
#define WTS_SECURITY_MESSAGE            0x0080L
#define WTS_SECURITY_CONNECT            0x0100L
#define WTS_SECURITY_DISCONNECT         0x0200L
#define WTS_SECURITY_GUEST_ACCESS       WTS_SECURITY_LOGON
#define WTS_SECURITY_CURRENT_GUEST_ACCESS \
    (WTS_SECURITY_VIRTUAL_CHANNELS | WTS_SECURITY_LOGOFF)
#define WTS_SECURITY_USER_ACCESS \
    (WTS_SECURITY_CURRENT_GUEST_ACCESS | WTS_SECURITY_QUERY_INFORMATION | \
    WTS_SECURITY_CONNECT)
#define WTS_SECURITY_CURRENT_USER_ACCESS \
    (WTS_SECURITY_SET_INFORMATION | WTS_SECURITY_RESET | \
    WTS_SECURITY_VIRTUAL_CHANNELS | WTS_SECURITY_LOGOFF | WTS_SECURITY_DISCONNECT)
#define WTS_SECURITY_ALL_ACCESS \
    (STANDARD_RIGHTS_REQUIRED | WTS_SECURITY_QUERY_INFORMATION | \
    WTS_SECURITY_SET_INFORMATION | WTS_SECURITY_RESET | WTS_SECURITY_VIRTUAL_CHANNELS | \
    WTS_SECURITY_REMOTE_CONTROL | WTS_SECURITY_LOGON | WTS_SECURITY_MESSAGE | \
    WTS_SECURITY_CONNECT | WTS_SECURITY_DISCONNECT)

/* WTS protocol types */
#define WTS_PROTOCOL_TYPE_CONSOLE   0
#define WTS_PROTOCOL_TYPE_ICA       1
#define WTS_PROTOCOL_TYPE_RDP       2

/* WTS session state flags */
#define WTS_SESSIONSTATE_UNKNOWN    0xFFFFFFFFL
#define WTS_SESSIONSTATE_LOCK       0x00000000L
#define WTS_SESSIONSTATE_UNLOCK     0x00000001L

/* WTS event flags */
#define WTS_EVENT_NONE          0x00000000L
#define WTS_EVENT_CREATE        0x00000001L
#define WTS_EVENT_DELETE        0x00000002L
#define WTS_EVENT_RENAME        0x00000004L
#define WTS_EVENT_CONNECT       0x00000008L
#define WTS_EVENT_DISCONNECT    0x00000010L
#define WTS_EVENT_LOGON         0x00000020L
#define WTS_EVENT_LOGOFF        0x00000040L
#define WTS_EVENT_STATECHANGE   0x00000080L
#define WTS_EVENT_LICENSE       0x00000100L
#define WTS_EVENT_ALL           0x7FFFFFFFL
#define WTS_EVENT_FLUSH         0x80000000L

/* WTSStartRemoteControlSession() hotkey modifiers */
#define REMOTECONTROL_KBDSHIFT_HOTKEY   0x0001
#define REMOTECONTROL_KBDCTRL_HOTKEY    0x0002
#define REMOTECONTROL_KBDALT_HOTKEY     0x0004

/* WTSVirtualChannelOpenEx() flags */
#define WTS_CHANNEL_OPTION_DYNAMIC              0x00000001L
#define WTS_CHANNEL_OPTION_DYNAMIC_PRI_LOW      0x00000000L
#define WTS_CHANNEL_OPTION_DYNAMIC_PRI_MED      0x00000002L
#define WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH     0x00000004L
#define WTS_CHANNEL_OPTION_DYNAMIC_PRI_REAL     0x00000006L
#define WTS_CHANNEL_OPTION_DYNAMIC_NO_COMPRESS  0x00000008L

/* Console notification flags */
#define NOTIFY_FOR_THIS_SESSION 0
#define NOTIFY_FOR_ALL_SESSIONS 1

/* WTS process information levels */
#define WTS_PROCESS_INFO_LEVEL_0    0L
#define WTS_PROCESS_INFO_LEVEL_1    1L

/* WTS connect state classes */
typedef enum _WTS_CONNECTSTATE_CLASS {
    WTSActive       = 0,
    WTSConnected    = 1,
    WTSConnectQuery = 2,
    WTSShadow       = 3,
    WTSDisconnected = 4,
    WTSIdle         = 5,
    WTSListen       = 6,
    WTSReset        = 7,
    WTSDown         = 8,
    WTSInit         = 9
} WTS_CONNECTSTATE_CLASS;

/* WTS server information */
typedef struct _WTS_SERVER_INFOA {
    LPSTR   pServerName;
} WTS_SERVER_INFOA;
typedef WTS_SERVER_INFOA    *PWTS_SERVER_INFOA;
typedef struct _WTS_SERVER_INFOW {
    LPWSTR  pServerName;
} WTS_SERVER_INFOW;
typedef WTS_SERVER_INFOW    *PWTS_SERVER_INFOW;
#ifdef UNICODE
typedef WTS_SERVER_INFOW    WTS_SERVER_INFO;
typedef PWTS_SERVER_INFOW   PWTS_SERVER_INFO;
#else
typedef WTS_SERVER_INFOA    WTS_SERVER_INFO;
typedef PWTS_SERVER_INFOA   PWTS_SERVER_INFO;
#endif

/* WTS session information */
typedef struct _WTS_SESSION_INFOA {
    DWORD                   SessionId;
    LPSTR                   pWinStationName;
    WTS_CONNECTSTATE_CLASS  State;
} WTS_SESSION_INFOA;
typedef WTS_SESSION_INFOA   *PWTS_SESSION_INFOA;
typedef struct _WTS_SESSION_INFOW {
    DWORD                   SessionId;
    LPWSTR                  pWinStationName;
    WTS_CONNECTSTATE_CLASS  State;
} WTS_SESSION_INFOW;
typedef WTS_SESSION_INFOW   *PWTS_SESSION_INFOW;
#ifdef UNICODE
typedef WTS_SESSION_INFOW   WTS_SESSION_INFO;
typedef PWTS_SESSION_INFOW  PWTS_SESSION_INFO;
#else
typedef WTS_SESSION_INFOA   WTS_SESSION_INFO;
typedef PWTS_SESSION_INFOA  PWTS_SESSION_INFO;
#endif

/* WTS session information (level 1) */
typedef struct _WTS_SESSION_INFO_1A {
    DWORD                   ExecEnvId;
    WTS_CONNECTSTATE_CLASS  State;
    DWORD                   SessionId;
    LPSTR                   pSessionName;
    LPSTR                   pHostName;
    LPSTR                   pUserName;
    LPSTR                   pDomainName;
    LPSTR                   pFarmName;
} WTS_SESSION_INFO_1A;
typedef WTS_SESSION_INFO_1A     *PWTS_SESSION_INFO_1A;
typedef struct _WTS_SESSION_INFO_1W {
    DWORD                   ExecEnvId;
    WTS_CONNECTSTATE_CLASS  State;
    DWORD                   SessionId;
    LPWSTR                  pSessionName;
    LPWSTR                  pHostName;
    LPWSTR                  pUserName;
    LPWSTR                  pDomainName;
    LPWSTR                  pFarmName;
} WTS_SESSION_INFO_1W;
typedef WTS_SESSION_INFO_1W     *PWTS_SESSION_INFO_1W;
#ifdef UNICODE
typedef WTS_SESSION_INFO_1W     WTS_SESSION_INFO_1;
typedef PWTS_SESSION_INFO_1W    PWTS_SESSION_INFO_1;
#else
typedef WTS_SESSION_INFO_1A     WTS_SESSION_INFO_1;
typedef PWTS_SESSION_INFO_1A    PWTS_SESSION_INFO_1;
#endif

/* WTS process information */
typedef struct _WTS_PROCESS_INFOA {
    DWORD   SessionId;
    DWORD   ProcessId;
    LPSTR   pProcessName;
    PSID    pUserSid;
} WTS_PROCESS_INFOA;
typedef WTS_PROCESS_INFOA   *PWTS_PROCESS_INFOA;
typedef struct _WTS_PROCESS_INFOW {
    DWORD   SessionId;
    DWORD   ProcessId;
    LPWSTR  pProcessName;
    PSID    pUserSid;
} WTS_PROCESS_INFOW;
typedef WTS_PROCESS_INFOW   *PWTS_PROCESS_INFOW;
#ifdef UNICODE
typedef WTS_PROCESS_INFOW   WTS_PROCESS_INFO;
typedef PWTS_PROCESS_INFOW  PWTS_PROCESS_INFO;
#else
typedef WTS_PROCESS_INFOA   WTS_PROCESS_INFO;
typedef PWTS_PROCESS_INFOA  PWTS_PROCESS_INFO;
#endif

/* WTS information classes */
typedef enum _WTS_INFO_CLASS {
    WTSInitialProgram       = 0,
    WTSApplicationName      = 1,
    WTSWorkingDirectory     = 2,
    WTSOEMId                = 3,
    WTSSessionId            = 4,
    WTSUserName             = 5,
    WTSWinStationName       = 6,
    WTSDomainName           = 7,
    WTSConnectState         = 8,
    WTSClientBuildNumber    = 9,
    WTSClientName           = 10,
    WTSClientDirectory      = 11,
    WTSClientProductId      = 12,
    WTSClientHardwareId     = 13,
    WTSClientAddress        = 14,
    WTSClientDisplay        = 15,
    WTSClientProtocolType   = 16,
    WTSIdleTime             = 17,
    WTSLogonTime            = 18,
    WTSIncomingBytes        = 19,
    WTSOutgoingBytes        = 20,
    WTSIncomingFrames       = 21,
    WTSOutgoingFrames       = 22,
    WTSClientInfo           = 23,
    WTSSessionInfo          = 24,
    WTSSessionInfoEx        = 25,
    WTSConfigInfo           = 26,
    WTSValidationInfo       = 27,
    WTSSessionAddressV4     = 28,
    WTSIsRemoteSession      = 29
} WTS_INFO_CLASS;

/* WTS configuration information */
typedef struct _WTSCONFIGINFOA {
    ULONG   version;
    ULONG   fConnectClientDrivesAtLogon;
    ULONG   fConnectPrinterAtLogon;
    ULONG   fDisablePrinterRedirection;
    ULONG   fDisableDefaultMainClientPrinter;
    ULONG   ShadowSettings;
    CHAR    LogonUserName[USERNAME_LENGTH + 1];
    CHAR    LogonDomain[DOMAIN_LENGTH + 1];
    CHAR    WorkDirectory[MAX_PATH + 1];
    CHAR    InitialProgram[MAX_PATH + 1];
    CHAR    ApplicationName[MAX_PATH + 1];
} WTSCONFIGINFOA;
typedef WTSCONFIGINFOA  *PWTSCONFIGINFOA;
typedef struct _WTSCONFIGINFOW {
    ULONG   version;
    ULONG   fConnectClientDrivesAtLogon;
    ULONG   fConnectPrinterAtLogon;
    ULONG   fDisablePrinterRedirection;
    ULONG   fDisableDefaultMainClientPrinter;
    ULONG   ShadowSettings;
    WCHAR   LogonUserName[USERNAME_LENGTH + 1];
    WCHAR   LogonDomain[DOMAIN_LENGTH + 1];
    WCHAR   WorkDirectory[MAX_PATH + 1];
    WCHAR   InitialProgram[MAX_PATH + 1];
    WCHAR   ApplicationName[MAX_PATH + 1];
} WTSCONFIGINFOW;
typedef WTSCONFIGINFOW  *PWTSCONFIGINFOW;
#ifdef UNICODE
typedef WTSCONFIGINFOW  WTSCONFIGINFO;
typedef PWTSCONFIGINFOW PWTSCONFIGINFO;
#else
typedef WTSCONFIGINFOA  WTSCONFIGINFO;
typedef PWTSCONFIGINFOA PWTSCONFIGINFO;
#endif

/* WTS information */
typedef struct _WTSINFOA {
    WTS_CONNECTSTATE_CLASS  State;
    DWORD                   SessionId;
    DWORD                   IncomingBytes;
    DWORD                   OutgoingBytes;
    DWORD                   IncomingFrames;
    DWORD                   OutgoingFrames;
    DWORD                   IncomingCompressedBytes;
    DWORD                   OutgoingCompressedBytes;
    CHAR                    WinStationName[WINSTATIONNAME_LENGTH];
    CHAR                    Domain[DOMAIN_LENGTH];
    CHAR                    UserName[USERNAME_LENGTH + 1];
    LARGE_INTEGER           ConnectTime;
    LARGE_INTEGER           DisconnectTime;
    LARGE_INTEGER           LastInputTime;
    LARGE_INTEGER           LogonTime;
    LARGE_INTEGER           CurrentTime;
} WTSINFOA;
typedef WTSINFOA    *PWTSINFOA;
typedef struct _WTSINFOW {
    WTS_CONNECTSTATE_CLASS  State;
    DWORD                   SessionId;
    DWORD                   IncomingBytes;
    DWORD                   OutgoingBytes;
    DWORD                   IncomingFrames;
    DWORD                   OutgoingFrames;
    DWORD                   IncomingCompressedBytes;
    DWORD                   OutgoingCompressedBytes;
    WCHAR                   WinStationName[WINSTATIONNAME_LENGTH];
    WCHAR                   Domain[DOMAIN_LENGTH];
    WCHAR                   UserName[USERNAME_LENGTH + 1];
    LARGE_INTEGER           ConnectTime;
    LARGE_INTEGER           DisconnectTime;
    LARGE_INTEGER           LastInputTime;
    LARGE_INTEGER           LogonTime;
    LARGE_INTEGER           CurrentTime;
} WTSINFOW;
typedef WTSINFOW    *PWTSINFOW;
#ifdef UNICODE
typedef WTSINFOW    WTSINFO;
typedef PWTSINFOW   PWTSINFO;
#else
typedef WTSINFOA    WTSINFO;
typedef PWTSINFOA   PWTSINFO;
#endif

/* WTS information (extended version) (level 1) */
typedef struct _WTSINFOEX_LEVEL1_A {
    ULONG                   SessionId;
    WTS_CONNECTSTATE_CLASS  SessionState;
    LONG                    SessionFlags;
    CHAR                    WinStationName[WINSTATIONNAME_LENGTH + 1];
    CHAR                    UserName[USERNAME_LENGTH + 1];
    CHAR                    DomainName[DOMAIN_LENGTH + 1];
    LARGE_INTEGER           LogonTime;
    LARGE_INTEGER           ConnectTime;
    LARGE_INTEGER           DisconnectTime;
    LARGE_INTEGER           LastInputTime;
    LARGE_INTEGER           CurrentTime;
    DWORD                   IncomingBytes;
    DWORD                   OutgoingBytes;
    DWORD                   IncomingFrames;
    DWORD                   OutgoingFrames;
    DWORD                   IncomingCompressedBytes;
    DWORD                   OutgoingCompressedBytes;
} WTSINFOEX_LEVEL1_A;
typedef WTSINFOEX_LEVEL1_A  *PWTSINFOEX_LEVEL1_A;
typedef struct _WTSINFOEX_LEVEL1_W {
    ULONG                   SessionId;
    WTS_CONNECTSTATE_CLASS  SessionState;
    LONG                    SessionFlags;
    WCHAR                   WinStationName[WINSTATIONNAME_LENGTH + 1];
    WCHAR                   UserName[USERNAME_LENGTH + 1];
    WCHAR                   DomainName[DOMAIN_LENGTH + 1];
    LARGE_INTEGER           LogonTime;
    LARGE_INTEGER           ConnectTime;
    LARGE_INTEGER           DisconnectTime;
    LARGE_INTEGER           LastInputTime;
    LARGE_INTEGER           CurrentTime;
    DWORD                   IncomingBytes;
    DWORD                   OutgoingBytes;
    DWORD                   IncomingFrames;
    DWORD                   OutgoingFrames;
    DWORD                   IncomingCompressedBytes;
    DWORD                   OutgoingCompressedBytes;
} WTSINFOEX_LEVEL1_W;
typedef WTSINFOEX_LEVEL1_W  *PWTSINFOEX_LEVEL1_W;
#ifdef UNICODE
typedef WTSINFOEX_LEVEL1_W  WTSINFOEX_LEVEL1;
typedef PWTSINFOEX_LEVEL1_W PWTSINFOEX_LEVEL1;
#else
typedef WTSINFOEX_LEVEL1_A  WTSINFOEX_LEVEL1;
typedef PWTSINFOEX_LEVEL1_A PWTSINFOEX_LEVEL1;
#endif

/* WTS information (extended version) (all levels) */
typedef union _WTSINFOEX_LEVEL_A {
    WTSINFOEX_LEVEL1_A  WTSInfoExLevel1;
} WTSINFOEX_LEVEL_A;
typedef WTSINFOEX_LEVEL_A   *PWTSINFOEX_LEVEL_A;
typedef union _WTSINFOEX_LEVEL_W {
    WTSINFOEX_LEVEL1_W  WTSInfoExLevel1;
} WTSINFOEX_LEVEL_W;
typedef WTSINFOEX_LEVEL_W   *PWTSINFOEX_LEVEL_W;
#ifdef UNICODE
typedef WTSINFOEX_LEVEL_W   WTSINFOEX_LEVEL;
typedef PWTSINFOEX_LEVEL_W  PWTSINFOEX_LEVEL;
#else
typedef WTSINFOEX_LEVEL_A   WTSINFOEX_LEVEL;
typedef PWTSINFOEX_LEVEL_A  PWTSINFOEX_LEVEL;
#endif

/* WTS information (extended version) */
typedef struct _WTSINFOEXA {
    DWORD               Level;
    WTSINFOEX_LEVEL_A   Data;
} WTSINFOEXA;
typedef WTSINFOEXA  *PWTSINFOEXA;
typedef struct _WTSINFOEXW {
    DWORD               Level;
    WTSINFOEX_LEVEL_W   Data;
} WTSINFOEXW;
typedef WTSINFOEXW  *PWTSINFOEXW;
#ifdef UNICODE
typedef WTSINFOEXW  WTSINFOEX;
typedef PWTSINFOEXW PWTSINFOEX;
#else
typedef WTSINFOEXA  WTSINFOEX;
typedef PWTSINFOEXA PWTSINFOEX;
#endif

/* WTS client information */
typedef struct _WTSCLIENTA {
    CHAR    ClientName[CLIENTNAME_LENGTH + 1];
    CHAR    Domain[DOMAIN_LENGTH + 1];
    CHAR    UserName[USERNAME_LENGTH + 1];
    CHAR    WorkDirectory[MAX_PATH + 1];
    CHAR    InitialProgram[MAX_PATH + 1];
    BYTE    EncryptionLevel;
    ULONG   ClientAddressFamily;
    USHORT  ClientAddress[CLIENTADDRESS_LENGTH + 1];
    USHORT  HRes;
    USHORT  VRes;
    USHORT  ColorDepth;
    CHAR    ClientDirectory[MAX_PATH + 1];
    ULONG   ClientBuildNumber;
    ULONG   ClientHardwareId;
    USHORT  ClientProductId;
    USHORT  OutBufCountHost;
    USHORT  OutBufCountClient;
    USHORT  OutBufLength;
    CHAR    DeviceId[MAX_PATH + 1];
} WTSCLIENTA;
typedef WTSCLIENTA  *PWTSCLIENTA;
typedef struct _WTSCLIENTW {
    WCHAR   ClientName[CLIENTNAME_LENGTH + 1];
    WCHAR   Domain[DOMAIN_LENGTH + 1];
    WCHAR   UserName[USERNAME_LENGTH + 1];
    WCHAR   WorkDirectory[MAX_PATH + 1];
    WCHAR   InitialProgram[MAX_PATH + 1];
    BYTE    EncryptionLevel;
    ULONG   ClientAddressFamily;
    USHORT  ClientAddress[CLIENTADDRESS_LENGTH + 1];
    USHORT  HRes;
    USHORT  VRes;
    USHORT  ColorDepth;
    WCHAR   ClientDirectory[MAX_PATH + 1];
    ULONG   ClientBuildNumber;
    ULONG   ClientHardwareId;
    USHORT  ClientProductId;
    USHORT  OutBufCountHost;
    USHORT  OutBufCountClient;
    USHORT  OutBufLength;
    WCHAR   DeviceId[MAX_PATH + 1];
} WTSCLIENTW;
typedef WTSCLIENTW  *PWTSCLIENTW;
#ifdef UNICODE
typedef WTSCLIENTW  WTSCLIENT;
typedef PWTSCLIENTW PWTSCLIENT;
#else
typedef WTSCLIENTA  WTSCLIENT;
typedef PWTSCLIENTA PWTSCLIENT;
#endif

/* WTS product information */
typedef struct _WTS_PRODUCT_INFOA {
    CHAR    CompanyName[PRODUCTINFO_COMPANYNAME_LENGTH];
    CHAR    ProductID[PRODUCTINFO_PRODUCTID_LENGTH];
} PRODUCT_INFOA;
typedef struct _WTS_PRODUCT_INFOW {
    WCHAR   CompanyName[PRODUCTINFO_COMPANYNAME_LENGTH];
    WCHAR   ProductID[PRODUCTINFO_PRODUCTID_LENGTH];
} PRODUCT_INFOW;
#ifdef UNICODE
typedef PRODUCT_INFOW   PRODUCT_INFO;
#else
typedef PRODUCT_INFOA   PRODUCT_INFO;
#endif

/* WTS validation information */
typedef struct _WTS_VALIDATION_INFORMATIONA {
    PRODUCT_INFOA   ProductInfo;
    BYTE            License[VALIDATIONINFORMATION_LICENSE_LENGTH];
    DWORD           LicenseLength;
    BYTE            HardwareID[VALIDATIONINFORMATION_HARDWAREID_LENGTH];
    DWORD           HardwareIDLength;
} WTS_VALIDATION_INFORMATIONA;
typedef WTS_VALIDATION_INFORMATIONA     *PWTS_VALIDATION_INFORMATIONA;
typedef struct _WTS_VALIDATION_INFORMATIONW {
    PRODUCT_INFOW   ProductInfo;
    BYTE            License[VALIDATIONINFORMATION_LICENSE_LENGTH];
    DWORD           LicenseLength;
    BYTE            HardwareID[VALIDATIONINFORMATION_HARDWAREID_LENGTH];
    DWORD           HardwareIDLength;
} WTS_VALIDATION_INFORMATIONW;
typedef WTS_VALIDATION_INFORMATIONW     *PWTS_VALIDATION_INFORMATIONW;
#ifdef UNICODE
typedef WTS_VALIDATION_INFORMATIONW     WTS_VALIDATION_INFORMATION;
typedef PWTS_VALIDATION_INFORMATIONW    PWTS_VALIDATION_INFORMATION;
#else
typedef WTS_VALIDATION_INFORMATIONA     WTS_VALIDATION_INFORMATION;
typedef PWTS_VALIDATION_INFORMATIONA    PWTS_VALIDATION_INFORMATION;
#endif

/* WTS client address information */
typedef struct _WTS_CLIENT_ADDRESS {
    DWORD   AddressFamily;
    BYTE    Address[20];
} WTS_CLIENT_ADDRESS;
typedef WTS_CLIENT_ADDRESS  *PWTS_CLIENT_ADDRESS;

/* WTS client display information */
typedef struct _WTS_CLIENT_DISPLAY {
    DWORD   HorizontalResolution;
    DWORD   VerticalResolution;
    DWORD   ColorDepth;
} WTS_CLIENT_DISPLAY;
typedef WTS_CLIENT_DISPLAY  *PWTS_CLIENT_DISPLAY;

/* WTS configuration classes */
typedef enum _WTS_CONFIG_CLASS {
    WTSUserConfigInitialProgram                 = 0,
    WTSUserConfigWorkingDirectory               = 1,
    WTSUserConfigfInheritInitialProgram         = 2,
    WTSUserConfigfAllowLogonTerminalServer      = 3,
    WTSUserConfigTimeoutSettingsConnections     = 4,
    WTSUserConfigTimeoutSettingsDisconnections  = 5,
    WTSUserConfigTimeoutSettingsIdle            = 6,
    WTSUserConfigfDeviceClientDrives            = 7,
    WTSUserConfigfDeviceClientPrinters          = 8,
    WTSUserConfigfDeviceClientDefaultPrinter    = 9,
    WTSUserConfigBrokenTimeoutSettings          = 10,
    WTSUserConfigReconnectSettings              = 11,
    WTSUserConfigModemCallbackSettings          = 12,
    WTSUserConfigModemCallbackPhoneNumber       = 13,
    WTSUserConfigShadowingSettings              = 14,
    WTSUserConfigTerminalServerProfilePath      = 15,
    WTSUserConfigTerminalServerHomeDir          = 16,
    WTSUserConfigTerminalServerHomeDirDrive     = 17,
    WTSUserConfigfTerminalServerRemoteHomeDir   = 18,
    WTSUserConfigUser                           = 19
} WTS_CONFIG_CLASS;

/* WTS configuration sources */
typedef enum _WTS_CONFIG_SOURCE {
    WTSUserConfigSourceSAM  = 0
} WTS_CONFIG_SOURCE;

/* WTS user configuration */
typedef struct _WTSUSERCONFIGA {
    DWORD   Source;
    DWORD   InheritInitialProgram;
    DWORD   AllowLogonTerminalServer;
    DWORD   TimeoutSettingsConnections;
    DWORD   TimeoutSettingsDisconnections;
    DWORD   TimeoutSettingsIdle;
    DWORD   DeviceClientDrives;
    DWORD   DeviceClientPrinters;
    DWORD   ClientDefaultPrinter;
    DWORD   BrokenTimeoutSettings;
    DWORD   ReconnectSettings;
    DWORD   ShadowingSettings;
    DWORD   TerminalServerRemoteHomeDir;
    CHAR    InitialProgram[MAX_PATH + 1];
    CHAR    WorkDirectory[MAX_PATH + 1];
    CHAR    TerminalServerProfilePath[MAX_PATH + 1];
    CHAR    TerminalServerHomeDir[MAX_PATH + 1];
    CHAR    TerminalServerHomeDirDrive[WTS_DRIVE_LENGTH + 1];
} WTSUSERCONFIGA;
typedef WTSUSERCONFIGA  *PWTSUSERCONFIGA;
typedef struct _WTSUSERCONFIGW {
    DWORD   Source;
    DWORD   InheritInitialProgram;
    DWORD   AllowLogonTerminalServer;
    DWORD   TimeoutSettingsConnections;
    DWORD   TimeoutSettingsDisconnections;
    DWORD   TimeoutSettingsIdle;
    DWORD   DeviceClientDrives;
    DWORD   DeviceClientPrinters;
    DWORD   ClientDefaultPrinter;
    DWORD   BrokenTimeoutSettings;
    DWORD   ReconnectSettings;
    DWORD   ShadowingSettings;
    DWORD   TerminalServerRemoteHomeDir;
    WCHAR   InitialProgram[MAX_PATH + 1];
    WCHAR   WorkDirectory[MAX_PATH + 1];
    WCHAR   TerminalServerProfilePath[MAX_PATH + 1];
    WCHAR   TerminalServerHomeDir[MAX_PATH + 1];
    WCHAR   TerminalServerHomeDirDrive[WTS_DRIVE_LENGTH + 1];
} WTSUSERCONFIGW;
typedef WTSUSERCONFIGW  *PWTSUSERCONFIGW;
#ifdef UNICODE
typedef WTSUSERCONFIGW  WTSUSERCONFIG;
typedef PWTSUSERCONFIGW PWTSUSERCONFIG;
#else
typedef WTSUSERCONFIGA  WTSUSERCONFIG;
typedef PWTSUSERCONFIGA PWTSUSERCONFIG;
#endif

/* WTS virtual classes */
typedef enum _WTS_VIRTUAL_CLASS {
    WTSVirtualClientData    = 0,
    WTSVirtualFileHandle    = 1
} WTS_VIRTUAL_CLASS;

/* WTS session address */
typedef struct _WTS_SESSION_ADDRESS {
    DWORD   AddressFamily;
    BYTE    Address[20];
} WTS_SESSION_ADDRESS;
typedef WTS_SESSION_ADDRESS *PWTS_SESSION_ADDRESS;

/* WTS process information (extended version) */
typedef struct _WTS_PROCESS_INFO_EXA {
    DWORD           SessionId;
    DWORD           ProcessId;
    LPSTR           pProcessName;
    PSID            pUserSid;
    DWORD           NumberOfThreads;
    DWORD           HandleCount;
    DWORD           PagefileUsage;
    DWORD           PeakPagefileUsage;
    DWORD           WorkingSetSize;
    DWORD           PeakWorkingSetSize;
    LARGE_INTEGER   UserTime;
    LARGE_INTEGER   KernelTime;
} WTS_PROCESS_INFO_EXA;
typedef WTS_PROCESS_INFO_EXA    *PWTS_PROCESS_INFO_EXA;
typedef struct _WTS_PROCESS_INFO_EXW {
    DWORD           SessionId;
    DWORD           ProcessId;
    LPWSTR          pProcessName;
    PSID            pUserSid;
    DWORD           NumberOfThreads;
    DWORD           HandleCount;
    DWORD           PagefileUsage;
    DWORD           PeakPagefileUsage;
    DWORD           WorkingSetSize;
    DWORD           PeakWorkingSetSize;
    LARGE_INTEGER   UserTime;
    LARGE_INTEGER   KernelTime;
} WTS_PROCESS_INFO_EXW;
typedef WTS_PROCESS_INFO_EXW    *PWTS_PROCESS_INFO_EXW;
#ifdef UNICODE
typedef WTS_PROCESS_INFO_EXW    WTS_PROCESS_INFO_EX;
typedef PWTS_PROCESS_INFO_EXW   PWTS_PROCESS_INFO_EX;
#else
typedef WTS_PROCESS_INFO_EXA    WTS_PROCESS_INFO_EX;
typedef PWTS_PROCESS_INFO_EXA   PWTS_PROCESS_INFO_EX;
#endif

/* WTS type classes */
typedef enum _WTS_TYPE_CLASS {
    WTSTypeProcessInfoLevel0    = 0,
    WTSTypeProcessInfoLevel1    = 1,
    WTSTypeSessionInfoLevel1    = 2
} WTS_TYPE_CLASS;

/* WTS listener name */
typedef CHAR                WTSLISTENERNAMEA[WTS_LISTENER_NAME_LENGTH + 1];
typedef WTSLISTENERNAMEA    *PWTSLISTENERNAMEA;
typedef WCHAR               WTSLISTENERNAMEW[WTS_LISTENER_NAME_LENGTH + 1];
typedef WTSLISTENERNAMEW    *PWTSLISTENERNAMEW;
#ifdef UNICODE
typedef WTSLISTENERNAMEW    WTSLISTENERNAME;
typedef PWTSLISTENERNAMEW   PWTSLISTENERNAME;
#else
typedef WTSLISTENERNAMEA    WTSLISTENERNAME;
typedef PWTSLISTENERNAMEA   PWTSLISTENERNAME;
#endif

/* WTS listener configuration */
typedef struct _WTSLISTENERCONFIGA {
    ULONG   version;
    ULONG   fEnableListener;
    ULONG   MaxConnectionCount;
    ULONG   fPromptForPassword;
    ULONG   fInheritColorDepth;
    ULONG   ColorDepth;
    ULONG   fInheritBrokenTimeoutSettings;
    ULONG   BrokenTimeoutSettings;
    ULONG   fDisablePrinterRedirection;
    ULONG   fDisableDriveRedirection;
    ULONG   fDisableComPortRedirection;
    ULONG   fDisableLPTPortRedirection;
    ULONG   fDisableClipboardRedirection;
    ULONG   fDisableAudioRedirection;
    ULONG   fDisablePNPRedirection;
    ULONG   fDisableDefaultMainClientPrinter;
    ULONG   LanAdapter;
    ULONG   PortNumber;
    ULONG   fInheritShadowSettings;
    ULONG   ShadowSettings;
    ULONG   TimeoutSettingsConnection;
    ULONG   TimeoutSettingsDisconnection;
    ULONG   TimeoutSettingsIdle;
    ULONG   SecurityLayer;
    ULONG   MinEncryptionLevel;
    ULONG   UserAuthentication;
    CHAR    Comment[WTS_COMMENT_LENGTH + 1];
    CHAR    LogonUserName[USERNAME_LENGTH + 1];
    CHAR    LogonDomain[DOMAIN_LENGTH + 1];
    CHAR    WorkDirectory[MAX_PATH + 1];
    CHAR    InitialProgram[MAX_PATH + 1];
} WTSLISTENERCONFIGA;
typedef WTSLISTENERCONFIGA  *PWTSLISTENERCONFIGA;
typedef struct _WTSLISTENERCONFIGW {
    ULONG   version;
    ULONG   fEnableListener;
    ULONG   MaxConnectionCount;
    ULONG   fPromptForPassword;
    ULONG   fInheritColorDepth;
    ULONG   ColorDepth;
    ULONG   fInheritBrokenTimeoutSettings;
    ULONG   BrokenTimeoutSettings;
    ULONG   fDisablePrinterRedirection;
    ULONG   fDisableDriveRedirection;
    ULONG   fDisableComPortRedirection;
    ULONG   fDisableLPTPortRedirection;
    ULONG   fDisableClipboardRedirection;
    ULONG   fDisableAudioRedirection;
    ULONG   fDisablePNPRedirection;
    ULONG   fDisableDefaultMainClientPrinter;
    ULONG   LanAdapter;
    ULONG   PortNumber;
    ULONG   fInheritShadowSettings;
    ULONG   ShadowSettings;
    ULONG   TimeoutSettingsConnection;
    ULONG   TimeoutSettingsDisconnection;
    ULONG   TimeoutSettingsIdle;
    ULONG   SecurityLayer;
    ULONG   MinEncryptionLevel;
    ULONG   UserAuthentication;
    WCHAR   Comment[WTS_COMMENT_LENGTH + 1];
    WCHAR   LogonUserName[USERNAME_LENGTH + 1];
    WCHAR   LogonDomain[DOMAIN_LENGTH + 1];
    WCHAR   WorkDirectory[MAX_PATH + 1];
    WCHAR   InitialProgram[MAX_PATH + 1];
} WTSLISTENERCONFIGW;
typedef WTSLISTENERCONFIGW  *PWTSLISTENERCONFIGW;
#ifdef UNICODE
typedef WTSLISTENERCONFIGW  WTSLISTENERCONFIG;
typedef PWTSLISTENERCONFIGW PWTSLISTENERCONFIG;
#else
typedef WTSLISTENERCONFIGA  WTSLISTENERCONFIG;
typedef PWTSLISTENERCONFIGA PWTSLISTENERCONFIG;
#endif

/* Functions in WTSAPI32.DLL */
VOID WINAPI     WTSCloseServer( HANDLE );
BOOL WINAPI     WTSConnectSessionA( ULONG, ULONG, PSTR, BOOL );
BOOL WINAPI     WTSConnectSessionW( ULONG, ULONG, PWSTR, BOOL );
BOOL WINAPI     WTSCreateListenerA( HANDLE, PVOID, DWORD, LPSTR, PWTSLISTENERCONFIGA, DWORD );
BOOL WINAPI     WTSCreateListenerW( HANDLE, PVOID, DWORD, LPWSTR, PWTSLISTENERCONFIGW, DWORD );
BOOL WINAPI     WTSDisconnectSession( HANDLE, DWORD, BOOL );
BOOL WINAPI     WTSEnumerateListenersA( HANDLE, PVOID, DWORD, PWTSLISTENERNAMEA, DWORD * );
BOOL WINAPI     WTSEnumerateListenersW( HANDLE, PVOID, DWORD, PWTSLISTENERNAMEW, DWORD * );
BOOL WINAPI     WTSEnumerateProcessesA( HANDLE, DWORD, DWORD, PWTS_PROCESS_INFOA *, DWORD * );
BOOL WINAPI     WTSEnumerateProcessesExA( HANDLE, DWORD *, DWORD, LPSTR *, DWORD * );
BOOL WINAPI     WTSEnumerateProcessesExW( HANDLE, DWORD *, DWORD, LPWSTR *, DWORD * );
BOOL WINAPI     WTSEnumerateProcessesW( HANDLE, DWORD, DWORD, PWTS_PROCESS_INFOW *, DWORD * );
BOOL WINAPI     WTSEnumerateServersA( LPSTR, DWORD, DWORD, PWTS_SERVER_INFOA *, DWORD * );
BOOL WINAPI     WTSEnumerateServersW( LPWSTR, DWORD, DWORD, PWTS_SERVER_INFOW *, DWORD * );
BOOL WINAPI     WTSEnumerateSessionsA( HANDLE, DWORD, DWORD, PWTS_SESSION_INFOA *, DWORD * );
BOOL WINAPI     WTSEnumerateSessionsExA( HANDLE, DWORD *, DWORD, PWTS_SESSION_INFO_1A *, DWORD * );
BOOL WINAPI     WTSEnumerateSessionsExW( HANDLE, DWORD *, DWORD, PWTS_SESSION_INFO_1W *, DWORD * );
BOOL WINAPI     WTSEnumerateSessionsW( HANDLE, DWORD, DWORD, PWTS_SESSION_INFOW *, DWORD * );
VOID WINAPI     WTSFreeMemory( PVOID );
BOOL WINAPI     WTSFreeMemoryExA( WTS_TYPE_CLASS, PVOID, ULONG );
BOOL WINAPI     WTSFreeMemoryExW( WTS_TYPE_CLASS, PVOID, ULONG );
BOOL WINAPI     WTSGetListenerSecurityA( HANDLE, PVOID, DWORD, LPSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD );
BOOL WINAPI     WTSGetListenerSecurityW( HANDLE, PVOID, DWORD, LPWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD );
BOOL WINAPI     WTSLogoffSession( HANDLE, DWORD, BOOL );
HANDLE WINAPI   WTSOpenServerA( LPSTR );
HANDLE WINAPI   WTSOpenServerExA( LPSTR );
HANDLE WINAPI   WTSOpenServerExW( LPWSTR );
HANDLE WINAPI   WTSOpenServerW( LPWSTR );
BOOL WINAPI     WTSQueryListenerConfigA( HANDLE, PVOID, DWORD, LPSTR, PWTSLISTENERCONFIGA );
BOOL WINAPI     WTSQueryListenerConfigW( HANDLE, PVOID, DWORD, LPWSTR, PWTSLISTENERCONFIGW );
BOOL WINAPI     WTSQuerySessionInformationA( HANDLE, DWORD, WTS_INFO_CLASS, LPSTR *, DWORD * );
BOOL WINAPI     WTSQuerySessionInformationW( HANDLE, DWORD, WTS_INFO_CLASS, LPWSTR *, DWORD * );
BOOL WINAPI     WTSQueryUserConfigA( LPSTR, LPSTR, WTS_CONFIG_CLASS, LPSTR *, DWORD * );
BOOL WINAPI     WTSQueryUserConfigW( LPWSTR, LPWSTR, WTS_CONFIG_CLASS, LPWSTR *, DWORD * );
BOOL WINAPI     WTSQueryUserToken( ULONG, PHANDLE );
BOOL WINAPI     WTSRegisterSessionNotification( HWND, DWORD );
BOOL WINAPI     WTSRegisterSessionNotificationEx( HANDLE, HWND, DWORD );
BOOL WINAPI     WTSSendMessageA( HANDLE, DWORD, LPSTR, DWORD, LPSTR, DWORD, DWORD, DWORD, DWORD *, BOOL );
BOOL WINAPI     WTSSendMessageW( HANDLE, DWORD, LPWSTR, DWORD, LPWSTR, DWORD, DWORD, DWORD, DWORD *, BOOL );
BOOL WINAPI     WTSSetListenerSecurityA( HANDLE, PVOID, DWORD, LPSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR );
BOOL WINAPI     WTSSetListenerSecurityW( HANDLE, PVOID, DWORD, LPWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR );
BOOL WINAPI     WTSSetUserConfigA( LPSTR, LPSTR, WTS_CONFIG_CLASS, LPSTR, DWORD );
BOOL WINAPI     WTSSetUserConfigW( LPWSTR, LPWSTR, WTS_CONFIG_CLASS, LPWSTR, DWORD );
BOOL WINAPI     WTSShutdownSystem( HANDLE, DWORD );
BOOL WINAPI     WTSStartRemoteControlSessionA( LPSTR, ULONG, BYTE, USHORT );
BOOL WINAPI     WTSStartRemoteControlSessionW( LPWSTR, ULONG, BYTE, USHORT );
BOOL WINAPI     WTSStopRemoteControlSession( ULONG );
BOOL WINAPI     WTSTerminateProcess( HANDLE, DWORD, DWORD );
BOOL WINAPI     WTSUnRegisterSessionNotification( HWND );
BOOL WINAPI     WTSUnRegisterSessionNotificationEx( HANDLE, HWND );
BOOL WINAPI     WTSVirtualChannelClose( HANDLE );
HANDLE WINAPI   WTSVirtualChannelOpen( HANDLE, DWORD, LPSTR );
HANDLE WINAPI   WTSVirtualChannelOpenEx( DWORD, LPSTR, DWORD );
BOOL WINAPI     WTSVirtualChannelPurgeInput( HANDLE );
BOOL WINAPI     WTSVirtualChannelPurgeOutput( HANDLE );
BOOL WINAPI     WTSVirtualChannelQuery( HANDLE, WTS_VIRTUAL_CLASS, PVOID *, DWORD * );
BOOL WINAPI     WTSVirtualChannelRead( HANDLE, ULONG, PCHAR, ULONG, PULONG );
BOOL WINAPI     WTSVirtualChannelWrite( HANDLE, PCHAR, ULONG, PULONG );
BOOL WINAPI     WTSWaitSystemEvent( HANDLE, DWORD, DWORD * );

/* Map generic function names to the appropriate ANSI or Unicode version. */
#ifdef UNICODE
    #define WTSConnectServer                WTSConnectServerW
    #define WTSCreateListener               WTSCreateListenerW
    #define WTSEnumerateListeners           WTSEnumerateListenersW
    #define WTSEnumerateProcesses           WTSEnumerateProcessesW
    #define WTSEnumerateProcessesEx         WTSEnumerateProcessesExW
    #define WTSEnumerateServers             WTSEnumerateServersW
    #define WTSEnumerateSessions            WTSEnumerateSessionsW
    #define WTSEnumerateSessionsEx          WTSEnumerateSessionsExW
    #define WTSFreeMemoryEx                 WTSFreeMemoryExW
    #define WTSGetListenerSecurity          WTSGetListenerSecurityW
    #define WTSOpenServer                   WTSOpenServerW
    #define WTSOpenServerEx                 WTSOpenServerExW
    #define WTSQueryListenerConfig          WTSQueryListenerConfigW
    #define WTSQuerySessionInformation      WTSQuerySessionInformationW
    #define WTSQueryUserConfig              WTSQueryUserConfigW
    #define WTSSendMessage                  WTSSendMessageW
    #define WTSSetListenerSecurity          WTSSetListenerSecurityW
    #define WTSSetUserConfig                WTSSetUserConfigW
    #define WTSStartRemoteControlSession    WTSStartRemoteControlSessionW
#else
    #define WTSConnectServer                WTSConnectServerA
    #define WTSCreateListener               WTSCreateListenerA
    #define WTSEnumerateListeners           WTSEnumerateListenersA
    #define WTSEnumerateProcesses           WTSEnumerateProcessesA
    #define WTSEnumerateProcessesEx         WTSEnumerateProcessesExA
    #define WTSEnumerateServers             WTSEnumerateServersA
    #define WTSEnumerateSessions            WTSEnumerateSessionsA
    #define WTSEnumerateSessionsEx          WTSEnumerateSessionsExA
    #define WTSFreeMemoryEx                 WTSFreeMemoryExA
    #define WTSGetListenerSecurity          WTSGetListenerSecurityA
    #define WTSOpenServer                   WTSOpenServerA
    #define WTSOpenServerEx                 WTSOpenServerExA
    #define WTSQueryListenerConfig          WTSQueryListenerConfigA
    #define WTSQuerySessionInformation      WTSQuerySessionInformationA
    #define WTSQueryUserConfig              WTSQueryUserConfigA
    #define WTSSendMessage                  WTSSendMessageA
    #define WTSSetListenerSecurity          WTSSetListenerSecurityA
    #define WTSSetUserConfig                WTSSetUserConfigA
    #define WTSStartRemoteControlSession    WTSStartRemoteControlSessionA
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _INC_WTSAPI */
