/********************************************************************* * * WTSAPI32.H * * Windows Terminal Server public APIs * * Copyright (c) 1997-2001 Microsoft Corporation * **********************************************************************/ #ifndef _INC_WTSAPI #define _INC_WTSAPI #if _MSC_VER > 1000 #pragma once #endif #ifdef __cplusplus extern "C" { #endif /*=================================================================== == Defines =====================================================================*/ /* * Specifies the current server */ #define WTS_CURRENT_SERVER ((HANDLE)NULL) #define WTS_CURRENT_SERVER_HANDLE ((HANDLE)NULL) #define WTS_CURRENT_SERVER_NAME (NULL) /* * Specifies the current session (SessionId) */ #define WTS_CURRENT_SESSION ((DWORD)-1) /* * Specifies any-session (SessionId) */ #define WTS_ANY_SESSION ((DWORD)-2) /* * Possible pResponse values from WTSSendMessage() */ #ifndef IDTIMEOUT #define IDTIMEOUT 32000 #endif #ifndef IDASYNC #define IDASYNC 32001 #endif #ifndef __HYDRIX_H__ #define USERNAME_LENGTH 20 #define CLIENTNAME_LENGTH 20 #define CLIENTADDRESS_LENGTH 30 #endif /* * Shutdown flags */ #define WTS_WSD_LOGOFF 0x00000001 // log off all users except // current user; deletes // WinStations (a reboot is // required to recreate the // WinStations) #define WTS_WSD_SHUTDOWN 0x00000002 // shutdown system #define WTS_WSD_REBOOT 0x00000004 // shutdown and reboot #define WTS_WSD_POWEROFF 0x00000008 // shutdown and power off (on // machines that support power // off through software) #define WTS_WSD_FASTREBOOT 0x00000010 // reboot without logging users // off or shutting down #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 /* * Flags for WTSCreateListener */ #define WTS_LISTENER_CREATE 0x00000001 #define WTS_LISTENER_UPDATE 0x00000010 /********************************* * Listener access values *********************************/ #define WTS_SECURITY_QUERY_INFORMATION 0x00000001 #define WTS_SECURITY_SET_INFORMATION 0x00000002 #define WTS_SECURITY_RESET 0x00000004 #define WTS_SECURITY_VIRTUAL_CHANNELS 0x00000008 #define WTS_SECURITY_REMOTE_CONTROL 0x00000010 #define WTS_SECURITY_LOGON 0x00000020 #define WTS_SECURITY_LOGOFF 0x00000040 #define WTS_SECURITY_MESSAGE 0x00000080 #define WTS_SECURITY_CONNECT 0x00000100 #define WTS_SECURITY_DISCONNECT 0x00000200 #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_CONNECTSTATE_CLASS - Session connect state =====================================================================*/ typedef enum _WTS_CONNECTSTATE_CLASS { WTSActive, // User logged on to WinStation WTSConnected, // WinStation connected to client WTSConnectQuery, // In the process of connecting to client WTSShadow, // Shadowing another WinStation WTSDisconnected, // WinStation logged on without client WTSIdle, // Waiting for client to connect WTSListen, // WinStation is listening for connection WTSReset, // WinStation is being reset WTSDown, // WinStation is down due to error WTSInit, // WinStation in initialization } WTS_CONNECTSTATE_CLASS; /*===================================================================== == WTS_SERVER_INFO - returned by WTSEnumerateServers (version 1) =====================================================================*/ /* * WTSEnumerateServers() returns two variables: pServerInfo and Count. * The latter is the number of WTS_SERVER_INFO structures contained in * the former. In order to read each server, iterate i from 0 to * Count-1 and reference the server name as * pServerInfo[i].pServerName; for example: * * for ( i=0; i < Count; i++ ) { * _tprintf( TEXT("%s "), pServerInfo[i].pServerName ); * } * * The memory returned looks like the following. P is a pServerInfo * pointer, and D is the string data for that pServerInfo: * * P1 P2 P3 P4 ... Pn D1 D2 D3 D4 ... Dn * * This makes it easier to iterate the servers, using code similar to * the above. */ typedef struct _WTS_SERVER_INFOW { LPWSTR pServerName; // server name } WTS_SERVER_INFOW, * PWTS_SERVER_INFOW; typedef struct _WTS_SERVER_INFOA { LPSTR pServerName; // server name } WTS_SERVER_INFOA, * PWTS_SERVER_INFOA; #ifdef UNICODE #define WTS_SERVER_INFO WTS_SERVER_INFOW #define PWTS_SERVER_INFO PWTS_SERVER_INFOW #else #define WTS_SERVER_INFO WTS_SERVER_INFOA #define PWTS_SERVER_INFO PWTS_SERVER_INFOA #endif /*===================================================================== == WTS_SESSION_INFO - returned by WTSEnumerateSessions (version 1) =====================================================================*/ /* * WTSEnumerateSessions() returns data in a similar format to the above * WTSEnumerateServers(). It returns two variables: pSessionInfo and * Count. The latter is the number of WTS_SESSION_INFO structures * contained in the former. Iteration is similar, except that there * are three parts to each entry, so it would look like this: * * for ( i=0; i < Count; i++ ) { * _tprintf( TEXT("%-5u %-20s %u\n"), pSessionInfo[i].SessionId, * pSessionInfo[i].pWinStationName, * pSessionInfo[i].State ); * } * * The memory returned is also segmented as the above, with all the * structures allocated at the start and the string data at the end. * We'll use S for the SessionId, P for the pWinStationName pointer * and D for the string data, and C for the connect State: * * S1 P1 C1 S2 P2 C2 S3 P3 C3 S4 P4 C4 ... Sn Pn Cn D1 D2 D3 D4 ... Dn * * As above, this makes it easier to iterate the sessions. */ typedef struct _WTS_SESSION_INFOW { DWORD SessionId; // session id LPWSTR pWinStationName; // name of WinStation this session is // connected to WTS_CONNECTSTATE_CLASS State; // connection state (see enum) } WTS_SESSION_INFOW, * PWTS_SESSION_INFOW; typedef struct _WTS_SESSION_INFOA { DWORD SessionId; // session id LPSTR pWinStationName; // name of WinStation this session is // connected to WTS_CONNECTSTATE_CLASS State; // connection state (see enum) } WTS_SESSION_INFOA, * PWTS_SESSION_INFOA; 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, * PWTS_SESSION_INFO_1W; 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, * PWTS_SESSION_INFO_1A; #ifdef UNICODE #define WTS_SESSION_INFO WTS_SESSION_INFOW #define PWTS_SESSION_INFO PWTS_SESSION_INFOW #define WTS_SESSION_INFO_1 WTS_SESSION_INFO_1W #define PWTS_SESSION_INFO_1 PWTS_SESSION_INFO_1W #else #define WTS_SESSION_INFO WTS_SESSION_INFOA #define PWTS_SESSION_INFO PWTS_SESSION_INFOA #define WTS_SESSION_INFO_1 WTS_SESSION_INFO_1A #define PWTS_SESSION_INFO_1 PWTS_SESSION_INFO_1A #endif /*===================================================================== == WTS_PROCESS_INFO - returned by WTSEnumerateProcesses (version 1) =====================================================================*/ /* * WTSEnumerateProcesses() also returns data similar to * WTSEnumerateServers(). It returns two variables: pProcessInfo and * Count. The latter is the number of WTS_PROCESS_INFO structures * contained in the former. Iteration is similar, except that there * are four parts to each entry, so it would look like this: * * for ( i=0; i < Count; i++ ) { * GetUserNameFromSid( pProcessInfo[i].pUserSid, UserName, * sizeof(UserName) ); * _tprintf( TEXT("%-5u %-20s %-5u %s\n"), * pProcessInfo[i].SessionId, * UserName, * pProcessInfo[i].ProcessId, * pProcessInfo[i].pProcessName ); * } * * The memory returned is also segmented as the above, with all the * structures allocated at the start and the string data at the end. * We'll use S for the SessionId, R for the ProcessId, P for the * pProcessName pointer and D for the string data, and U for pUserSid: * * S1 R1 P1 U1 S2 R2 P2 U2 S3 R3 P3 U3 ... Sn Rn Pn Un D1 D2 D3 ... Dn * * As above, this makes it easier to iterate the processes. */ typedef struct _WTS_PROCESS_INFOW { DWORD SessionId; // session id DWORD ProcessId; // process id LPWSTR pProcessName; // name of process PSID pUserSid; // user's SID } WTS_PROCESS_INFOW, * PWTS_PROCESS_INFOW; typedef struct _WTS_PROCESS_INFOA { DWORD SessionId; // session id DWORD ProcessId; // process id LPSTR pProcessName; // name of process PSID pUserSid; // user's SID } WTS_PROCESS_INFOA, * PWTS_PROCESS_INFOA; #ifdef UNICODE #define WTS_PROCESS_INFO WTS_PROCESS_INFOW #define PWTS_PROCESS_INFO PWTS_PROCESS_INFOW #else #define WTS_PROCESS_INFO WTS_PROCESS_INFOA #define PWTS_PROCESS_INFO PWTS_PROCESS_INFOA #endif /*===================================================================== == WTS_INFO_CLASS - WTSQuerySessionInformation == (See additional typedefs for more info on structures) =====================================================================*/ #define WTS_PROTOCOL_TYPE_CONSOLE 0 // Console #define WTS_PROTOCOL_TYPE_ICA 1 // ICA Protocol #define WTS_PROTOCOL_TYPE_RDP 2 // RDP Protocol typedef enum _WTS_INFO_CLASS { WTSInitialProgram, WTSApplicationName, WTSWorkingDirectory, WTSOEMId, WTSSessionId, WTSUserName, WTSWinStationName, WTSDomainName, WTSConnectState, WTSClientBuildNumber, WTSClientName, WTSClientDirectory, WTSClientProductId, WTSClientHardwareId, WTSClientAddress, WTSClientDisplay, WTSClientProtocolType, WTSIdleTime, WTSLogonTime, WTSIncomingBytes, WTSOutgoingBytes, WTSIncomingFrames, WTSOutgoingFrames, WTSClientInfo, WTSSessionInfo, WTSSessionInfoEx, WTSConfigInfo, WTSValidationInfo, // Info Class value used to fetch Validation Information through the WTSQuerySessionInformation WTSSessionAddressV4, WTSIsRemoteSession } WTS_INFO_CLASS; /*===================================================================== == WTS Config Information =====================================================================*/ 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, *PWTSCONFIGINFOW; 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, *PWTSCONFIGINFOA; /*===================================================================== == WTS Session Information =====================================================================*/ typedef struct _WTSINFOW { WTS_CONNECTSTATE_CLASS State; // connection state (see enum) DWORD SessionId; // session id 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];// name of WinStation this session is // connected to LARGE_INTEGER ConnectTime; LARGE_INTEGER DisconnectTime; LARGE_INTEGER LastInputTime; LARGE_INTEGER LogonTime; LARGE_INTEGER CurrentTime; } WTSINFOW, * PWTSINFOW; typedef struct _WTSINFOA { WTS_CONNECTSTATE_CLASS State; // connection state (see enum) DWORD SessionId; // session id DWORD IncomingBytes; DWORD OutgoingBytes; DWORD IncomingFrames; DWORD OutgoingFrames; DWORD IncomingCompressedBytes; DWORD OutgoingCompressedBy; CHAR WinStationName[WINSTATIONNAME_LENGTH]; CHAR Domain[DOMAIN_LENGTH]; CHAR UserName[USERNAME_LENGTH+1];// name of WinStation this session is // connected to LARGE_INTEGER ConnectTime; LARGE_INTEGER DisconnectTime; LARGE_INTEGER LastInputTime; LARGE_INTEGER LogonTime; LARGE_INTEGER CurrentTime; } WTSINFOA, * PWTSINFOA; /*===================================================================== == WTS Extended Session State Flags =====================================================================*/ #define WTS_SESSIONSTATE_UNKNOWN 0xFFFFFFFF #define WTS_SESSIONSTATE_LOCK 0x00000000 #define WTS_SESSIONSTATE_UNLOCK 0x00000001 /*===================================================================== == WTS Extended Session Information =====================================================================*/ 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, *PWTSINFOEX_LEVEL1_W; 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, *PWTSINFOEX_LEVEL1_A; typedef union _WTSINFOEX_LEVEL_W { WTSINFOEX_LEVEL1_W WTSInfoExLevel1; } WTSINFOEX_LEVEL_W, *PWTSINFOEX_LEVEL_W; typedef union _WTSINFOEX_LEVEL_A { WTSINFOEX_LEVEL1_A WTSInfoExLevel1; } WTSINFOEX_LEVEL_A, *PWTSINFOEX_LEVEL_A; typedef struct _WTSINFOEXW { DWORD Level; WTSINFOEX_LEVEL_W Data; } WTSINFOEXW, *PWTSINFOEXW; typedef struct _WTSINFOEXA { DWORD Level; WTSINFOEX_LEVEL_A Data; } WTSINFOEXA, *PWTSINFOEXA; /*===================================================================== == WTS Client Information =====================================================================*/ 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; // security level of encryption pd ULONG ClientAddressFamily; USHORT ClientAddress[ CLIENTADDRESS_LENGTH + 1 ]; USHORT HRes; USHORT VRes; USHORT ColorDepth; WCHAR ClientDirectory[ MAX_PATH + 1 ]; ULONG ClientBuildNumber; ULONG ClientHardwareId; // client software serial number USHORT ClientProductId; // client software product id USHORT OutBufCountHost; // number of outbufs on host USHORT OutBufCountClient; // number of outbufs on client USHORT OutBufLength; // length of outbufs in bytes WCHAR DeviceId[ MAX_PATH + 1]; } WTSCLIENTW, * PWTSCLIENTW; /*===================================================================== == 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; // security level of encryption pd ULONG ClientAddressFamily; USHORT ClientAddress[ CLIENTADDRESS_LENGTH + 1 ]; USHORT HRes; USHORT VRes; USHORT ColorDepth; CHAR ClientDirectory[ MAX_PATH + 1 ]; ULONG ClientBuildNumber; ULONG ClientHardwareId; // client software serial number USHORT ClientProductId; // client software product id USHORT OutBufCountHost; // number of outbufs on host USHORT OutBufCountClient; // number of outbufs on client USHORT OutBufLength; // length of outbufs in bytes CHAR DeviceId[ MAX_PATH + 1]; } WTSCLIENTA, * PWTSCLIENTA; /*===================================================================== == WTS License Validation Information - Product Information =====================================================================*/ #define PRODUCTINFO_COMPANYNAME_LENGTH 256 #define PRODUCTINFO_PRODUCTID_LENGTH 4 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; /*===================================================================== WTS License Validation Information This structure will be returned from WTSQuerySessionInformation when the user queries for license validation information. =====================================================================*/ #define VALIDATIONINFORMATION_LICENSE_LENGTH 16384 //16 Kb #define VALIDATIONINFORMATION_HARDWAREID_LENGTH 20 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, * 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, * PWTS_VALIDATION_INFORMATIONW; #ifdef UNICODE #define WTSCONFIGINFO WTSCONFIGINFOW #define PWTSCONFIGINFO PWTSCONFIGINFOW #define PRODUCT_INFO PRODUCT_INFOW #define WTS_VALIDATION_INFORMATION WTS_VALIDATION_INFORMATIONW #define PWTS_VALIDATION_INFORMATION PWTS_VALIDATION_INFORMATIONW #define WTSINFO WTSINFOW #define PWTSINFO PWTSINFOW #define WTSINFOEX WTSINFOEXW #define PWTSINFOEX PWTSINFOEXW #define WTSINFOEX_LEVEL WTSINFOEX_LEVEL_W #define PWTSINFOEX_LEVEL PWTSINFOEX_LEVEL_W #define WTSINFOEX_LEVEL1 WTSINFOEX_LEVEL1_W #define PWTSINFOEX_LEVEL1 PWTSINFOEX_LEVEL1_W #define WTSCLIENT WTSCLIENTW #define PWTSCLIENT PWTSCLIENTW #else #define WTSCONFIGINFO WTSCONFIGINFOA #define PWTSCONFIGINFO PWTSCONFIGINFOA #define PRODUCT_INFO PRODUCT_INFOA #define WTS_VALIDATION_INFORMATION WTS_VALIDATION_INFORMATIONA #define PWTS_VALIDATION_INFORMATION PWTS_VALIDATION_INFORMATIONA #define WTSINFO WTSINFOA #define PWTSINFO PWTSINFOA #define WTSINFOEX WTSINFOEXA #define PWTSINFOEX PWTSINFOEXA #define WTSINFOEX_LEVEL WTSINFOEX_LEVEL_A #define PWTSINFOEX_LEVEL PWTSINFOEX_LEVEL_A #define WTSINFOEX_LEVEL1 WTSINFOEX_LEVEL1_A #define PWTSINFOEX_LEVEL1 PWTSINFOEX_LEVEL1_A #define WTSCLIENT WTSCLIENTA #define PWTSCLIENT PWTSCLIENTA #endif /*===================================================================== == WTSQuerySessionInformation - (WTSClientAddress) =====================================================================*/ typedef struct _WTS_CLIENT_ADDRESS { DWORD AddressFamily; // AF_INET, AF_INET6, AF_IPX, AF_NETBIOS, AF_UNSPEC BYTE Address[20]; // client network address } WTS_CLIENT_ADDRESS, * PWTS_CLIENT_ADDRESS; /*===================================================================== == WTSQuerySessionInformation - (WTSClientDisplay) =====================================================================*/ typedef struct _WTS_CLIENT_DISPLAY { DWORD HorizontalResolution; // horizontal dimensions, in pixels DWORD VerticalResolution; // vertical dimensions, in pixels DWORD ColorDepth; // 1=16, 2=256, 4=64K, 8=16M } WTS_CLIENT_DISPLAY, * PWTS_CLIENT_DISPLAY; /*===================================================================== == WTS_CONFIG_CLASS - WTSQueryUserConfig/WTSSetUserConfig =====================================================================*/ typedef enum _WTS_CONFIG_CLASS { //Initial program settings WTSUserConfigInitialProgram, // string returned/expected WTSUserConfigWorkingDirectory, // string returned/expected WTSUserConfigfInheritInitialProgram, // DWORD returned/expected // WTSUserConfigfAllowLogonTerminalServer, //DWORD returned/expected //Timeout settings WTSUserConfigTimeoutSettingsConnections, //DWORD returned/expected WTSUserConfigTimeoutSettingsDisconnections, //DWORD returned/expected WTSUserConfigTimeoutSettingsIdle, //DWORD returned/expected //Client device settings WTSUserConfigfDeviceClientDrives, //DWORD returned/expected WTSUserConfigfDeviceClientPrinters, //DWORD returned/expected WTSUserConfigfDeviceClientDefaultPrinter, //DWORD returned/expected //Connection settings WTSUserConfigBrokenTimeoutSettings, //DWORD returned/expected WTSUserConfigReconnectSettings, //DWORD returned/expected //Modem settings WTSUserConfigModemCallbackSettings, //DWORD returned/expected WTSUserConfigModemCallbackPhoneNumber, // string returned/expected //Shadow settings WTSUserConfigShadowingSettings, //DWORD returned/expected //User Profile settings WTSUserConfigTerminalServerProfilePath, // string returned/expected //Terminal Server home directory WTSUserConfigTerminalServerHomeDir, // string returned/expected WTSUserConfigTerminalServerHomeDirDrive, // string returned/expected WTSUserConfigfTerminalServerRemoteHomeDir, // DWORD 0:LOCAL 1:REMOTE WTSUserConfigUser, // returns WTSUSERCONFIG struct } WTS_CONFIG_CLASS; typedef enum _WTS_CONFIG_SOURCE { WTSUserConfigSourceSAM } WTS_CONFIG_SOURCE; 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, * 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, * PWTSUSERCONFIGW; #ifdef UNICODE #define WTSUSERCONFIG WTSUSERCONFIGW #define PWTSUSERCONFIG PWTSUSERCONFIGW #else #define WTSUSERCONFIG WTSUSERCONFIGA #define PWTSUSERCONFIG PWTSUSERCONFIGA #endif /* UNICODE */ /*===================================================================== == WTS_EVENT - Event flags for WTSWaitSystemEvent =====================================================================*/ #define WTS_EVENT_NONE 0x00000000 // return no event #define WTS_EVENT_CREATE 0x00000001 // new WinStation created #define WTS_EVENT_DELETE 0x00000002 // existing WinStation deleted #define WTS_EVENT_RENAME 0x00000004 // existing WinStation renamed #define WTS_EVENT_CONNECT 0x00000008 // WinStation connect to client #define WTS_EVENT_DISCONNECT 0x00000010 // WinStation logged on without // client #define WTS_EVENT_LOGON 0x00000020 // user logged on to existing // WinStation #define WTS_EVENT_LOGOFF 0x00000040 // user logged off from // existing WinStation #define WTS_EVENT_STATECHANGE 0x00000080 // WinStation state change #define WTS_EVENT_LICENSE 0x00000100 // license state change #define WTS_EVENT_ALL 0x7fffffff // wait for all event types #define WTS_EVENT_FLUSH 0x80000000 // unblock all waiters /*===================================================================== == Flags for HotkeyModifiers in WTSStartRemoteControlSession =====================================================================*/ #define REMOTECONTROL_KBDSHIFT_HOTKEY 0x1 // Shift key #define REMOTECONTROL_KBDCTRL_HOTKEY 0x2 // Ctrl key #define REMOTECONTROL_KBDALT_HOTKEY 0x4 // Alt key /*===================================================================== == WTS_VIRTUAL_CLASS - WTSVirtualChannelQuery =====================================================================*/ typedef enum _WTS_VIRTUAL_CLASS { WTSVirtualClientData, // Virtual channel client module data // (C2H data) WTSVirtualFileHandle } WTS_VIRTUAL_CLASS; /*===================================================================== == WTSQuerySessionInformation - (WTSSessionAddress) =====================================================================*/ typedef struct _WTS_SESSION_ADDRESS { DWORD AddressFamily; // AF_INET only. BYTE Address[20]; // client network address } WTS_SESSION_ADDRESS, * PWTS_SESSION_ADDRESS; /*===================================================================== == Windows Terminal Server public APIs =====================================================================*/ BOOL WINAPI WTSStopRemoteControlSession( IN ULONG LogonId ); BOOL WINAPI WTSStartRemoteControlSessionW( __in LPWSTR pTargetServerName, IN ULONG TargetLogonId, IN BYTE HotkeyVk, IN USHORT HotkeyModifiers ); BOOL WINAPI WTSStartRemoteControlSessionA( __in LPSTR pTargetServerName, IN ULONG TargetLogonId, IN BYTE HotkeyVk, IN USHORT HotkeyModifiers ); #ifdef UNICODE #define WTSStartRemoteControlSession WTSStartRemoteControlSessionW #else #define WTSStartRemoteControlSession WTSStartRemoteControlSessionA #endif /* UNICODE */ BOOL WINAPI WTSConnectSessionA( IN ULONG LogonId, IN ULONG TargetLogonId, __in PSTR pPassword, IN BOOL bWait ); BOOL WINAPI WTSConnectSessionW( IN ULONG LogonId, IN ULONG TargetLogonId, __in PWSTR pPassword, IN BOOL bWait ); #ifdef UNICODE #define WTSConnectSession WTSConnectSessionW #else #define WTSConnectSession WTSConnectSessionA #endif BOOL WINAPI WTSEnumerateServersW( __in LPWSTR pDomainName, IN DWORD Reserved, IN DWORD Version, __deref_out_ecount(*pCount) PWTS_SERVER_INFOW * ppServerInfo, __out DWORD * pCount ); BOOL WINAPI WTSEnumerateServersA( __in LPSTR pDomainName, IN DWORD Reserved, IN DWORD Version, __deref_out_ecount(*pCount) PWTS_SERVER_INFOA * ppServerInfo, __out DWORD * pCount ); #ifdef UNICODE #define WTSEnumerateServers WTSEnumerateServersW #else #define WTSEnumerateServers WTSEnumerateServersA #endif /*------------------------------------------------*/ HANDLE WINAPI WTSOpenServerW( __in LPWSTR pServerName ); HANDLE WINAPI WTSOpenServerA( __in LPSTR pServerName ); HANDLE WINAPI WTSOpenServerExW( __in LPWSTR pServerName ); HANDLE WINAPI WTSOpenServerExA( __in LPSTR pServerName ); #ifdef UNICODE #define WTSOpenServer WTSOpenServerW #define WTSOpenServerEx WTSOpenServerExW #else #define WTSOpenServer WTSOpenServerA #define WTSOpenServerEx WTSOpenServerExA #endif /*------------------------------------------------*/ VOID WINAPI WTSCloseServer( IN HANDLE hServer ); /*------------------------------------------------*/ BOOL WINAPI WTSEnumerateSessionsW( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, __deref_out_ecount(*pCount) PWTS_SESSION_INFOW * ppSessionInfo, __out DWORD * pCount ); BOOL WINAPI WTSEnumerateSessionsA( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, __deref_out_ecount(*pCount) PWTS_SESSION_INFOA * ppSessionInfo, __out DWORD * pCount ); BOOL WINAPI WTSEnumerateSessionsExW( __in HANDLE hServer, __inout DWORD *pLevel, __in DWORD Filter, __deref_out_ecount(*pCount) PWTS_SESSION_INFO_1W * ppSessionInfo, __out DWORD * pCount ); BOOL WINAPI WTSEnumerateSessionsExA( __in HANDLE hServer, __inout DWORD *pLevel, __in DWORD Filter, __deref_out_ecount(*pCount) PWTS_SESSION_INFO_1A * ppSessionInfo, __out DWORD * pCount ); #ifdef UNICODE #define WTSEnumerateSessions WTSEnumerateSessionsW #define WTSEnumerateSessionsEx WTSEnumerateSessionsExW #else #define WTSEnumerateSessions WTSEnumerateSessionsA #define WTSEnumerateSessionsEx WTSEnumerateSessionsExA #endif /*------------------------------------------------*/ BOOL WINAPI WTSEnumerateProcessesW( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, OUT PWTS_PROCESS_INFOW * ppProcessInfo, OUT DWORD * pCount ); BOOL WINAPI WTSEnumerateProcessesA( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, OUT PWTS_PROCESS_INFOA * ppProcessInfo, OUT DWORD * pCount ); #ifdef UNICODE #define WTSEnumerateProcesses WTSEnumerateProcessesW #else #define WTSEnumerateProcesses WTSEnumerateProcessesA #endif /*------------------------------------------------*/ BOOL WINAPI WTSTerminateProcess( IN HANDLE hServer, IN DWORD ProcessId, IN DWORD ExitCode ); /*------------------------------------------------*/ BOOL WINAPI WTSQuerySessionInformationW( IN HANDLE hServer, IN DWORD SessionId, IN WTS_INFO_CLASS WTSInfoClass, __deref_out_bcount(*pBytesReturned) LPWSTR * ppBuffer, __out DWORD * pBytesReturned ); BOOL WINAPI WTSQuerySessionInformationA( IN HANDLE hServer, IN DWORD SessionId, IN WTS_INFO_CLASS WTSInfoClass, __deref_out_bcount(*pBytesReturned) LPSTR * ppBuffer, __out DWORD * pBytesReturned ); #ifdef UNICODE #define WTSQuerySessionInformation WTSQuerySessionInformationW #else #define WTSQuerySessionInformation WTSQuerySessionInformationA #endif /*------------------------------------------------*/ BOOL WINAPI WTSQueryUserConfigW( __in LPWSTR pServerName, __in LPWSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, __deref_out_bcount(*pBytesReturned) LPWSTR * ppBuffer, __out DWORD * pBytesReturned ); BOOL WINAPI WTSQueryUserConfigA( __in LPSTR pServerName, __in LPSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, __deref_out_bcount(*pBytesReturned) LPSTR * ppBuffer, __out DWORD * pBytesReturned ); #ifdef UNICODE #define WTSQueryUserConfig WTSQueryUserConfigW #else #define WTSQueryUserConfig WTSQueryUserConfigA #endif /*------------------------------------------------*/ BOOL WINAPI WTSSetUserConfigW( __in LPWSTR pServerName, __in LPWSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, __in_bcount(DataLength) LPWSTR pBuffer, IN DWORD DataLength ); BOOL WINAPI WTSSetUserConfigA( __in LPSTR pServerName, __in LPSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, __in_bcount(DataLength) LPSTR pBuffer, IN DWORD DataLength ); #ifdef UNICODE #define WTSSetUserConfig WTSSetUserConfigW #else #define WTSSetUserConfig WTSSetUserConfigA #endif /*------------------------------------------------*/ BOOL WINAPI WTSSendMessageW( IN HANDLE hServer, IN DWORD SessionId, __in_bcount(TitleLength) LPWSTR pTitle, IN DWORD TitleLength, __in_bcount(MessageLength) LPWSTR pMessage, IN DWORD MessageLength, IN DWORD Style, IN DWORD Timeout, __out DWORD * pResponse, IN BOOL bWait ); BOOL WINAPI WTSSendMessageA( IN HANDLE hServer, IN DWORD SessionId, __in_bcount(TitleLength) LPSTR pTitle, IN DWORD TitleLength, __in_bcount(MessageLength) LPSTR pMessage, IN DWORD MessageLength, IN DWORD Style, IN DWORD Timeout, __out DWORD * pResponse, IN BOOL bWait ); #ifdef UNICODE #define WTSSendMessage WTSSendMessageW #else #define WTSSendMessage WTSSendMessageA #endif /*------------------------------------------------*/ BOOL WINAPI WTSDisconnectSession( IN HANDLE hServer, IN DWORD SessionId, IN BOOL bWait ); /*------------------------------------------------*/ BOOL WINAPI WTSLogoffSession( IN HANDLE hServer, IN DWORD SessionId, IN BOOL bWait ); /*------------------------------------------------*/ BOOL WINAPI WTSShutdownSystem( IN HANDLE hServer, IN DWORD ShutdownFlag ); /*------------------------------------------------*/ BOOL WINAPI WTSWaitSystemEvent( IN HANDLE hServer, IN DWORD EventMask, OUT DWORD * pEventFlags ); /*------------------------------------------------*/ HANDLE WINAPI WTSVirtualChannelOpen( IN HANDLE hServer, IN DWORD SessionId, __in LPSTR pVirtualName /* ascii name */ ); #define WTS_CHANNEL_OPTION_DYNAMIC 0x00000001 // dynamic channel #define WTS_CHANNEL_OPTION_DYNAMIC_PRI_LOW 0x00000000 // priorities #define WTS_CHANNEL_OPTION_DYNAMIC_PRI_MED 0x00000002 #define WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH 0x00000004 #define WTS_CHANNEL_OPTION_DYNAMIC_PRI_REAL 0x00000006 #define WTS_CHANNEL_OPTION_DYNAMIC_NO_COMPRESS 0x00000008 HANDLE WINAPI WTSVirtualChannelOpenEx( IN DWORD SessionId, __in LPSTR pVirtualName, /* ascii name */ IN DWORD flags ); BOOL WINAPI WTSVirtualChannelClose( IN HANDLE hChannelHandle ); BOOL WINAPI WTSVirtualChannelRead( IN HANDLE hChannelHandle, IN ULONG TimeOut, __out_bcount_part(BufferSize, *pBytesRead) PCHAR Buffer, IN ULONG BufferSize, __out PULONG pBytesRead ); BOOL WINAPI WTSVirtualChannelWrite( IN HANDLE hChannelHandle, __in_bcount(Length) PCHAR Buffer, IN ULONG Length, __out PULONG pBytesWritten ); BOOL WINAPI WTSVirtualChannelPurgeInput( IN HANDLE hChannelHandle ); BOOL WINAPI WTSVirtualChannelPurgeOutput( IN HANDLE hChannelHandle ); BOOL WINAPI WTSVirtualChannelQuery( IN HANDLE hChannelHandle, IN WTS_VIRTUAL_CLASS, OUT PVOID *ppBuffer, OUT DWORD *pBytesReturned ); /*------------------------------------------------*/ VOID WINAPI WTSFreeMemory( IN PVOID pMemory ); /* Flags for Console Notification */ #define NOTIFY_FOR_ALL_SESSIONS 1 #define NOTIFY_FOR_THIS_SESSION 0 BOOL WINAPI WTSRegisterSessionNotification( HWND hWnd, DWORD dwFlags ); BOOL WINAPI WTSUnRegisterSessionNotification( HWND hWnd ); BOOL WINAPI WTSRegisterSessionNotificationEx( IN HANDLE hServer, IN HWND hWnd, IN DWORD dwFlags ); BOOL WINAPI WTSUnRegisterSessionNotificationEx( IN HANDLE hServer, IN HWND hWnd ); BOOL WINAPI WTSQueryUserToken( ULONG SessionId, PHANDLE phToken ); #define WTS_PROCESS_INFO_LEVEL_0 0 #define WTS_PROCESS_INFO_LEVEL_1 1 /* == WTS_PROCESS_INFO_EX - returned by WTSEnumerateProcessesEX */ 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, * PWTS_PROCESS_INFO_EXW; 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, * PWTS_PROCESS_INFO_EXA; #ifdef UNICODE #define WTS_PROCESS_INFO_EX WTS_PROCESS_INFO_EXW #define PWTS_PROCESS_INFO_EX PWTS_PROCESS_INFO_EXW #else #define WTS_PROCESS_INFO_EX WTS_PROCESS_INFO_EXA #define PWTS_PROCESS_INFO_EX PWTS_PROCESS_INFO_EXA #endif /*------------------------------------------------*/ typedef enum _WTS_TYPE_CLASS { WTSTypeProcessInfoLevel0, WTSTypeProcessInfoLevel1, WTSTypeSessionInfoLevel1, } WTS_TYPE_CLASS; BOOL WINAPI WTSFreeMemoryExW( __in WTS_TYPE_CLASS WTSTypeClass, __in PVOID pMemory, __in ULONG NumberOfEntries ); BOOL WINAPI WTSFreeMemoryExA( __in WTS_TYPE_CLASS WTSTypeClass, __in PVOID pMemory, __in ULONG NumberOfEntries ); #ifdef UNICODE #define WTSFreeMemoryEx WTSFreeMemoryExW #else #define WTSFreeMemoryEx WTSFreeMemoryExA #endif /*------------------------------------------------*/ BOOL WINAPI WTSEnumerateProcessesExW ( __in HANDLE hServer, __inout DWORD *pLevel, __in DWORD SessionId, __out LPWSTR *ppProcessInfo, __out DWORD * pCount ); BOOL WINAPI WTSEnumerateProcessesExA ( __in HANDLE hServer, __inout DWORD *pLevel, __in DWORD SessionId, __out LPSTR *ppProcessInfo, __out DWORD * pCount ); #ifdef UNICODE #define WTSEnumerateProcessesEx WTSEnumerateProcessesExW #else #define WTSEnumerateProcessesEx WTSEnumerateProcessesExA #endif /*------------------------------------------------*/ // Listener management APIs typedef WCHAR WTSLISTENERNAMEW[WTS_LISTENER_NAME_LENGTH + 1 ]; typedef WTSLISTENERNAMEW *PWTSLISTENERNAMEW; typedef CHAR WTSLISTENERNAMEA[WTS_LISTENER_NAME_LENGTH + 1 ]; typedef WTSLISTENERNAMEA *PWTSLISTENERNAMEA; #ifdef UNICODE #define WTSLISTENERNAME WTSLISTENERNAMEW #define PWTSLISTENERNAME PWTSLISTENERNAMEW #else #define WTSLISTENERNAME WTSLISTENERNAMEA #define PWTSLISTENERNAME PWTSLISTENERNAMEW #endif BOOL WINAPI WTSEnumerateListenersW ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __out_ecount_opt(*pCount) PWTSLISTENERNAMEW pListeners, __inout DWORD* pCount ); BOOL WINAPI WTSEnumerateListenersA ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __out_ecount_opt(*pCount) PWTSLISTENERNAMEA pListeners, __inout DWORD* pCount ); #ifdef UNICODE #define WTSEnumerateListeners WTSEnumerateListenersW #else #define WTSEnumerateListeners WTSEnumerateListenersA #endif /*------------------------------------------------*/ // Listener Config, used by WTSQueryListenerConfig and WTSCreateListener 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, *PWTSLISTENERCONFIGW; 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, *PWTSLISTENERCONFIGA; BOOL WINAPI WTSQueryListenerConfigW ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPWSTR pListenerName, __out PWTSLISTENERCONFIGW pBuffer ); BOOL WINAPI WTSQueryListenerConfigA ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPSTR pListenerName, __out PWTSLISTENERCONFIGA pBuffer ); BOOL WINAPI WTSCreateListenerW ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPWSTR pListenerName, __in PWTSLISTENERCONFIGW pBuffer, __in DWORD flag ); BOOL WINAPI WTSCreateListenerA ( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPSTR pListenerName, __in PWTSLISTENERCONFIGA pBuffer, __in DWORD flag ); BOOL WINAPI WTSSetListenerSecurityW( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPWSTR pListenerName, __in SECURITY_INFORMATION SecurityInformation, __in PSECURITY_DESCRIPTOR pSecurityDescriptor); BOOL WINAPI WTSSetListenerSecurityA( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPSTR pListenerName, __in SECURITY_INFORMATION SecurityInformation, __in PSECURITY_DESCRIPTOR pSecurityDescriptor); BOOL WINAPI WTSGetListenerSecurityW( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPWSTR pListenerName, __in SECURITY_INFORMATION SecurityInformation, __out_opt PSECURITY_DESCRIPTOR pSecurityDescriptor, __in DWORD nLength, __out LPDWORD lpnLengthNeeded); BOOL WINAPI WTSGetListenerSecurityA( __in HANDLE hServer, __in PVOID pReserved, __in DWORD Reserved, __in LPSTR pListenerName, __in SECURITY_INFORMATION SecurityInformation, __out_opt PSECURITY_DESCRIPTOR pSecurityDescriptor, __in DWORD nLength, __out LPDWORD lpnLengthNeeded); #ifdef UNICODE #define WTSLISTENERCONFIG WTSLISTENERCONFIGW #define PWTSLISTENERCONFIG PWTSLISTENERCONFIGW #define WTSQueryListenerConfig WTSQueryListenerConfigW #define WTSCreateListener WTSCreateListenerW #define WTSSetListenerSecurity WTSSetListenerSecurityW #define WTSGetListenerSecurity WTSGetListenerSecurityW #else #define WTSLISTENERCONFIG WTSLISTENERCONFIGA #define PWTSLISTENERCONFIG PWTSLISTENERCONFIGA #define WTSQueryListenerConfig WTSQueryListenerConfigA #define WTSCreateListener WTSCreateListenerA #define WTSSetListenerSecurity WTSSetListenerSecurityA #define WTSGetListenerSecurity WTSGetListenerSecurityA #endif #ifdef __cplusplus } #endif #endif /* !_INC_WTSAPI */