unit EM.WtsApi32;

interface
uses Windows, Messages, SysUtils, Controls;
//   Windows Terminal Server public APIs 
// 
//   Copyright 1995-1999, Citrix Systems Inc. 
//   Copyright (c) 1997-1999  Microsoft Corporation 
 
//============================================================================== 
// Defines 
//============================================================================== 
 
// 
//  Specifies the current server 
// 

const 
  WTS_CURRENT_SERVER        = THandle(0); 
  {$EXTERNALSYM WTS_CURRENT_SERVER} 
  WTS_CURRENT_SERVER_HANDLE = THandle(0); 
  {$EXTERNALSYM WTS_CURRENT_SERVER_HANDLE} 
  WTS_CURRENT_SERVER_NAME   = ''; 
  {$EXTERNALSYM WTS_CURRENT_SERVER_NAME} 
 
// 
//  Specifies the current session (SessionId) 
// 

  WTS_CURRENT_SESSION = DWORD(-1); 
  {$EXTERNALSYM WTS_CURRENT_SESSION} 
 
// 
//  Possible pResponse values from WTSSendMessage()
// 
 
  IDTIMEOUT = 32000; 
  {$EXTERNALSYM IDTIMEOUT} 
  IDASYNC   = 32001; 
  {$EXTERNALSYM IDASYNC} 
 
// 
//  Shutdown flags 
// 
 
  WTS_WSD_LOGOFF = $00000001;           // log off all users except 
  {$EXTERNALSYM WTS_WSD_LOGOFF}         // current user; deletes 
                                        // WinStations (a reboot is 
                                        // required to recreate the 
                                        // WinStations) 
  WTS_WSD_SHUTDOWN = $00000002;         // shutdown system 
  {$EXTERNALSYM WTS_WSD_SHUTDOWN} 
  WTS_WSD_REBOOT   = $00000004;         // shutdown and reboot 
  {$EXTERNALSYM WTS_WSD_REBOOT} 
  WTS_WSD_POWEROFF = $00000008;         // shutdown and power off (on 
  {$EXTERNALSYM WTS_WSD_POWEROFF} 
                                        // machines that support power 
                                        // off through software) 
  WTS_WSD_FASTREBOOT = $00000010;       // reboot without logging users 
  {$EXTERNALSYM WTS_WSD_FASTREBOOT}     // off or shutting down 
 
//============================================================================== 
// WTS_CONNECTSTATE_CLASS - Session connect state 
//============================================================================== 
 
type 
  _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 
  {$EXTERNALSYM _WTS_CONNECTSTATE_CLASS} 
  WTS_CONNECTSTATE_CLASS = _WTS_CONNECTSTATE_CLASS; 
  {$EXTERNALSYM WTS_CONNECTSTATE_CLASS} 
  TWtsConnectStateClass = WTS_CONNECTSTATE_CLASS; 

  HANDLE = THANDLE;
  PVOID = Pointer;

//============================================================================== 
// 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. 
// 
 
type 
  PWTS_SERVER_INFOW = ^WTS_SERVER_INFOW; 
  {$EXTERNALSYM PWTS_SERVER_INFOW} 
  _WTS_SERVER_INFOW = record 
    pServerName: LPWSTR; // server name 
  end; 
  {$EXTERNALSYM _WTS_SERVER_INFOW} 
  WTS_SERVER_INFOW = _WTS_SERVER_INFOW; 
  {$EXTERNALSYM WTS_SERVER_INFOW} 
  TWtsServerInfoW = WTS_SERVER_INFOW; 
  PWtsServerInfoW = PWTS_SERVER_INFOW; 
 
  PWTS_SERVER_INFOA = ^WTS_SERVER_INFOA; 
  {$EXTERNALSYM PWTS_SERVER_INFOA} 
  _WTS_SERVER_INFOA = record 
    pServerName: LPSTR; // server name 
  end; 
  {$EXTERNALSYM _WTS_SERVER_INFOA} 
  WTS_SERVER_INFOA = _WTS_SERVER_INFOA; 
  {$EXTERNALSYM WTS_SERVER_INFOA} 
  TWtsServerInfoA = WTS_SERVER_INFOA; 
  PWtsServerInfoA = PWTS_SERVER_INFOA; 
 
{$IFDEF UNICODE} 
  WTS_SERVER_INFO = WTS_SERVER_INFOW; 
  {$EXTERNALSYM WTS_SERVER_INFO} 
  PWTS_SERVER_INFO = PWTS_SERVER_INFOW; 
  {$EXTERNALSYM PWTS_SERVER_INFO} 
  TWtsServerInfo = TWtsServerInfoW; 
  PWtsServerInfo = PWtsServerInfoW; 
{$ELSE} 
  WTS_SERVER_INFO = WTS_SERVER_INFOA; 
  {$EXTERNALSYM WTS_SERVER_INFO} 
  PWTS_SERVER_INFO = PWTS_SERVER_INFOA; 
  {$EXTERNALSYM PWTS_SERVER_INFO} 
  TWtsServerInfo = TWtsServerInfoA; 
  PWtsServerInfo = PWtsServerInfoA; 
{$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. 
// 
 
type 
  PWTS_SESSION_INFOW = ^WTS_SESSION_INFOW; 
  {$EXTERNALSYM PWTS_SESSION_INFOW} 
  _WTS_SESSION_INFOW = record 
    SessionId: DWORD;              // session id 
    pWinStationName: LPWSTR;       // name of WinStation this session is connected to 
    State: WTS_CONNECTSTATE_CLASS; // connection state (see enum) 
  end; 
  {$EXTERNALSYM _WTS_SESSION_INFOW} 
  WTS_SESSION_INFOW = _WTS_SESSION_INFOW; 
  {$EXTERNALSYM WTS_SESSION_INFOW} 
  TWtsSessionInfoW = WTS_SESSION_INFOW; 
  PWtsSessionInfoW = PWTS_SESSION_INFOW; 
 
  PWTS_SESSION_INFOA = ^WTS_SESSION_INFOA; 
  {$EXTERNALSYM PWTS_SESSION_INFOA} 
  _WTS_SESSION_INFOA = record 
    SessionId: DWORD;              // session id 
    pWinStationName: LPSTR;        // name of WinStation this session is connected to 
    State: WTS_CONNECTSTATE_CLASS; // connection state (see enum) 
  end; 
  {$EXTERNALSYM _WTS_SESSION_INFOA} 
  WTS_SESSION_INFOA = _WTS_SESSION_INFOA; 
  {$EXTERNALSYM WTS_SESSION_INFOA} 
  TWtsSessionInfoA = WTS_SESSION_INFOA; 
  PWtsSessionInfoA = PWTS_SESSION_INFOA; 
 
{$IFDEF UNICODE} 
  WTS_SESSION_INFO = WTS_SESSION_INFOW; 
  PWTS_SESSION_INFO = PWTS_SESSION_INFOW; 
  TWtsSessionInfo = TWtsSessionInfoW; 
  PWtsSessionInfo = PWtsSessionInfoW; 
{$ELSE} 
  WTS_SESSION_INFO = WTS_SESSION_INFOA; 
  PWTS_SESSION_INFO = PWTS_SESSION_INFOA; 
  TWtsSessionInfo = TWtsSessionInfoA; 
  PWtsSessionInfo = PWtsSessionInfoA; 
{$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. 
// 
 
type 
  PWTS_PROCESS_INFOW = ^WTS_PROCESS_INFOW; 
  {$EXTERNALSYM PWTS_PROCESS_INFOW} 
  _WTS_PROCESS_INFOW = record 
    SessionId: DWORD;     // session id 
    ProcessId: DWORD;     // process id 
    pProcessName: LPWSTR; // name of process 
    pUserSid: PSID;       // user's SID 
  end; 
  {$EXTERNALSYM _WTS_PROCESS_INFOW} 
  WTS_PROCESS_INFOW = _WTS_PROCESS_INFOW; 
  {$EXTERNALSYM WTS_PROCESS_INFOW} 
  TWtsProcessInfoW = WTS_PROCESS_INFOW; 
  PWtsProcessInfoW = PWTS_PROCESS_INFOW; 
 
  PWTS_PROCESS_INFOA = ^WTS_PROCESS_INFOA; 
  {$EXTERNALSYM PWTS_PROCESS_INFOA} 
  _WTS_PROCESS_INFOA = record 
    SessionId: DWORD;    // session id 
    ProcessId: DWORD;    // process id 
    pProcessName: LPSTR; // name of process 
    pUserSid: PSID;      // user's SID 
  end; 
  {$EXTERNALSYM _WTS_PROCESS_INFOA} 
  WTS_PROCESS_INFOA = _WTS_PROCESS_INFOA; 
  {$EXTERNALSYM WTS_PROCESS_INFOA} 
  TWtsProcessInfoA = WTS_PROCESS_INFOA; 
  PWtsProcessInfoA = PWTS_PROCESS_INFOA; 
 
{$IFDEF UNICODE} 
  WTS_PROCESS_INFO = WTS_PROCESS_INFOW; 
  {$EXTERNALSYM WTS_PROCESS_INFO} 
  PWTS_PROCESS_INFO = PWTS_PROCESS_INFOW; 
  {$EXTERNALSYM PWTS_PROCESS_INFO} 
  TWtsProcessInfo = TWtsProcessInfoW; 
  PWtsProcessInfo = PWtsProcessInfoW; 
{$ELSE} 
  WTS_PROCESS_INFO = WTS_PROCESS_INFOA; 
  {$EXTERNALSYM WTS_PROCESS_INFO} 
  PWTS_PROCESS_INFO = PWTS_PROCESS_INFOA; 
  {$EXTERNALSYM PWTS_PROCESS_INFO} 
  TWtsProcessInfo = TWtsProcessInfoA; 
  PWtsProcessInfo = PWtsProcessInfoA; 
{$ENDIF} 
 
//============================================================================== 
// WTS_INFO_CLASS - WTSQuerySessionInformation 
// (See additional typedefs for more info on structures) 
//============================================================================== 
 
const 
  WTS_PROTOCOL_TYPE_CONSOLE = 0; // Console 
  {$EXTERNALSYM WTS_PROTOCOL_TYPE_CONSOLE} 
  WTS_PROTOCOL_TYPE_ICA     = 1; // ICA Protocol 
  {$EXTERNALSYM WTS_PROTOCOL_TYPE_ICA} 
  WTS_PROTOCOL_TYPE_RDP     = 2; // RDP Protocol 
  {$EXTERNALSYM WTS_PROTOCOL_TYPE_RDP} 

{$IFDEF false}
type
  _WTS_INFO_CLASS = (
    WTSInitialProgram,
    WTSApplicationName,
    WTSWorkingDirectory,
    WTSOEMId,
    WTSSessionId,
    WTSUserName,
    WTSWinStationName,
    WTSDomainName,
    WTSConnectState,
    WTSClientBuildNumber,
    WTSClientName,
    WTSClientDirectory,
    WTSClientProductId,
    WTSClientHardwareId,
    WTSClientAddress,
    WTSClientDisplay,
    WTSClientProtocolType);
  {$EXTERNALSYM _WTS_INFO_CLASS}
  WTS_INFO_CLASS = _WTS_INFO_CLASS;
  TWtsInfoClass = WTS_INFO_CLASS;
{$ELSE}
// xe2에서 위처럼 선언하고 하면.. WTSQuerySessionInformation에서 자꾸 87에러 뱉는다 14_0319 16:26:01 sunk
const
  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;
type
  WTS_INFO_CLASS = DWORD;
  TWtsInfoClass = WTS_INFO_CLASS;
{$ENDIF}

//============================================================================== 
// WTSQuerySessionInformation - (WTSClientAddress) 
//============================================================================== 
 
type 
  PWTS_CLIENT_ADDRESS = ^WTS_CLIENT_ADDRESS; 
  {$EXTERNALSYM PWTS_CLIENT_ADDRESS} 
  _WTS_CLIENT_ADDRESS = record 
    AddressFamily: DWORD;           // AF_INET, AF_IPX, AF_NETBIOS, AF_UNSPEC 
    Address: array [0..19] of BYTE; // client network address 
  end; 
  {$EXTERNALSYM _WTS_CLIENT_ADDRESS} 
  WTS_CLIENT_ADDRESS = _WTS_CLIENT_ADDRESS; 
  {$EXTERNALSYM WTS_CLIENT_ADDRESS} 
  TWtsClientAddress = WTS_CLIENT_ADDRESS; 
  PWtsClientAddress = PWTS_CLIENT_ADDRESS; 
 
//============================================================================== 
// WTSQuerySessionInformation - (WTSClientDisplay) 
//============================================================================== 
 
type 
  PWTS_CLIENT_DISPLAY = ^WTS_CLIENT_DISPLAY; 
  {$EXTERNALSYM PWTS_CLIENT_DISPLAY} 
  _WTS_CLIENT_DISPLAY = record 
    HorizontalResolution: DWORD; // horizontal dimensions, in pixels 
    VerticalResolution: DWORD;   // vertical dimensions, in pixels 
    ColorDepth: DWORD;           // 1=16, 2=256, 4=64K, 8=16M 
  end; 
  {$EXTERNALSYM _WTS_CLIENT_DISPLAY} 
  WTS_CLIENT_DISPLAY = _WTS_CLIENT_DISPLAY; 
  {$EXTERNALSYM WTS_CLIENT_DISPLAY} 
  TWtsClientDisplay = WTS_CLIENT_DISPLAY; 
  PWtsClientDisplay = PWTS_CLIENT_DISPLAY; 
 
//============================================================================== 
// WTS_CONFIG_CLASS - WTSQueryUserConfig/WTSSetUserConfig 
//============================================================================== 
 
type 
  _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 
  {$EXTERNALSYM _WTS_CONFIG_CLASS} 
  WTS_CONFIG_CLASS = _WTS_CONFIG_CLASS; 
  TWtsConfigClass = WTS_CONFIG_CLASS; 
 
  PWTS_USER_CONFIG_SET_NWSERVERW = ^WTS_USER_CONFIG_SET_NWSERVERW; 
  {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVERW} 
  _WTS_USER_CONFIG_SET_NWSERVERW = record 
    pNWServerName: LPWSTR; 
    pNWDomainAdminName: LPWSTR; 
    pNWDomainAdminPassword: LPWSTR; 
  end; 
  {$EXTERNALSYM _WTS_USER_CONFIG_SET_NWSERVERW} 
  WTS_USER_CONFIG_SET_NWSERVERW = _WTS_USER_CONFIG_SET_NWSERVERW; 
  {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVERW} 
  TWtsUserConfigSetNwserverW = WTS_USER_CONFIG_SET_NWSERVERW; 
  PWtsUserConfigSetNwserverW = PWTS_USER_CONFIG_SET_NWSERVERW; 
 
  PWTS_USER_CONFIG_SET_NWSERVERA = ^WTS_USER_CONFIG_SET_NWSERVERA; 
  {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVERA} 
  _WTS_USER_CONFIG_SET_NWSERVERA = record 
    pNWServerName: LPSTR; 
    pNWDomainAdminName: LPSTR; 
    pNWDomainAdminPassword: LPSTR; 
  end; 
  {$EXTERNALSYM _WTS_USER_CONFIG_SET_NWSERVERA} 
  WTS_USER_CONFIG_SET_NWSERVERA = _WTS_USER_CONFIG_SET_NWSERVERA; 
  {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVERA} 
  TWtsUserConfigSetNwserverA = WTS_USER_CONFIG_SET_NWSERVERA; 
  PWtsUserConfigSetNwserverA = PWTS_USER_CONFIG_SET_NWSERVERA; 
 
{$IFDEF UNICODE} 
  WTS_USER_CONFIG_SET_NWSERVER  = WTS_USER_CONFIG_SET_NWSERVERW; 
  {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVER} 
  PWTS_USER_CONFIG_SET_NWSERVER = PWTS_USER_CONFIG_SET_NWSERVERW; 
  {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVER} 
  TWtsUserConfigSetNwserver = TWtsUserConfigSetNwserverW; 
  PWtsUserConfigSetNwserver = PWtsUserConfigSetNwserverW; 
{$ELSE} 
  WTS_USER_CONFIG_SET_NWSERVER  = WTS_USER_CONFIG_SET_NWSERVERA; 
  {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVER} 
  PWTS_USER_CONFIG_SET_NWSERVER = PWTS_USER_CONFIG_SET_NWSERVERA; 
  {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVER} 
  TWtsUserConfigSetNwserver = TWtsUserConfigSetNwserverA; 
  PWtsUserConfigSetNwserver = PWtsUserConfigSetNwserverA; 
{$ENDIF} 
 
//============================================================================== 
// WTS_EVENT - Event flags for WTSWaitSystemEvent 
//============================================================================== 
 
const 
  WTS_EVENT_NONE        = $00000000; // return no event 
  {$EXTERNALSYM WTS_EVENT_NONE} 
  WTS_EVENT_CREATE      = $00000001; // new WinStation created 
  {$EXTERNALSYM WTS_EVENT_CREATE} 
  WTS_EVENT_DELETE      = $00000002; // existing WinStation deleted 
  {$EXTERNALSYM WTS_EVENT_DELETE} 
  WTS_EVENT_RENAME      = $00000004; // existing WinStation renamed 
  {$EXTERNALSYM WTS_EVENT_RENAME} 
  WTS_EVENT_CONNECT     = $00000008; // WinStation connect to client 
  {$EXTERNALSYM WTS_EVENT_CONNECT} 
  WTS_EVENT_DISCONNECT  = $00000010; // WinStation logged on without client 
  {$EXTERNALSYM WTS_EVENT_DISCONNECT} 
  WTS_EVENT_LOGON       = $00000020; // user logged on to existing WinStation 
  {$EXTERNALSYM WTS_EVENT_LOGON} 
  WTS_EVENT_LOGOFF      = $00000040; // user logged off from existing WinStation 
  {$EXTERNALSYM WTS_EVENT_LOGOFF} 
  WTS_EVENT_STATECHANGE = $00000080; // WinStation state change 
  {$EXTERNALSYM WTS_EVENT_STATECHANGE} 
  WTS_EVENT_LICENSE     = $00000100; // license state change 
  {$EXTERNALSYM WTS_EVENT_LICENSE} 
  WTS_EVENT_ALL         = $7fffffff; // wait for all event types 
  {$EXTERNALSYM WTS_EVENT_ALL} 
  WTS_EVENT_FLUSH       = DWORD($80000000); // unblock all waiters 
  {$EXTERNALSYM WTS_EVENT_FLUSH} 
 
//============================================================================== 
// WTS_VIRTUAL_CLASS - WTSVirtualChannelQuery 
//============================================================================== 
 
type 
  _WTS_VIRTUAL_CLASS = (WTSVirtualClientData);  // Virtual channel client module data (C2H data) 
  {$EXTERNALSYM _WTS_VIRTUAL_CLASS} 
  WTS_VIRTUAL_CLASS = _WTS_VIRTUAL_CLASS; 
  {$EXTERNALSYM WTS_VIRTUAL_CLASS} 
  TWtsVirtualClass = WTS_VIRTUAL_CLASS; 
 
//============================================================================== 
// Windows Terminal Server public APIs 
//============================================================================== 
 
function WTSEnumerateServersA(pDomainName: LPSTR; Reserved, Version: DWORD; 
  var ppServerInfo: PWTS_SERVER_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateServersA} 
function WTSEnumerateServersW(pDomainName: LPWSTR; Reserved, Version: DWORD; 
  var ppServerInfo: PWTS_SERVER_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateServersW} 
 
{$IFDEF UNICODE} 
function WTSEnumerateServers(pDomainName: LPWSTR; Reserved, Version: DWORD; 
  var ppServerInfo: PWTS_SERVER_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateServers} 
{$ELSE} 
function WTSEnumerateServers(pDomainName: LPSTR; Reserved, Version: DWORD; 
  var ppServerInfo: PWTS_SERVER_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateServers}
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSOpenServerA(pServerName: LPSTR): HANDLE; stdcall;
{$EXTERNALSYM WTSOpenServerA} 
function WTSOpenServerW(pServerName: LPWSTR): HANDLE; stdcall; 
{$EXTERNALSYM WTSOpenServerW} 
 
{$IFDEF UNICODE} 
function WTSOpenServer(pServerName: LPWSTR): HANDLE; stdcall;
{$EXTERNALSYM WTSOpenServer} 
{$ELSE} 
function WTSOpenServer(pServerName: LPSTR): HANDLE; stdcall; 
{$EXTERNALSYM WTSOpenServer} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
procedure WTSCloseServer(hServer: HANDLE); stdcall; 
{$EXTERNALSYM WTSCloseServer} 
 
//------------------------------------------------------------------------------ 
 
function WTSEnumerateSessionsA(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppSessionInfo: PWTS_SESSION_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateSessionsA} 
function WTSEnumerateSessionsW(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateSessionsW} 
 
{$IFDEF UNICODE} 
function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateSessions} 
{$ELSE} 
function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppSessionInfo: PWTS_SESSION_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateSessions} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSEnumerateProcessesA(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppProcessInfo: PWTS_PROCESS_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateProcessesA} 
function WTSEnumerateProcessesW(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppProcessInfo: PWTS_PROCESS_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateProcessesW} 
 
{$IFDEF UNICODE} 
function WTSEnumerateProcesses(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppProcessInfo: PWTS_PROCESS_INFOW; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateProcesses} 
{$ELSE} 
function WTSEnumerateProcesses(hServer: HANDLE; Reserved: DWORD; Version: DWORD; 
  var ppProcessInfo: PWTS_PROCESS_INFOA; var pCount: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSEnumerateProcesses} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSTerminateProcess(hServer: HANDLE; ProcessId, ExitCode: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSTerminateProcess} 
 
//------------------------------------------------------------------------------ 
 
function WTSQuerySessionInformationA(hServer: HANDLE; SessionId: DWORD; 
  WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQuerySessionInformationA} 
function WTSQuerySessionInformationW(hServer: HANDLE; SessionId: DWORD; 
  WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQuerySessionInformationW} 
 
{$IFDEF UNICODE} 
function WTSQuerySessionInformation(hServer: HANDLE; SessionId: DWORD; 
  WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQuerySessionInformation} 
{$ELSE} 
function WTSQuerySessionInformation(hServer: HANDLE; SessionId: DWORD; 
  WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQuerySessionInformation} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSQueryUserConfigA(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQueryUserConfigA} 
function WTSQueryUserConfigW(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQueryUserConfigW} 
 
{$IFDEF UNICODE} 
function WTSQueryUserConfig(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQueryUserConfig} 
{$ELSE} 
function WTSQueryUserConfig(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSQueryUserConfig} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSSetUserConfigA(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  pBuffer: LPSTR; DataLength: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSSetUserConfigA} 
function WTSSetUserConfigW(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  pBuffer: LPWSTR; DataLength: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSSetUserConfigW} 
 
{$IFDEF UNICODE} 
function WTSSetUserConfig(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  pBuffer: LPWSTR; DataLength: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSSetUserConfig} 
{$ELSE} 
function WTSSetUserConfig(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS; 
  pBuffer: LPSTR; DataLength: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSSetUserConfig} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSSendMessageA(hServer: HANDLE; SessionId: DWORD; pTitle: LPSTR; 
  TitleLength: DWORD; pMessage: LPSTR; MessageLength: DWORD; Style: DWORD; 
  Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSSendMessageA} 
function WTSSendMessageW(hServer: HANDLE; SessionId: DWORD; pTitle: LPWSTR; 
  TitleLength: DWORD; pMessage: LPWSTR; MessageLength: DWORD; Style: DWORD; 
  Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSSendMessageW} 
 
{$IFDEF UNICODE} 
function WTSSendMessage(hServer: HANDLE; SessionId: DWORD; pTitle: LPWSTR; 
  TitleLength: DWORD; pMessage: LPWSTR; MessageLength: DWORD; Style: DWORD; 
  Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSSendMessage} 
{$ELSE} 
function WTSSendMessage(hServer: HANDLE; SessionId: DWORD; pTitle: LPSTR; 
  TitleLength: DWORD; pMessage: LPSTR; MessageLength: DWORD; Style: DWORD; 
  Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSSendMessage} 
{$ENDIF} 
 
//------------------------------------------------------------------------------ 
 
function WTSDisconnectSession(hServer: HANDLE; SessionId: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSDisconnectSession} 
 
//------------------------------------------------------------------------------ 
 
function WTSLogoffSession(hServer: HANDLE; SessionId: DWORD; bWait: BOOL): BOOL; stdcall; 
{$EXTERNALSYM WTSLogoffSession} 
 
//------------------------------------------------------------------------------ 
 
function WTSShutdownSystem(hServer: HANDLE; ShutdownFlag: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSShutdownSystem} 
 
//------------------------------------------------------------------------------ 
 
function WTSWaitSystemEvent(hServer: HANDLE; EventMask: DWORD; 
  var pEventFlags: DWORD): BOOL; stdcall; 
{$EXTERNALSYM WTSWaitSystemEvent} 
 
//------------------------------------------------------------------------------ 
 
function WTSVirtualChannelOpen(hServer: HANDLE; SessionId: DWORD; 
  pVirtualName: LPSTR): HANDLE; stdcall; 
{$EXTERNALSYM WTSVirtualChannelOpen} 
 
function WTSVirtualChannelClose(hChannelHandle: HANDLE): BOOL; stdcall; 
{$EXTERNALSYM WTSVirtualChannelClose} 
 
function WTSVirtualChannelRead(hChannelHandle: HANDLE; TimeOut: ULONG; 
  Buffer: PCHAR; BufferSize: ULONG; var pBytesRead: ULONG): BOOL; stdcall; 
{$EXTERNALSYM WTSVirtualChannelRead} 
 
function WTSVirtualChannelWrite(hChannelHandle: HANDLE; Buffer: PCHAR; 
  Length: ULONG; var pBytesWritten: ULONG): BOOL; stdcall; 
{$EXTERNALSYM WTSVirtualChannelWrite} 
 
function WTSVirtualChannelPurgeInput(hChannelHandle: HANDLE): BOOL; stdcall; 
{$EXTERNALSYM WTSVirtualChannelPurgeInput} 
 
function WTSVirtualChannelPurgeOutput(hChannelHandle: HANDLE): BOOL; stdcall; 
{$EXTERNALSYM WTSVirtualChannelPurgeOutput} 
 
function WTSVirtualChannelQuery(hChannelHandle: HANDLE; VirtualClass: WTS_VIRTUAL_CLASS; 
  ppBuffer: PVOID; var pBytesReturned: DWORD): BOOL; stdcall;
{$EXTERNALSYM WTSVirtualChannelQuery} 
 
//------------------------------------------------------------------------------ 
 
procedure WTSFreeMemory(pMemory: PVOID); stdcall; 
{$EXTERNALSYM WTSFreeMemory} 
 
implementation 
 
const 
  wtsapi = 'wtsapi32.dll'; 
 
function WTSEnumerateServersA; external wtsapi name 'WTSEnumerateServersA'; 
function WTSEnumerateServersW; external wtsapi name 'WTSEnumerateServersW'; 
{$IFDEF UNICODE} 
function WTSEnumerateServers; external wtsapi name 'WTSEnumerateServersW'; 
{$ELSE} 
function WTSEnumerateServers; external wtsapi name 'WTSEnumerateServersA'; 
{$ENDIF} 
function WTSOpenServerA; external wtsapi name 'WTSOpenServerA'; 
function WTSOpenServerW; external wtsapi name 'WTSOpenServerW'; 
{$IFDEF UNICODE} 
function WTSOpenServer; external wtsapi name 'WTSOpenServerW'; 
{$ELSE} 
function WTSOpenServer; external wtsapi name 'WTSOpenServerA'; 
{$ENDIF} 
procedure WTSCloseServer; external wtsapi name 'WTSCloseServer'; 
function WTSEnumerateSessionsA; external wtsapi name 'WTSEnumerateSessionsA'; 
function WTSEnumerateSessionsW; external wtsapi name 'WTSEnumerateSessionsW'; 
{$IFDEF UNICODE} 
function WTSEnumerateSessions; external wtsapi name 'WTSEnumerateSessionsW'; 
{$ELSE} 
function WTSEnumerateSessions; external wtsapi name 'WTSEnumerateSessionsA'; 
{$ENDIF} 
function WTSEnumerateProcessesA; external wtsapi name 'WTSEnumerateProcessesA'; 
function WTSEnumerateProcessesW; external wtsapi name 'WTSEnumerateProcessesW'; 
{$IFDEF UNICODE} 
function WTSEnumerateProcesses; external wtsapi name 'WTSEnumerateProcessesW'; 
{$ELSE} 
function WTSEnumerateProcesses; external wtsapi name 'WTSEnumerateProcessesA'; 
{$ENDIF} 
function WTSTerminateProcess; external wtsapi name 'WTSTerminateProcess'; 
function WTSQuerySessionInformationA; external wtsapi name 'WTSQuerySessionInformationA'; 
function WTSQuerySessionInformationW; external wtsapi name 'WTSQuerySessionInformationW'; 
{$IFDEF UNICODE} 
function WTSQuerySessionInformation; external wtsapi name 'WTSQuerySessionInformationW';
{$ELSE}
function WTSQuerySessionInformation; external wtsapi name 'WTSQuerySessionInformationA 
{$ENDIF} 
function WTSQueryUserConfigA; external wtsapi name 'WTSQueryUserConfigA'; 
function WTSQueryUserConfigW; external wtsapi name 'WTSQueryUserConfigW'; 
{$IFDEF UNICODE} 
function WTSQueryUserConfig; external wtsapi name 'WTSQueryUserConfigW'; 
{$ELSE} 
function WTSQueryUserConfig; external wtsapi name 'WTSQueryUserConfigA; 
{$ENDIF} 
function WTSSetUserConfigA; external wtsapi name 'WTSSetUserConfigA'; 
function WTSSetUserConfigW; external wtsapi name 'WTSSetUserConfigW'; 
{$IFDEF UNICODE} 
function WTSSetUserConfig; external wtsapi name 'WTSSetUserConfigW'; 
{$ELSE} 
function WTSSetUserConfig; external wtsapi name 'WTSSetUserConfigA; 
{$ENDIF} 
function WTSSendMessageA; external wtsapi name 'WTSSendMessageA'; 
function WTSSendMessageW; external wtsapi name 'WTSSendMessageW';
{$IFDEF UNICODE} 
function WTSSendMessage; external wtsapi name 'WTSSendMessageW' 
{$ELSE} 
function WTSSendMessage; external wtsapi name 'WTSSendMessageA'; 
{$ENDIF} 
function WTSDisconnectSession; external wtsapi name 'WTSDisconnectSession'; 
function WTSLogoffSession; external wtsapi name 'WTSLogoffSession'; 
function WTSShutdownSystem; external wtsapi name 'WTSShutdownSystem'; 
function WTSWaitSystemEvent; external wtsapi name 'WTSWaitSystemEvent'; 
function WTSVirtualChannelOpen; external wtsapi name 'WTSVirtualChannelOpen'; 
function WTSVirtualChannelClose; external wtsapi name 'WTSVirtualChannelClose'; 
function WTSVirtualChannelRead; external wtsapi name 'WTSVirtualChannelRead'; 
function WTSVirtualChannelWrite; external wtsapi name 'WTSVirtualChannelWrite'; 
function WTSVirtualChannelPurgeInput; external wtsapi name 'WTSVirtualChannelPurgeInput'; 
function WTSVirtualChannelPurgeOutput; external wtsapi name 'WTSVirtualChannelPurgeOutput'; 
function WTSVirtualChannelQuery; external wtsapi name 'WTSVirtualChannelQuery'; 
procedure WTSFreeMemory; external wtsapi name 'WTSFreeMemory'; 
 
end. 
