/********************************************************************* * * WTSAPI32.H * * Windows Terminal Server public APIs * * Copyright 1995-1999, Citrix Systems Inc. * Copyright (c) 1997-1999 Microsoft Corporation * **********************************************************************/ #ifndef _INC_WTSAPI #pragma option push -b -a8 -pc -A- /*P_O_Push*/ #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) /* * Possible pResponse values from WTSSendMessage() */ #ifndef IDTIMEOUT #define IDTIMEOUT 32000 #endif #ifndef IDASYNC #define IDASYNC 32001 #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 /*=================================================================== == 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; #ifdef UNICODE #define WTS_SESSION_INFO WTS_SESSION_INFOW #define PWTS_SESSION_INFO PWTS_SESSION_INFOW #else #define WTS_SESSION_INFO WTS_SESSION_INFOA #define PWTS_SESSION_INFO PWTS_SESSION_INFOA #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, } WTS_INFO_CLASS; /*===================================================================== == WTSQuerySessionInformation - (WTSClientAddress) =====================================================================*/ typedef struct _WTS_CLIENT_ADDRESS { DWORD AddressFamily; // AF_INET, 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 } WTS_CONFIG_CLASS; typedef struct _WTS_USER_CONFIG_SET_NWSERVERW { LPWSTR pNWServerName; LPWSTR pNWDomainAdminName; LPWSTR pNWDomainAdminPassword; } WTS_USER_CONFIG_SET_NWSERVERW, * PWTS_USER_CONFIG_SET_NWSERVERW; typedef struct _WTS_USER_CONFIG_SET_NWSERVERA { LPSTR pNWServerName; LPSTR pNWDomainAdminName; LPSTR pNWDomainAdminPassword; } WTS_USER_CONFIG_SET_NWSERVERA, * PWTS_USER_CONFIG_SET_NWSERVERA; #ifdef UNICODE #define WTS_USER_CONFIG_SET_NWSERVER WTS_USER_CONFIG_SET_NWSERVERW #define PWTS_USER_CONFIG_SET_NWSERVER PWTS_USER_CONFIG_SET_NWSERVERW #else #define WTS_USER_CONFIG_SET_NWSERVER WTS_USER_CONFIG_SET_NWSERVERA #define PWTS_USER_CONFIG_SET_NWSERVER PWTS_USER_CONFIG_SET_NWSERVERA #endif /*===================================================================== == 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 /*===================================================================== == WTS_VIRTUAL_CLASS - WTSVirtualChannelQuery =====================================================================*/ typedef enum _WTS_VIRTUAL_CLASS { WTSVirtualClientData, // Virtual channel client module data // (C2H data) } WTS_VIRTUAL_CLASS; /*===================================================================== == Windows Terminal Server public APIs =====================================================================*/ BOOL WINAPI WTSEnumerateServersW( IN LPWSTR pDomainName, IN DWORD Reserved, IN DWORD Version, OUT PWTS_SERVER_INFOW * ppServerInfo, OUT DWORD * pCount ); BOOL WINAPI WTSEnumerateServersA( IN LPSTR pDomainName, IN DWORD Reserved, IN DWORD Version, OUT 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 ); #ifdef UNICODE #define WTSOpenServer WTSOpenServerW #else #define WTSOpenServer WTSOpenServerA #endif /*------------------------------------------------*/ VOID WINAPI WTSCloseServer( IN HANDLE hServer ); /*------------------------------------------------*/ BOOL WINAPI WTSEnumerateSessionsW( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, OUT PWTS_SESSION_INFOW * ppSessionInfo, OUT DWORD * pCount ); BOOL WINAPI WTSEnumerateSessionsA( IN HANDLE hServer, IN DWORD Reserved, IN DWORD Version, OUT PWTS_SESSION_INFOA * ppSessionInfo, OUT DWORD * pCount ); #ifdef UNICODE #define WTSEnumerateSessions WTSEnumerateSessionsW #else #define WTSEnumerateSessions WTSEnumerateSessionsA #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, OUT LPWSTR * ppBuffer, OUT DWORD * pBytesReturned ); BOOL WINAPI WTSQuerySessionInformationA( IN HANDLE hServer, IN DWORD SessionId, IN WTS_INFO_CLASS WTSInfoClass, OUT 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, OUT LPWSTR * ppBuffer, OUT DWORD * pBytesReturned ); BOOL WINAPI WTSQueryUserConfigA( IN LPSTR pServerName, IN LPSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, OUT 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 LPWSTR pBuffer, IN DWORD DataLength ); BOOL WINAPI WTSSetUserConfigA( IN LPSTR pServerName, IN LPSTR pUserName, IN WTS_CONFIG_CLASS WTSConfigClass, IN 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 LPWSTR pTitle, IN DWORD TitleLength, IN 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 LPSTR pTitle, IN DWORD TitleLength, IN 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 */ ); BOOL WINAPI WTSVirtualChannelClose( IN HANDLE hChannelHandle ); BOOL WINAPI WTSVirtualChannelRead( IN HANDLE hChannelHandle, IN ULONG TimeOut, OUT PCHAR Buffer, IN ULONG BufferSize, OUT PULONG pBytesRead ); BOOL WINAPI WTSVirtualChannelWrite( IN HANDLE hChannelHandle, IN 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 ); #ifdef __cplusplus } #endif #pragma option pop /*P_O_Pop*/ #endif /* !_INC_WTSAPI */