{******************************************************************************} { } { Terminal Services API interface Unit for Object Pascal } { } { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft } { Corporation. All Rights Reserved. } { } { The original file is: wtsapi32.h, released June 2000. The original Pascal } { code is: WtsApi32.pas, released December 2000. The initial developer of the } { Pascal code is Marcel van Brakel (brakelm att chello dott nl). } { } { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 } { Marcel van Brakel. All Rights Reserved. } { } { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) } { } { You may retrieve the latest version of this file at the Project JEDI } { APILIB home page, located at http://jedi-apilib.sourceforge.net } { } { The contents of this file are used with permission, subject to the Mozilla } { Public License Version 1.1 (the "License"); you may not use this file except } { in compliance with the License. You may obtain a copy of the License at } { http://www.mozilla.org/MPL/MPL-1.1.html } { } { Software distributed under the License is distributed on an "AS IS" basis, } { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for } { the specific language governing rights and limitations under the License. } { } { Alternatively, the contents of this file may be used under the terms of the } { GNU Lesser General Public License (the "LGPL License"), in which case the } { provisions of the LGPL License are applicable instead of those above. } { If you wish to allow use of your version of this file only under the terms } { of the LGPL License and not to allow others to use your version of this file } { under the MPL, indicate your decision by deleting the provisions above and } { replace them with the notice and other provisions required by the LGPL } { License. If you do not delete the provisions above, a recipient may use } { your version of this file under either the MPL or the LGPL License. } { } { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html } { } {******************************************************************************} // $Id: JwaWtsApi32.pas,v 1.13 2007/09/14 06:48:49 marquardt Exp $ {$IFNDEF JWA_OMIT_SECTIONS} unit JwaWtsApi32; {$ENDIF JWA_OMIT_SECTIONS} {$IFNDEF JWA_OMIT_SECTIONS} {$I jediapilib.inc} interface uses JwaWinNT, JwaWinType; {$ENDIF JWA_OMIT_SECTIONS} {$IFNDEF JWA_IMPLEMENTATIONSECTION} // 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 = HANDLE(0); {$EXTERNALSYM WTS_CURRENT_SERVER} WTS_CURRENT_SERVER_HANDLE = HANDLE(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() // {$IFNDEF JWA_INCLUDEMODE} IDTIMEOUT = 32000; {$EXTERNALSYM IDTIMEOUT} {$ENDIF JWA_INCLUDEMODE} 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 // Added from Server 2008 pre-release SDK MAX_ELAPSED_TIME_LENGTH = 15; MAX_DATE_TIME_LENGTH = 56; WINSTATIONNAME_LENGTH = 32; DOMAIN_LENGTH = 17; //============================================================================== // 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; //============================================================================== // 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 UNICODE} //============================================================================== // 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 UNICODE} //============================================================================== // 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 UNICODE} //============================================================================== // 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} 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; //============================================================================== // 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; {$IFDEF FALSE} // There we're remove in June 2001 PSDK (pre-release) 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 UNICODE} {$ENDIF FALSE} //============================================================================== // 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, WTSVirtualFileHandle); {$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} function WTSEnumerateServers(pDomainName: LPTSTR; Reserved, Version: DWORD; var ppServerInfo: PWTS_SERVER_INFO; var pCount: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSEnumerateServers} //------------------------------------------------------------------------------ function WTSOpenServerA(pServerName: LPSTR): HANDLE; stdcall; {$EXTERNALSYM WTSOpenServerA} function WTSOpenServerW(pServerName: LPWSTR): HANDLE; stdcall; {$EXTERNALSYM WTSOpenServerW} function WTSOpenServer(pServerName: LPTSTR): HANDLE; stdcall; {$EXTERNALSYM WTSOpenServer} //------------------------------------------------------------------------------ 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} function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD; var ppSessionInfo: PWTS_SESSION_INFO; var pCount: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSEnumerateSessions} //------------------------------------------------------------------------------ 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} function WTSEnumerateProcesses(hServer: HANDLE; Reserved: DWORD; Version: DWORD; var ppProcessInfo: PWTS_PROCESS_INFO; var pCount: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSEnumerateProcesses} //------------------------------------------------------------------------------ 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} function WTSQuerySessionInformation(hServer: HANDLE; SessionId: DWORD; WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSQuerySessionInformation} //------------------------------------------------------------------------------ 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} function WTSQueryUserConfig(pServerName, pUserName: LPTSTR; WTSConfigClass: WTS_CONFIG_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSQueryUserConfig} //------------------------------------------------------------------------------ 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} function WTSSetUserConfig(pServerName, pUserName: LPTSTR; WTSConfigClass: WTS_CONFIG_CLASS; pBuffer: LPTSTR; DataLength: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSSetUserConfig} //------------------------------------------------------------------------------ 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} function WTSSendMessage(hServer: HANDLE; SessionId: DWORD; pTitle: LPTSTR; TitleLength: DWORD; pMessage: LPTSTR; MessageLength: DWORD; Style: DWORD; Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall; {$EXTERNALSYM WTSSendMessage} //------------------------------------------------------------------------------ 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} // Flags for Console Notification const NOTIFY_FOR_ALL_SESSIONS = 1; {$EXTERNALSYM NOTIFY_FOR_ALL_SESSIONS} NOTIFY_FOR_THIS_SESSION = 0; {$EXTERNALSYM NOTIFY_FOR_THIS_SESSION} function WTSRegisterSessionNotification(hWnd: HWND; dwFlags: DWORD): BOOL; stdcall; {$EXTERNALSYM WTSRegisterSessionNotification} function WTSUnRegisterSessionNotification(hWnd: HWND): BOOL; stdcall; {$EXTERNALSYM WTSUnRegisterSessionNotification} function WTSQueryUserToken(SessionId: ULONG; var phToken: HANDLE): BOOL; stdcall; {$EXTERNALSYM WTSQueryUserToken} {$ENDIF JWA_IMPLEMENTATIONSECTION} {$IFNDEF JWA_OMIT_SECTIONS} implementation //uses ... {$ENDIF JWA_OMIT_SECTIONS} {$IFNDEF JWA_INTERFACESECTION} {$IFNDEF JWA_INCLUDEMODE} const wtsapi = 'wtsapi32.dll'; {$IFDEF UNICODE} AWSuffix = 'W'; {$ELSE} AWSuffix = 'A'; {$ENDIF UNICODE} {$ENDIF JWA_INCLUDEMODE} {$IFDEF DYNAMIC_LINK} var _WTSEnumerateServersA: Pointer; function WTSEnumerateServersA; begin GetProcedureAddress(_WTSEnumerateServersA, wtsapi, 'WTSEnumerateServersA'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateServersA] end; end; var _WTSEnumerateServersW: Pointer; function WTSEnumerateServersW; begin GetProcedureAddress(_WTSEnumerateServersW, wtsapi, 'WTSEnumerateServersW'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateServersW] end; end; var _WTSEnumerateServers: Pointer; function WTSEnumerateServers; begin GetProcedureAddress(_WTSEnumerateServers, wtsapi, 'WTSEnumerateServers' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateServers] end; end; var _WTSOpenServerA: Pointer; function WTSOpenServerA; begin GetProcedureAddress(_WTSOpenServerA, wtsapi, 'WTSOpenServerA'); asm MOV ESP, EBP POP EBP JMP [_WTSOpenServerA] end; end; var _WTSOpenServerW: Pointer; function WTSOpenServerW; begin GetProcedureAddress(_WTSOpenServerW, wtsapi, 'WTSOpenServerW'); asm MOV ESP, EBP POP EBP JMP [_WTSOpenServerW] end; end; var _WTSOpenServer: Pointer; function WTSOpenServer; begin GetProcedureAddress(_WTSOpenServer, wtsapi, 'WTSOpenServer' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSOpenServer] end; end; var _WTSCloseServer: Pointer; procedure WTSCloseServer; begin GetProcedureAddress(_WTSCloseServer, wtsapi, 'WTSCloseServer'); asm MOV ESP, EBP POP EBP JMP [_WTSCloseServer] end; end; var _WTSEnumerateSessionsA: Pointer; function WTSEnumerateSessionsA; begin GetProcedureAddress(_WTSEnumerateSessionsA, wtsapi, 'WTSEnumerateSessionsA'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateSessionsA] end; end; var _WTSEnumerateSessionsW: Pointer; function WTSEnumerateSessionsW; begin GetProcedureAddress(_WTSEnumerateSessionsW, wtsapi, 'WTSEnumerateSessionsW'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateSessionsW] end; end; var _WTSEnumerateSessions: Pointer; function WTSEnumerateSessions; begin GetProcedureAddress(_WTSEnumerateSessions, wtsapi, 'WTSEnumerateSessions' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateSessions] end; end; var _WTSEnumerateProcessesA: Pointer; function WTSEnumerateProcessesA; begin GetProcedureAddress(_WTSEnumerateProcessesA, wtsapi, 'WTSEnumerateProcessesA'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateProcessesA] end; end; var _WTSEnumerateProcessesW: Pointer; function WTSEnumerateProcessesW; begin GetProcedureAddress(_WTSEnumerateProcessesW, wtsapi, 'WTSEnumerateProcessesW'); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateProcessesW] end; end; var _WTSEnumerateProcesses: Pointer; function WTSEnumerateProcesses; begin GetProcedureAddress(_WTSEnumerateProcesses, wtsapi, 'WTSEnumerateProcesses' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSEnumerateProcesses] end; end; var _WTSTerminateProcess: Pointer; function WTSTerminateProcess; begin GetProcedureAddress(_WTSTerminateProcess, wtsapi, 'WTSTerminateProcess'); asm MOV ESP, EBP POP EBP JMP [_WTSTerminateProcess] end; end; var _WTSQuerySessionInformationA: Pointer; function WTSQuerySessionInformationA; begin GetProcedureAddress(_WTSQuerySessionInformationA, wtsapi, 'WTSQuerySessionInformationA'); asm MOV ESP, EBP POP EBP JMP [_WTSQuerySessionInformationA] end; end; var _WTSQuerySessionInformationW: Pointer; function WTSQuerySessionInformationW; begin GetProcedureAddress(_WTSQuerySessionInformationW, wtsapi, 'WTSQuerySessionInformationW'); asm MOV ESP, EBP POP EBP JMP [_WTSQuerySessionInformationW] end; end; var _WTSQuerySessionInformation: Pointer; function WTSQuerySessionInformation; begin GetProcedureAddress(_WTSQuerySessionInformation, wtsapi, 'WTSQuerySessionInformation' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSQuerySessionInformation] end; end; var _WTSQueryUserConfigA: Pointer; function WTSQueryUserConfigA; begin GetProcedureAddress(_WTSQueryUserConfigA, wtsapi, 'WTSQueryUserConfigA'); asm MOV ESP, EBP POP EBP JMP [_WTSQueryUserConfigA] end; end; var _WTSQueryUserConfigW: Pointer; function WTSQueryUserConfigW; begin GetProcedureAddress(_WTSQueryUserConfigW, wtsapi, 'WTSQueryUserConfigW'); asm MOV ESP, EBP POP EBP JMP [_WTSQueryUserConfigW] end; end; var _WTSQueryUserConfig: Pointer; function WTSQueryUserConfig; begin GetProcedureAddress(_WTSQueryUserConfig, wtsapi, 'WTSQueryUserConfig' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSQueryUserConfig] end; end; var _WTSSetUserConfigA: Pointer; function WTSSetUserConfigA; begin GetProcedureAddress(_WTSSetUserConfigA, wtsapi, 'WTSSetUserConfigA'); asm MOV ESP, EBP POP EBP JMP [_WTSSetUserConfigA] end; end; var _WTSSetUserConfigW: Pointer; function WTSSetUserConfigW; begin GetProcedureAddress(_WTSSetUserConfigW, wtsapi, 'WTSSetUserConfigW'); asm MOV ESP, EBP POP EBP JMP [_WTSSetUserConfigW] end; end; var _WTSSetUserConfig: Pointer; function WTSSetUserConfig; begin GetProcedureAddress(_WTSSetUserConfig, wtsapi, 'WTSSetUserConfig' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSSetUserConfig] end; end; var _WTSSendMessageA: Pointer; function WTSSendMessageA; begin GetProcedureAddress(_WTSSendMessageA, wtsapi, 'WTSSendMessageA'); asm MOV ESP, EBP POP EBP JMP [_WTSSendMessageA] end; end; var _WTSSendMessageW: Pointer; function WTSSendMessageW; begin GetProcedureAddress(_WTSSendMessageW, wtsapi, 'WTSSendMessageW'); asm MOV ESP, EBP POP EBP JMP [_WTSSendMessageW] end; end; var _WTSSendMessage: Pointer; function WTSSendMessage; begin GetProcedureAddress(_WTSSendMessage, wtsapi, 'WTSSendMessage' + AWSuffix); asm MOV ESP, EBP POP EBP JMP [_WTSSendMessage] end; end; var _WTSDisconnectSession: Pointer; function WTSDisconnectSession; begin GetProcedureAddress(_WTSDisconnectSession, wtsapi, 'WTSDisconnectSession'); asm MOV ESP, EBP POP EBP JMP [_WTSDisconnectSession] end; end; var _WTSLogoffSession: Pointer; function WTSLogoffSession; begin GetProcedureAddress(_WTSLogoffSession, wtsapi, 'WTSLogoffSession'); asm MOV ESP, EBP POP EBP JMP [_WTSLogoffSession] end; end; var _WTSShutdownSystem: Pointer; function WTSShutdownSystem; begin GetProcedureAddress(_WTSShutdownSystem, wtsapi, 'WTSShutdownSystem'); asm MOV ESP, EBP POP EBP JMP [_WTSShutdownSystem] end; end; var _WTSWaitSystemEvent: Pointer; function WTSWaitSystemEvent; begin GetProcedureAddress(_WTSWaitSystemEvent, wtsapi, 'WTSWaitSystemEvent'); asm MOV ESP, EBP POP EBP JMP [_WTSWaitSystemEvent] end; end; var _WTSVirtualChannelOpen: Pointer; function WTSVirtualChannelOpen; begin GetProcedureAddress(_WTSVirtualChannelOpen, wtsapi, 'WTSVirtualChannelOpen'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelOpen] end; end; var _WTSVirtualChannelClose: Pointer; function WTSVirtualChannelClose; begin GetProcedureAddress(_WTSVirtualChannelClose, wtsapi, 'WTSVirtualChannelClose'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelClose] end; end; var _WTSVirtualChannelRead: Pointer; function WTSVirtualChannelRead; begin GetProcedureAddress(_WTSVirtualChannelRead, wtsapi, 'WTSVirtualChannelRead'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelRead] end; end; var _WTSVirtualChannelWrite: Pointer; function WTSVirtualChannelWrite; begin GetProcedureAddress(_WTSVirtualChannelWrite, wtsapi, 'WTSVirtualChannelWrite'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelWrite] end; end; var _WTSVirtualChannelPurgeInput: Pointer; function WTSVirtualChannelPurgeInput; begin GetProcedureAddress(_WTSVirtualChannelPurgeInput, wtsapi, 'WTSVirtualChannelPurgeInput'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelPurgeInput] end; end; var _WTSVirtualChannelPurgeOutput: Pointer; function WTSVirtualChannelPurgeOutput; begin GetProcedureAddress(_WTSVirtualChannelPurgeOutput, wtsapi, 'WTSVirtualChannelPurgeOutput'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelPurgeOutput] end; end; var _WTSVirtualChannelQuery: Pointer; function WTSVirtualChannelQuery; begin GetProcedureAddress(_WTSVirtualChannelQuery, wtsapi, 'WTSVirtualChannelQuery'); asm MOV ESP, EBP POP EBP JMP [_WTSVirtualChannelQuery] end; end; var _WTSFreeMemory: Pointer; procedure WTSFreeMemory; begin GetProcedureAddress(_WTSFreeMemory, wtsapi, 'WTSFreeMemory'); asm MOV ESP, EBP POP EBP JMP [_WTSFreeMemory] end; end; var _WTSRegisterSessionNotification: Pointer; function WTSRegisterSessionNotification; begin GetProcedureAddress(_WTSRegisterSessionNotification, wtsapi, 'WTSRegisterSessionNotification'); asm MOV ESP, EBP POP EBP JMP [_WTSRegisterSessionNotification] end; end; var _WTSUnRegisterSessionNot: Pointer; function WTSUnRegisterSessionNotification; begin GetProcedureAddress(_WTSUnRegisterSessionNot, wtsapi, 'WTSUnRegisterSessionNotification'); asm MOV ESP, EBP POP EBP JMP [_WTSUnRegisterSessionNot] end; end; var _WTSQueryUserToken: Pointer; function WTSQueryUserToken; begin GetProcedureAddress(_WTSQueryUserToken, wtsapi, 'WTSQueryUserToken'); asm MOV ESP, EBP POP EBP JMP [_WTSQueryUserToken] end; end; {$ELSE} function WTSEnumerateServersA; external wtsapi name 'WTSEnumerateServersA'; function WTSEnumerateServersW; external wtsapi name 'WTSEnumerateServersW'; function WTSEnumerateServers; external wtsapi name 'WTSEnumerateServers' + AWSuffix; function WTSOpenServerA; external wtsapi name 'WTSOpenServerA'; function WTSOpenServerW; external wtsapi name 'WTSOpenServerW'; function WTSOpenServer; external wtsapi name 'WTSOpenServer' + AWSuffix; procedure WTSCloseServer; external wtsapi name 'WTSCloseServer'; function WTSEnumerateSessionsA; external wtsapi name 'WTSEnumerateSessionsA'; function WTSEnumerateSessionsW; external wtsapi name 'WTSEnumerateSessionsW'; function WTSEnumerateSessions; external wtsapi name 'WTSEnumerateSessions' + AWSuffix; function WTSEnumerateProcessesA; external wtsapi name 'WTSEnumerateProcessesA'; function WTSEnumerateProcessesW; external wtsapi name 'WTSEnumerateProcessesW'; function WTSEnumerateProcesses; external wtsapi name 'WTSEnumerateProcesses' + AWSuffix; function WTSTerminateProcess; external wtsapi name 'WTSTerminateProcess'; function WTSQuerySessionInformationA; external wtsapi name 'WTSQuerySessionInformationA'; function WTSQuerySessionInformationW; external wtsapi name 'WTSQuerySessionInformationW'; function WTSQuerySessionInformation; external wtsapi name 'WTSQuerySessionInformation' + AWSuffix; function WTSQueryUserConfigA; external wtsapi name 'WTSQueryUserConfigA'; function WTSQueryUserConfigW; external wtsapi name 'WTSQueryUserConfigW'; function WTSQueryUserConfig; external wtsapi name 'WTSQueryUserConfig' + AWSuffix; function WTSSetUserConfigA; external wtsapi name 'WTSSetUserConfigA'; function WTSSetUserConfigW; external wtsapi name 'WTSSetUserConfigW'; function WTSSetUserConfig; external wtsapi name 'WTSSetUserConfig' + AWSuffix; function WTSSendMessageA; external wtsapi name 'WTSSendMessageA'; function WTSSendMessageW; external wtsapi name 'WTSSendMessageW'; function WTSSendMessage; external wtsapi name 'WTSSendMessage' + AWSuffix; 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'; function WTSRegisterSessionNotification; external wtsapi name 'WTSRegisterSessionNotification'; function WTSUnRegisterSessionNotification; external wtsapi name 'WTSUnRegisterSessionNotification'; function WTSQueryUserToken; external wtsapi name 'WTSQueryUserToken'; {$ENDIF DYNAMIC_LINK} {$ENDIF JWA_INTERFACESECTION} {$IFNDEF JWA_OMIT_SECTIONS} end. {$ENDIF JWA_OMIT_SECTIONS}