JwaWtsApi32.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:50k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Terminal Services API interface Unit for Object Pascal                       }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: wtsapi32.h, released June 2000. The original Pascal    }
  9. { code is: WtsApi32.pas, released December 2000. The initial developer of the  }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWtsApi32;
  44. interface
  45. uses
  46.   JwaWinNT, JwaWinType;
  47. //   Windows Terminal Server public APIs
  48. //
  49. //   Copyright 1995-1999, Citrix Systems Inc.
  50. //   Copyright (c) 1997-1999  Microsoft Corporation
  51. //==============================================================================
  52. // Defines
  53. //==============================================================================
  54. //
  55. //  Specifies the current server
  56. //
  57. const
  58.   WTS_CURRENT_SERVER        = HANDLE(0);
  59.   {$EXTERNALSYM WTS_CURRENT_SERVER}
  60.   WTS_CURRENT_SERVER_HANDLE = HANDLE(0);
  61.   {$EXTERNALSYM WTS_CURRENT_SERVER_HANDLE}
  62.   WTS_CURRENT_SERVER_NAME   = '';
  63.   {$EXTERNALSYM WTS_CURRENT_SERVER_NAME}
  64. //
  65. //  Specifies the current session (SessionId)
  66. //
  67.   WTS_CURRENT_SESSION = DWORD(-1);
  68.   {$EXTERNALSYM WTS_CURRENT_SESSION}
  69. //
  70. //  Possible pResponse values from WTSSendMessage()
  71. //
  72.   IDTIMEOUT = 32000;
  73.   {$EXTERNALSYM IDTIMEOUT}
  74.   IDASYNC   = 32001;
  75.   {$EXTERNALSYM IDASYNC}
  76. //
  77. //  Shutdown flags
  78. //
  79.   WTS_WSD_LOGOFF = $00000001;           // log off all users except
  80.   {$EXTERNALSYM WTS_WSD_LOGOFF}         // current user; deletes
  81.                                         // WinStations (a reboot is
  82.                                         // required to recreate the
  83.                                         // WinStations)
  84.   WTS_WSD_SHUTDOWN = $00000002;         // shutdown system
  85.   {$EXTERNALSYM WTS_WSD_SHUTDOWN}
  86.   WTS_WSD_REBOOT   = $00000004;         // shutdown and reboot
  87.   {$EXTERNALSYM WTS_WSD_REBOOT}
  88.   WTS_WSD_POWEROFF = $00000008;         // shutdown and power off (on
  89.   {$EXTERNALSYM WTS_WSD_POWEROFF}
  90.                                         // machines that support power
  91.                                         // off through software)
  92.   WTS_WSD_FASTREBOOT = $00000010;       // reboot without logging users
  93.   {$EXTERNALSYM WTS_WSD_FASTREBOOT}     // off or shutting down
  94. //==============================================================================
  95. // WTS_CONNECTSTATE_CLASS - Session connect state
  96. //==============================================================================
  97. type
  98.   _WTS_CONNECTSTATE_CLASS = (
  99.     WTSActive,              // User logged on to WinStation
  100.     WTSConnected,           // WinStation connected to client
  101.     WTSConnectQuery,        // In the process of connecting to client
  102.     WTSShadow,              // Shadowing another WinStation
  103.     WTSDisconnected,        // WinStation logged on without client
  104.     WTSIdle,                // Waiting for client to connect
  105.     WTSListen,              // WinStation is listening for connection
  106.     WTSReset,               // WinStation is being reset
  107.     WTSDown,                // WinStation is down due to error
  108.     WTSInit);               // WinStation in initialization
  109.   {$EXTERNALSYM _WTS_CONNECTSTATE_CLASS}
  110.   WTS_CONNECTSTATE_CLASS = _WTS_CONNECTSTATE_CLASS;
  111.   {$EXTERNALSYM WTS_CONNECTSTATE_CLASS}
  112.   TWtsConnectStateClass = WTS_CONNECTSTATE_CLASS;
  113. //==============================================================================
  114. // WTS_SERVER_INFO - returned by WTSEnumerateServers (version 1)
  115. //==============================================================================
  116. //
  117. //  WTSEnumerateServers() returns two variables: pServerInfo and Count.
  118. //  The latter is the number of WTS_SERVER_INFO structures contained in
  119. //  the former.  In order to read each server, iterate i from 0 to
  120. //  Count-1 and reference the server name as
  121. //  pServerInfo[i].pServerName; for example:
  122. //
  123. //  for ( i=0; i < Count; i++ ) {
  124. //      _tprintf( TEXT("%s "), pServerInfo[i].pServerName );
  125. //  }
  126. //
  127. //  The memory returned looks like the following.  P is a pServerInfo
  128. //  pointer, and D is the string data for that pServerInfo:
  129. //
  130. //  P1 P2 P3 P4 ... Pn D1 D2 D3 D4 ... Dn
  131. //
  132. //  This makes it easier to iterate the servers, using code similar to
  133. //  the above.
  134. //
  135. type
  136.   PWTS_SERVER_INFOW = ^WTS_SERVER_INFOW;
  137.   {$EXTERNALSYM PWTS_SERVER_INFOW}
  138.   _WTS_SERVER_INFOW = record
  139.     pServerName: LPWSTR; // server name
  140.   end;
  141.   {$EXTERNALSYM _WTS_SERVER_INFOW}
  142.   WTS_SERVER_INFOW = _WTS_SERVER_INFOW;
  143.   {$EXTERNALSYM WTS_SERVER_INFOW}
  144.   TWtsServerInfoW = WTS_SERVER_INFOW;
  145.   PWtsServerInfoW = PWTS_SERVER_INFOW;
  146.   PWTS_SERVER_INFOA = ^WTS_SERVER_INFOA;
  147.   {$EXTERNALSYM PWTS_SERVER_INFOA}
  148.   _WTS_SERVER_INFOA = record
  149.     pServerName: LPSTR; // server name
  150.   end;
  151.   {$EXTERNALSYM _WTS_SERVER_INFOA}
  152.   WTS_SERVER_INFOA = _WTS_SERVER_INFOA;
  153.   {$EXTERNALSYM WTS_SERVER_INFOA}
  154.   TWtsServerInfoA = WTS_SERVER_INFOA;
  155.   PWtsServerInfoA = PWTS_SERVER_INFOA;
  156. {$IFDEF UNICODE}
  157.   WTS_SERVER_INFO = WTS_SERVER_INFOW;
  158.   {$EXTERNALSYM WTS_SERVER_INFO}
  159.   PWTS_SERVER_INFO = PWTS_SERVER_INFOW;
  160.   {$EXTERNALSYM PWTS_SERVER_INFO}
  161.   TWtsServerInfo = TWtsServerInfoW;
  162.   PWtsServerInfo = PWtsServerInfoW;
  163. {$ELSE}
  164.   WTS_SERVER_INFO = WTS_SERVER_INFOA;
  165.   {$EXTERNALSYM WTS_SERVER_INFO}
  166.   PWTS_SERVER_INFO = PWTS_SERVER_INFOA;
  167.   {$EXTERNALSYM PWTS_SERVER_INFO}
  168.   TWtsServerInfo = TWtsServerInfoA;
  169.   PWtsServerInfo = PWtsServerInfoA;
  170. {$ENDIF}
  171. //==============================================================================
  172. // WTS_SESSION_INFO - returned by WTSEnumerateSessions (version 1)
  173. //==============================================================================
  174. //
  175. //  WTSEnumerateSessions() returns data in a similar format to the above
  176. //  WTSEnumerateServers().  It returns two variables: pSessionInfo and
  177. //  Count.  The latter is the number of WTS_SESSION_INFO structures
  178. //  contained in the former.  Iteration is similar, except that there
  179. //  are three parts to each entry, so it would look like this:
  180. //
  181. //  for ( i=0; i < Count; i++ ) {
  182. //      _tprintf( TEXT("%-5u  %-20s  %un"),
  183. //                pSessionInfo[i].SessionId,
  184. //                pSessionInfo[i].pWinStationName,
  185. //                pSessionInfo[i].State );
  186. //  }
  187. //
  188. //  The memory returned is also segmented as the above, with all the
  189. //  structures allocated at the start and the string data at the end.
  190. //  We'll use S for the SessionId, P for the pWinStationName pointer
  191. //  and D for the string data, and C for the connect State:
  192. //
  193. //  S1 P1 C1 S2 P2 C2 S3 P3 C3 S4 P4 C4 ... Sn Pn Cn D1 D2 D3 D4 ... Dn
  194. //
  195. //  As above, this makes it easier to iterate the sessions.
  196. //
  197. type
  198.   PWTS_SESSION_INFOW = ^WTS_SESSION_INFOW;
  199.   {$EXTERNALSYM PWTS_SESSION_INFOW}
  200.   _WTS_SESSION_INFOW = record
  201.     SessionId: DWORD;              // session id
  202.     pWinStationName: LPWSTR;       // name of WinStation this session is connected to
  203.     State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
  204.   end;
  205.   {$EXTERNALSYM _WTS_SESSION_INFOW}
  206.   WTS_SESSION_INFOW = _WTS_SESSION_INFOW;
  207.   {$EXTERNALSYM WTS_SESSION_INFOW}
  208.   TWtsSessionInfoW = WTS_SESSION_INFOW;
  209.   PWtsSessionInfoW = PWTS_SESSION_INFOW;
  210.   PWTS_SESSION_INFOA = ^WTS_SESSION_INFOA;
  211.   {$EXTERNALSYM PWTS_SESSION_INFOA}
  212.   _WTS_SESSION_INFOA = record
  213.     SessionId: DWORD;              // session id
  214.     pWinStationName: LPSTR;        // name of WinStation this session is connected to
  215.     State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
  216.   end;
  217.   {$EXTERNALSYM _WTS_SESSION_INFOA}
  218.   WTS_SESSION_INFOA = _WTS_SESSION_INFOA;
  219.   {$EXTERNALSYM WTS_SESSION_INFOA}
  220.   TWtsSessionInfoA = WTS_SESSION_INFOA;
  221.   PWtsSessionInfoA = PWTS_SESSION_INFOA;
  222. {$IFDEF UNICODE}
  223.   WTS_SESSION_INFO = WTS_SESSION_INFOW;
  224.   PWTS_SESSION_INFO = PWTS_SESSION_INFOW;
  225.   TWtsSessionInfo = TWtsSessionInfoW;
  226.   PWtsSessionInfo = PWtsSessionInfoW;
  227. {$ELSE}
  228.   WTS_SESSION_INFO = WTS_SESSION_INFOA;
  229.   PWTS_SESSION_INFO = PWTS_SESSION_INFOA;
  230.   TWtsSessionInfo = TWtsSessionInfoA;
  231.   PWtsSessionInfo = PWtsSessionInfoA;
  232. {$ENDIF}
  233. //==============================================================================
  234. // WTS_PROCESS_INFO - returned by WTSEnumerateProcesses (version 1)
  235. //==============================================================================
  236. //
  237. //  WTSEnumerateProcesses() also returns data similar to
  238. //  WTSEnumerateServers().  It returns two variables: pProcessInfo and
  239. //  Count.  The latter is the number of WTS_PROCESS_INFO structures
  240. //  contained in the former.  Iteration is similar, except that there
  241. //  are four parts to each entry, so it would look like this:
  242. //
  243. //  for ( i=0; i < Count; i++ ) {
  244. //      GetUserNameFromSid( pProcessInfo[i].pUserSid, UserName,
  245. //                          sizeof(UserName) );
  246. //      _tprintf( TEXT("%-5u  %-20s  %-5u  %sn"),
  247. //              pProcessInfo[i].SessionId,
  248. //              UserName,
  249. //              pProcessInfo[i].ProcessId,
  250. //              pProcessInfo[i].pProcessName );
  251. //  }
  252. //
  253. //  The memory returned is also segmented as the above, with all the
  254. //  structures allocated at the start and the string data at the end.
  255. //  We'll use S for the SessionId, R for the ProcessId, P for the
  256. //  pProcessName pointer and D for the string data, and U for pUserSid:
  257. //
  258. //  S1 R1 P1 U1 S2 R2 P2 U2 S3 R3 P3 U3 ... Sn Rn Pn Un D1 D2 D3 ... Dn
  259. //
  260. //  As above, this makes it easier to iterate the processes.
  261. //
  262. type
  263.   PWTS_PROCESS_INFOW = ^WTS_PROCESS_INFOW;
  264.   {$EXTERNALSYM PWTS_PROCESS_INFOW}
  265.   _WTS_PROCESS_INFOW = record
  266.     SessionId: DWORD;     // session id
  267.     ProcessId: DWORD;     // process id
  268.     pProcessName: LPWSTR; // name of process
  269.     pUserSid: PSID;       // user's SID
  270.   end;
  271.   {$EXTERNALSYM _WTS_PROCESS_INFOW}
  272.   WTS_PROCESS_INFOW = _WTS_PROCESS_INFOW;
  273.   {$EXTERNALSYM WTS_PROCESS_INFOW}
  274.   TWtsProcessInfoW = WTS_PROCESS_INFOW;
  275.   PWtsProcessInfoW = PWTS_PROCESS_INFOW;
  276.   PWTS_PROCESS_INFOA = ^WTS_PROCESS_INFOA;
  277.   {$EXTERNALSYM PWTS_PROCESS_INFOA}
  278.   _WTS_PROCESS_INFOA = record
  279.     SessionId: DWORD;    // session id
  280.     ProcessId: DWORD;    // process id
  281.     pProcessName: LPSTR; // name of process
  282.     pUserSid: PSID;      // user's SID
  283.   end;
  284.   {$EXTERNALSYM _WTS_PROCESS_INFOA}
  285.   WTS_PROCESS_INFOA = _WTS_PROCESS_INFOA;
  286.   {$EXTERNALSYM WTS_PROCESS_INFOA}
  287.   TWtsProcessInfoA = WTS_PROCESS_INFOA;
  288.   PWtsProcessInfoA = PWTS_PROCESS_INFOA;
  289. {$IFDEF UNICODE}
  290.   WTS_PROCESS_INFO = WTS_PROCESS_INFOW;
  291.   {$EXTERNALSYM WTS_PROCESS_INFO}
  292.   PWTS_PROCESS_INFO = PWTS_PROCESS_INFOW;
  293.   {$EXTERNALSYM PWTS_PROCESS_INFO}
  294.   TWtsProcessInfo = TWtsProcessInfoW;
  295.   PWtsProcessInfo = PWtsProcessInfoW;
  296. {$ELSE}
  297.   WTS_PROCESS_INFO = WTS_PROCESS_INFOA;
  298.   {$EXTERNALSYM WTS_PROCESS_INFO}
  299.   PWTS_PROCESS_INFO = PWTS_PROCESS_INFOA;
  300.   {$EXTERNALSYM PWTS_PROCESS_INFO}
  301.   TWtsProcessInfo = TWtsProcessInfoA;
  302.   PWtsProcessInfo = PWtsProcessInfoA;
  303. {$ENDIF}
  304. //==============================================================================
  305. // WTS_INFO_CLASS - WTSQuerySessionInformation
  306. // (See additional typedefs for more info on structures)
  307. //==============================================================================
  308. const
  309.   WTS_PROTOCOL_TYPE_CONSOLE = 0; // Console
  310.   {$EXTERNALSYM WTS_PROTOCOL_TYPE_CONSOLE}
  311.   WTS_PROTOCOL_TYPE_ICA     = 1; // ICA Protocol
  312.   {$EXTERNALSYM WTS_PROTOCOL_TYPE_ICA}
  313.   WTS_PROTOCOL_TYPE_RDP     = 2; // RDP Protocol
  314.   {$EXTERNALSYM WTS_PROTOCOL_TYPE_RDP}
  315. type
  316.   _WTS_INFO_CLASS = (
  317.     WTSInitialProgram,
  318.     WTSApplicationName,
  319.     WTSWorkingDirectory,
  320.     WTSOEMId,
  321.     WTSSessionId,
  322.     WTSUserName,
  323.     WTSWinStationName,
  324.     WTSDomainName,
  325.     WTSConnectState,
  326.     WTSClientBuildNumber,
  327.     WTSClientName,
  328.     WTSClientDirectory,
  329.     WTSClientProductId,
  330.     WTSClientHardwareId,
  331.     WTSClientAddress,
  332.     WTSClientDisplay,
  333.     WTSClientProtocolType);
  334.   {$EXTERNALSYM _WTS_INFO_CLASS}
  335.   WTS_INFO_CLASS = _WTS_INFO_CLASS;
  336.   TWtsInfoClass = WTS_INFO_CLASS;
  337. //==============================================================================
  338. // WTSQuerySessionInformation - (WTSClientAddress)
  339. //==============================================================================
  340. type
  341.   PWTS_CLIENT_ADDRESS = ^WTS_CLIENT_ADDRESS;
  342.   {$EXTERNALSYM PWTS_CLIENT_ADDRESS}
  343.   _WTS_CLIENT_ADDRESS = record
  344.     AddressFamily: DWORD;           // AF_INET, AF_IPX, AF_NETBIOS, AF_UNSPEC
  345.     Address: array [0..19] of BYTE; // client network address
  346.   end;
  347.   {$EXTERNALSYM _WTS_CLIENT_ADDRESS}
  348.   WTS_CLIENT_ADDRESS = _WTS_CLIENT_ADDRESS;
  349.   {$EXTERNALSYM WTS_CLIENT_ADDRESS}
  350.   TWtsClientAddress = WTS_CLIENT_ADDRESS;
  351.   PWtsClientAddress = PWTS_CLIENT_ADDRESS;
  352. //==============================================================================
  353. // WTSQuerySessionInformation - (WTSClientDisplay)
  354. //==============================================================================
  355. type
  356.   PWTS_CLIENT_DISPLAY = ^WTS_CLIENT_DISPLAY;
  357.   {$EXTERNALSYM PWTS_CLIENT_DISPLAY}
  358.   _WTS_CLIENT_DISPLAY = record
  359.     HorizontalResolution: DWORD; // horizontal dimensions, in pixels
  360.     VerticalResolution: DWORD;   // vertical dimensions, in pixels
  361.     ColorDepth: DWORD;           // 1=16, 2=256, 4=64K, 8=16M
  362.   end;
  363.   {$EXTERNALSYM _WTS_CLIENT_DISPLAY}
  364.   WTS_CLIENT_DISPLAY = _WTS_CLIENT_DISPLAY;
  365.   {$EXTERNALSYM WTS_CLIENT_DISPLAY}
  366.   TWtsClientDisplay = WTS_CLIENT_DISPLAY;
  367.   PWtsClientDisplay = PWTS_CLIENT_DISPLAY;
  368. //==============================================================================
  369. // WTS_CONFIG_CLASS - WTSQueryUserConfig/WTSSetUserConfig
  370. //==============================================================================
  371. type
  372.   _WTS_CONFIG_CLASS = (
  373.     //Initial program settings
  374.     WTSUserConfigInitialProgram,          // string returned/expected
  375.     WTSUserConfigWorkingDirectory,        // string returned/expected
  376.     WTSUserConfigfInheritInitialProgram,  // DWORD returned/expected
  377.     //
  378.     WTSUserConfigfAllowLogonTerminalServer,  //DWORD returned/expected
  379.     //Timeout settings
  380.     WTSUserConfigTimeoutSettingsConnections,  //DWORD returned/expected
  381.     WTSUserConfigTimeoutSettingsDisconnections, //DWORD returned/expected
  382.     WTSUserConfigTimeoutSettingsIdle,          //DWORD returned/expected
  383.     //Client device settings
  384.     WTSUserConfigfDeviceClientDrives,   //DWORD returned/expected
  385.     WTSUserConfigfDeviceClientPrinters,         //DWORD returned/expected
  386.     WTSUserConfigfDeviceClientDefaultPrinter,   //DWORD returned/expected
  387.     //Connection settings
  388.     WTSUserConfigBrokenTimeoutSettings,         //DWORD returned/expected
  389.     WTSUserConfigReconnectSettings,             //DWORD returned/expected
  390.     //Modem settings
  391.     WTSUserConfigModemCallbackSettings,         //DWORD returned/expected
  392.     WTSUserConfigModemCallbackPhoneNumber,      // string returned/expected
  393.     //Shadow settings
  394.     WTSUserConfigShadowingSettings,             //DWORD returned/expected
  395.     //User Profile settings
  396.     WTSUserConfigTerminalServerProfilePath,     // string returned/expected
  397.     //Terminal Server home directory
  398.     WTSUserConfigTerminalServerHomeDir,         // string returned/expected
  399.     WTSUserConfigTerminalServerHomeDirDrive,    // string returned/expected
  400.     WTSUserConfigfTerminalServerRemoteHomeDir); // DWORD 0:LOCAL 1:REMOTE
  401.   {$EXTERNALSYM _WTS_CONFIG_CLASS}
  402.   WTS_CONFIG_CLASS = _WTS_CONFIG_CLASS;
  403.   TWtsConfigClass = WTS_CONFIG_CLASS;
  404. {$IFDEF FALSE}
  405. // There we're remove in June 2001 PSDK (pre-release)
  406.   PWTS_USER_CONFIG_SET_NWSERVERW = ^WTS_USER_CONFIG_SET_NWSERVERW;
  407.   {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVERW}
  408.   _WTS_USER_CONFIG_SET_NWSERVERW = record
  409.     pNWServerName: LPWSTR;
  410.     pNWDomainAdminName: LPWSTR;
  411.     pNWDomainAdminPassword: LPWSTR;
  412.   end;
  413.   {$EXTERNALSYM _WTS_USER_CONFIG_SET_NWSERVERW}
  414.   WTS_USER_CONFIG_SET_NWSERVERW = _WTS_USER_CONFIG_SET_NWSERVERW;
  415.   {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVERW}
  416.   TWtsUserConfigSetNwserverW = WTS_USER_CONFIG_SET_NWSERVERW;
  417.   PWtsUserConfigSetNwserverW = PWTS_USER_CONFIG_SET_NWSERVERW;
  418.   PWTS_USER_CONFIG_SET_NWSERVERA = ^WTS_USER_CONFIG_SET_NWSERVERA;
  419.   {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVERA}
  420.   _WTS_USER_CONFIG_SET_NWSERVERA = record
  421.     pNWServerName: LPSTR;
  422.     pNWDomainAdminName: LPSTR;
  423.     pNWDomainAdminPassword: LPSTR;
  424.   end;
  425.   {$EXTERNALSYM _WTS_USER_CONFIG_SET_NWSERVERA}
  426.   WTS_USER_CONFIG_SET_NWSERVERA = _WTS_USER_CONFIG_SET_NWSERVERA;
  427.   {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVERA}
  428.   TWtsUserConfigSetNwserverA = WTS_USER_CONFIG_SET_NWSERVERA;
  429.   PWtsUserConfigSetNwserverA = PWTS_USER_CONFIG_SET_NWSERVERA;
  430. {$IFDEF UNICODE}
  431.   WTS_USER_CONFIG_SET_NWSERVER  = WTS_USER_CONFIG_SET_NWSERVERW;
  432.   {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVER}
  433.   PWTS_USER_CONFIG_SET_NWSERVER = PWTS_USER_CONFIG_SET_NWSERVERW;
  434.   {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVER}
  435.   TWtsUserConfigSetNwserver = TWtsUserConfigSetNwserverW;
  436.   PWtsUserConfigSetNwserver = PWtsUserConfigSetNwserverW;
  437. {$ELSE}
  438.   WTS_USER_CONFIG_SET_NWSERVER  = WTS_USER_CONFIG_SET_NWSERVERA;
  439.   {$EXTERNALSYM WTS_USER_CONFIG_SET_NWSERVER}
  440.   PWTS_USER_CONFIG_SET_NWSERVER = PWTS_USER_CONFIG_SET_NWSERVERA;
  441.   {$EXTERNALSYM PWTS_USER_CONFIG_SET_NWSERVER}
  442.   TWtsUserConfigSetNwserver = TWtsUserConfigSetNwserverA;
  443.   PWtsUserConfigSetNwserver = PWtsUserConfigSetNwserverA;
  444. {$ENDIF}
  445. {$ENDIF}
  446. //==============================================================================
  447. // WTS_EVENT - Event flags for WTSWaitSystemEvent
  448. //==============================================================================
  449. const
  450.   WTS_EVENT_NONE        = $00000000; // return no event
  451.   {$EXTERNALSYM WTS_EVENT_NONE}
  452.   WTS_EVENT_CREATE      = $00000001; // new WinStation created
  453.   {$EXTERNALSYM WTS_EVENT_CREATE}
  454.   WTS_EVENT_DELETE      = $00000002; // existing WinStation deleted
  455.   {$EXTERNALSYM WTS_EVENT_DELETE}
  456.   WTS_EVENT_RENAME      = $00000004; // existing WinStation renamed
  457.   {$EXTERNALSYM WTS_EVENT_RENAME}
  458.   WTS_EVENT_CONNECT     = $00000008; // WinStation connect to client
  459.   {$EXTERNALSYM WTS_EVENT_CONNECT}
  460.   WTS_EVENT_DISCONNECT  = $00000010; // WinStation logged on without client
  461.   {$EXTERNALSYM WTS_EVENT_DISCONNECT}
  462.   WTS_EVENT_LOGON       = $00000020; // user logged on to existing WinStation
  463.   {$EXTERNALSYM WTS_EVENT_LOGON}
  464.   WTS_EVENT_LOGOFF      = $00000040; // user logged off from existing WinStation
  465.   {$EXTERNALSYM WTS_EVENT_LOGOFF}
  466.   WTS_EVENT_STATECHANGE = $00000080; // WinStation state change
  467.   {$EXTERNALSYM WTS_EVENT_STATECHANGE}
  468.   WTS_EVENT_LICENSE     = $00000100; // license state change
  469.   {$EXTERNALSYM WTS_EVENT_LICENSE}
  470.   WTS_EVENT_ALL         = $7fffffff; // wait for all event types
  471.   {$EXTERNALSYM WTS_EVENT_ALL}
  472.   WTS_EVENT_FLUSH       = DWORD($80000000); // unblock all waiters
  473.   {$EXTERNALSYM WTS_EVENT_FLUSH}
  474. //==============================================================================
  475. // WTS_VIRTUAL_CLASS - WTSVirtualChannelQuery
  476. //==============================================================================
  477. type
  478.   _WTS_VIRTUAL_CLASS = (WTSVirtualClientData, WTSVirtualFileHandle);  
  479.   {$EXTERNALSYM _WTS_VIRTUAL_CLASS}
  480.   WTS_VIRTUAL_CLASS = _WTS_VIRTUAL_CLASS;
  481.   {$EXTERNALSYM WTS_VIRTUAL_CLASS}
  482.   TWtsVirtualClass = WTS_VIRTUAL_CLASS;
  483. //==============================================================================
  484. // Windows Terminal Server public APIs
  485. //==============================================================================
  486. function WTSEnumerateServersA(pDomainName: LPSTR; Reserved, Version: DWORD;
  487.   var ppServerInfo: PWTS_SERVER_INFOA; var pCount: DWORD): BOOL; stdcall;
  488. {$EXTERNALSYM WTSEnumerateServersA}
  489. function WTSEnumerateServersW(pDomainName: LPWSTR; Reserved, Version: DWORD;
  490.   var ppServerInfo: PWTS_SERVER_INFOW; var pCount: DWORD): BOOL; stdcall;
  491. {$EXTERNALSYM WTSEnumerateServersW}
  492. {$IFDEF UNICODE}
  493. function WTSEnumerateServers(pDomainName: LPWSTR; Reserved, Version: DWORD;
  494.   var ppServerInfo: PWTS_SERVER_INFOW; var pCount: DWORD): BOOL; stdcall;
  495. {$EXTERNALSYM WTSEnumerateServers}
  496. {$ELSE}
  497. function WTSEnumerateServers(pDomainName: LPSTR; Reserved, Version: DWORD;
  498.   var ppServerInfo: PWTS_SERVER_INFOA; var pCount: DWORD): BOOL; stdcall;
  499. {$EXTERNALSYM WTSEnumerateServers}
  500. {$ENDIF}
  501. //------------------------------------------------------------------------------
  502. function WTSOpenServerA(pServerName: LPSTR): HANDLE; stdcall;
  503. {$EXTERNALSYM WTSOpenServerA}
  504. function WTSOpenServerW(pServerName: LPWSTR): HANDLE; stdcall;
  505. {$EXTERNALSYM WTSOpenServerW}
  506. {$IFDEF UNICODE}
  507. function WTSOpenServer(pServerName: LPWSTR): HANDLE; stdcall;
  508. {$EXTERNALSYM WTSOpenServer}
  509. {$ELSE}
  510. function WTSOpenServer(pServerName: LPSTR): HANDLE; stdcall;
  511. {$EXTERNALSYM WTSOpenServer}
  512. {$ENDIF}
  513. //------------------------------------------------------------------------------
  514. procedure WTSCloseServer(hServer: HANDLE); stdcall;
  515. {$EXTERNALSYM WTSCloseServer}
  516. //------------------------------------------------------------------------------
  517. function WTSEnumerateSessionsA(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  518.   var ppSessionInfo: PWTS_SESSION_INFOA; var pCount: DWORD): BOOL; stdcall;
  519. {$EXTERNALSYM WTSEnumerateSessionsA}
  520. function WTSEnumerateSessionsW(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  521.   var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
  522. {$EXTERNALSYM WTSEnumerateSessionsW}
  523. {$IFDEF UNICODE}
  524. function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  525.   var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
  526. {$EXTERNALSYM WTSEnumerateSessions}
  527. {$ELSE}
  528. function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  529.   var ppSessionInfo: PWTS_SESSION_INFOA; var pCount: DWORD): BOOL; stdcall;
  530. {$EXTERNALSYM WTSEnumerateSessions}
  531. {$ENDIF}
  532. //------------------------------------------------------------------------------
  533. function WTSEnumerateProcessesA(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  534.   var ppProcessInfo: PWTS_PROCESS_INFOA; var pCount: DWORD): BOOL; stdcall;
  535. {$EXTERNALSYM WTSEnumerateProcessesA}
  536. function WTSEnumerateProcessesW(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  537.   var ppProcessInfo: PWTS_PROCESS_INFOW; var pCount: DWORD): BOOL; stdcall;
  538. {$EXTERNALSYM WTSEnumerateProcessesW}
  539. {$IFDEF UNICODE}
  540. function WTSEnumerateProcesses(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  541.   var ppProcessInfo: PWTS_PROCESS_INFOW; var pCount: DWORD): BOOL; stdcall;
  542. {$EXTERNALSYM WTSEnumerateProcesses}
  543. {$ELSE}
  544. function WTSEnumerateProcesses(hServer: HANDLE; Reserved: DWORD; Version: DWORD;
  545.   var ppProcessInfo: PWTS_PROCESS_INFOA; var pCount: DWORD): BOOL; stdcall;
  546. {$EXTERNALSYM WTSEnumerateProcesses}
  547. {$ENDIF}
  548. //------------------------------------------------------------------------------
  549. function WTSTerminateProcess(hServer: HANDLE; ProcessId, ExitCode: DWORD): BOOL; stdcall;
  550. {$EXTERNALSYM WTSTerminateProcess}
  551. //------------------------------------------------------------------------------
  552. function WTSQuerySessionInformationA(hServer: HANDLE; SessionId: DWORD;
  553.   WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  554. {$EXTERNALSYM WTSQuerySessionInformationA}
  555. function WTSQuerySessionInformationW(hServer: HANDLE; SessionId: DWORD;
  556.   WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  557. {$EXTERNALSYM WTSQuerySessionInformationW}
  558. {$IFDEF UNICODE}
  559. function WTSQuerySessionInformation(hServer: HANDLE; SessionId: DWORD;
  560.   WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  561. {$EXTERNALSYM WTSQuerySessionInformation}
  562. {$ELSE}
  563. function WTSQuerySessionInformation(hServer: HANDLE; SessionId: DWORD;
  564.   WTSInfoClass: WTS_INFO_CLASS; var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  565. {$EXTERNALSYM WTSQuerySessionInformation}
  566. {$ENDIF}
  567. //------------------------------------------------------------------------------
  568. function WTSQueryUserConfigA(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  569.   var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  570. {$EXTERNALSYM WTSQueryUserConfigA}
  571. function WTSQueryUserConfigW(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  572.   var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  573. {$EXTERNALSYM WTSQueryUserConfigW}
  574. {$IFDEF UNICODE}
  575. function WTSQueryUserConfig(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  576.   var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  577. {$EXTERNALSYM WTSQueryUserConfig}
  578. {$ELSE}
  579. function WTSQueryUserConfig(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  580.   var ppBuffer: Pointer; var pBytesReturned: DWORD): BOOL; stdcall;
  581. {$EXTERNALSYM WTSQueryUserConfig}
  582. {$ENDIF}
  583. //------------------------------------------------------------------------------
  584. function WTSSetUserConfigA(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  585.   pBuffer: LPSTR; DataLength: DWORD): BOOL; stdcall;
  586. {$EXTERNALSYM WTSSetUserConfigA}
  587. function WTSSetUserConfigW(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  588.   pBuffer: LPWSTR; DataLength: DWORD): BOOL; stdcall;
  589. {$EXTERNALSYM WTSSetUserConfigW}
  590. {$IFDEF UNICODE}
  591. function WTSSetUserConfig(pServerName, pUserName: LPWSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  592.   pBuffer: LPWSTR; DataLength: DWORD): BOOL; stdcall;
  593. {$EXTERNALSYM WTSSetUserConfig}
  594. {$ELSE}
  595. function WTSSetUserConfig(pServerName, pUserName: LPSTR; WTSConfigClass: WTS_CONFIG_CLASS;
  596.   pBuffer: LPSTR; DataLength: DWORD): BOOL; stdcall;
  597. {$EXTERNALSYM WTSSetUserConfig}
  598. {$ENDIF}
  599. //------------------------------------------------------------------------------
  600. function WTSSendMessageA(hServer: HANDLE; SessionId: DWORD; pTitle: LPSTR;
  601.   TitleLength: DWORD; pMessage: LPSTR; MessageLength: DWORD; Style: DWORD;
  602.   Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall;
  603. {$EXTERNALSYM WTSSendMessageA}
  604. function WTSSendMessageW(hServer: HANDLE; SessionId: DWORD; pTitle: LPWSTR;
  605.   TitleLength: DWORD; pMessage: LPWSTR; MessageLength: DWORD; Style: DWORD;
  606.   Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall;
  607. {$EXTERNALSYM WTSSendMessageW}
  608. {$IFDEF UNICODE}
  609. function WTSSendMessage(hServer: HANDLE; SessionId: DWORD; pTitle: LPWSTR;
  610.   TitleLength: DWORD; pMessage: LPWSTR; MessageLength: DWORD; Style: DWORD;
  611.   Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall;
  612. {$EXTERNALSYM WTSSendMessage}
  613. {$ELSE}
  614. function WTSSendMessage(hServer: HANDLE; SessionId: DWORD; pTitle: LPSTR;
  615.   TitleLength: DWORD; pMessage: LPSTR; MessageLength: DWORD; Style: DWORD;
  616.   Timeout: DWORD; var pResponse: DWORD; bWait: BOOL): BOOL; stdcall;
  617. {$EXTERNALSYM WTSSendMessage}
  618. {$ENDIF}
  619. //------------------------------------------------------------------------------
  620. function WTSDisconnectSession(hServer: HANDLE; SessionId: DWORD; bWait: BOOL): BOOL; stdcall;
  621. {$EXTERNALSYM WTSDisconnectSession}
  622. //------------------------------------------------------------------------------
  623. function WTSLogoffSession(hServer: HANDLE; SessionId: DWORD; bWait: BOOL): BOOL; stdcall;
  624. {$EXTERNALSYM WTSLogoffSession}
  625. //------------------------------------------------------------------------------
  626. function WTSShutdownSystem(hServer: HANDLE; ShutdownFlag: DWORD): BOOL; stdcall;
  627. {$EXTERNALSYM WTSShutdownSystem}
  628. //------------------------------------------------------------------------------
  629. function WTSWaitSystemEvent(hServer: HANDLE; EventMask: DWORD;
  630.   var pEventFlags: DWORD): BOOL; stdcall;
  631. {$EXTERNALSYM WTSWaitSystemEvent}
  632. //------------------------------------------------------------------------------
  633. function WTSVirtualChannelOpen(hServer: HANDLE; SessionId: DWORD;
  634.   pVirtualName: LPSTR): HANDLE; stdcall;
  635. {$EXTERNALSYM WTSVirtualChannelOpen}
  636. function WTSVirtualChannelClose(hChannelHandle: HANDLE): BOOL; stdcall;
  637. {$EXTERNALSYM WTSVirtualChannelClose}
  638. function WTSVirtualChannelRead(hChannelHandle: HANDLE; TimeOut: ULONG;
  639.   Buffer: PCHAR; BufferSize: ULONG; var pBytesRead: ULONG): BOOL; stdcall;
  640. {$EXTERNALSYM WTSVirtualChannelRead}
  641. function WTSVirtualChannelWrite(hChannelHandle: HANDLE; Buffer: PCHAR;
  642.   Length: ULONG; var pBytesWritten: ULONG): BOOL; stdcall;
  643. {$EXTERNALSYM WTSVirtualChannelWrite}
  644. function WTSVirtualChannelPurgeInput(hChannelHandle: HANDLE): BOOL; stdcall;
  645. {$EXTERNALSYM WTSVirtualChannelPurgeInput}
  646. function WTSVirtualChannelPurgeOutput(hChannelHandle: HANDLE): BOOL; stdcall;
  647. {$EXTERNALSYM WTSVirtualChannelPurgeOutput}
  648. function WTSVirtualChannelQuery(hChannelHandle: HANDLE; VirtualClass: WTS_VIRTUAL_CLASS;
  649.   ppBuffer: PVOID; var pBytesReturned: DWORD): BOOL; stdcall;
  650. {$EXTERNALSYM WTSVirtualChannelQuery}
  651. //------------------------------------------------------------------------------
  652. procedure WTSFreeMemory(pMemory: PVOID); stdcall;
  653. {$EXTERNALSYM WTSFreeMemory}
  654. // Flags for Console Notification
  655. const
  656.   NOTIFY_FOR_ALL_SESSIONS = 1;
  657.   {$EXTERNALSYM NOTIFY_FOR_ALL_SESSIONS}
  658.   NOTIFY_FOR_THIS_SESSION = 0;
  659.   {$EXTERNALSYM NOTIFY_FOR_THIS_SESSION}
  660. function WTSRegisterSessionNotification(hWnd: HWND; dwFlags: DWORD): BOOL; stdcall;
  661. {$EXTERNALSYM WTSRegisterSessionNotification}
  662. function WTSUnRegisterSessionNotification(hWnd: HWND): BOOL; stdcall;
  663. {$EXTERNALSYM WTSUnRegisterSessionNotification}
  664. function WTSQueryUserToken(SessionId: ULONG; var phToken: HANDLE): BOOL; stdcall;
  665. {$EXTERNALSYM WTSQueryUserToken}
  666. implementation
  667. const
  668.   wtsapi = 'wtsapi32.dll';
  669. {$IFDEF DYNAMIC_LINK}
  670. var
  671.   _WTSEnumerateServersA: Pointer;
  672. function WTSEnumerateServersA;
  673. begin
  674.   GetProcedureAddress(_WTSEnumerateServersA, wtsapi, 'WTSEnumerateServersA');
  675.   asm
  676.     mov esp, ebp
  677.     pop ebp
  678.     jmp [_WTSEnumerateServersA]
  679.   end;
  680. end;
  681. {$ELSE}
  682. function WTSEnumerateServersA; external wtsapi name 'WTSEnumerateServersA';
  683. {$ENDIF DYNAMIC_LINK}
  684. {$IFDEF DYNAMIC_LINK}
  685. var
  686.   _WTSEnumerateServersW: Pointer;
  687. function WTSEnumerateServersW;
  688. begin
  689.   GetProcedureAddress(_WTSEnumerateServersW, wtsapi, 'WTSEnumerateServersW');
  690.   asm
  691.     mov esp, ebp
  692.     pop ebp
  693.     jmp [_WTSEnumerateServersW]
  694.   end;
  695. end;
  696. {$ELSE}
  697. function WTSEnumerateServersW; external wtsapi name 'WTSEnumerateServersW';
  698. {$ENDIF DYNAMIC_LINK}
  699. {$IFDEF UNICODE}
  700. {$IFDEF DYNAMIC_LINK}
  701. var
  702.   _WTSEnumerateServers: Pointer;
  703. function WTSEnumerateServers;
  704. begin
  705.   GetProcedureAddress(_WTSEnumerateServers, wtsapi, 'WTSEnumerateServersW');
  706.   asm
  707.     mov esp, ebp
  708.     pop ebp
  709.     jmp [_WTSEnumerateServers]
  710.   end;
  711. end;
  712. {$ELSE}
  713. function WTSEnumerateServers; external wtsapi name 'WTSEnumerateServersW';
  714. {$ENDIF DYNAMIC_LINK}
  715. {$ELSE}
  716. {$IFDEF DYNAMIC_LINK}
  717. var
  718.   _WTSEnumerateServers: Pointer;
  719. function WTSEnumerateServers;
  720. begin
  721.   GetProcedureAddress(_WTSEnumerateServers, wtsapi, 'WTSEnumerateServersA');
  722.   asm
  723.     mov esp, ebp
  724.     pop ebp
  725.     jmp [_WTSEnumerateServers]
  726.   end;
  727. end;
  728. {$ELSE}
  729. function WTSEnumerateServers; external wtsapi name 'WTSEnumerateServersA';
  730. {$ENDIF DYNAMIC_LINK}
  731. {$ENDIF}
  732. {$IFDEF DYNAMIC_LINK}
  733. var
  734.   _WTSOpenServerA: Pointer;
  735. function WTSOpenServerA;
  736. begin
  737.   GetProcedureAddress(_WTSOpenServerA, wtsapi, 'WTSOpenServerA');
  738.   asm
  739.     mov esp, ebp
  740.     pop ebp
  741.     jmp [_WTSOpenServerA]
  742.   end;
  743. end;
  744. {$ELSE}
  745. function WTSOpenServerA; external wtsapi name 'WTSOpenServerA';
  746. {$ENDIF DYNAMIC_LINK}
  747. {$IFDEF DYNAMIC_LINK}
  748. var
  749.   _WTSOpenServerW: Pointer;
  750. function WTSOpenServerW;
  751. begin
  752.   GetProcedureAddress(_WTSOpenServerW, wtsapi, 'WTSOpenServerW');
  753.   asm
  754.     mov esp, ebp
  755.     pop ebp
  756.     jmp [_WTSOpenServerW]
  757.   end;
  758. end;
  759. {$ELSE}
  760. function WTSOpenServerW; external wtsapi name 'WTSOpenServerW';
  761. {$ENDIF DYNAMIC_LINK}
  762. {$IFDEF UNICODE}
  763. {$IFDEF DYNAMIC_LINK}
  764. var
  765.   _WTSOpenServer: Pointer;
  766. function WTSOpenServer;
  767. begin
  768.   GetProcedureAddress(_WTSOpenServer, wtsapi, 'WTSOpenServerW');
  769.   asm
  770.     mov esp, ebp
  771.     pop ebp
  772.     jmp [_WTSOpenServer]
  773.   end;
  774. end;
  775. {$ELSE}
  776. function WTSOpenServer; external wtsapi name 'WTSOpenServerW';
  777. {$ENDIF DYNAMIC_LINK}
  778. {$ELSE}
  779. {$IFDEF DYNAMIC_LINK}
  780. var
  781.   _WTSOpenServer: Pointer;
  782. function WTSOpenServer;
  783. begin
  784.   GetProcedureAddress(_WTSOpenServer, wtsapi, 'WTSOpenServerA');
  785.   asm
  786.     mov esp, ebp
  787.     pop ebp
  788.     jmp [_WTSOpenServer]
  789.   end;
  790. end;
  791. {$ELSE}
  792. function WTSOpenServer; external wtsapi name 'WTSOpenServerA';
  793. {$ENDIF DYNAMIC_LINK}
  794. {$ENDIF}
  795. {$IFDEF DYNAMIC_LINK}
  796. var
  797.   _WTSCloseServer: Pointer;
  798. procedure WTSCloseServer;
  799. begin
  800.   GetProcedureAddress(_WTSCloseServer, wtsapi, 'WTSCloseServer');
  801.   asm
  802.     mov esp, ebp
  803.     pop ebp
  804.     jmp [_WTSCloseServer]
  805.   end;
  806. end;
  807. {$ELSE}
  808. procedure WTSCloseServer; external wtsapi name 'WTSCloseServer';
  809. {$ENDIF DYNAMIC_LINK}
  810. {$IFDEF DYNAMIC_LINK}
  811. var
  812.   _WTSEnumerateSessionsA: Pointer;
  813. function WTSEnumerateSessionsA;
  814. begin
  815.   GetProcedureAddress(_WTSEnumerateSessionsA, wtsapi, 'WTSEnumerateSessionsA');
  816.   asm
  817.     mov esp, ebp
  818.     pop ebp
  819.     jmp [_WTSEnumerateSessionsA]
  820.   end;
  821. end;
  822. {$ELSE}
  823. function WTSEnumerateSessionsA; external wtsapi name 'WTSEnumerateSessionsA';
  824. {$ENDIF DYNAMIC_LINK}
  825. {$IFDEF DYNAMIC_LINK}
  826. var
  827.   _WTSEnumerateSessionsW: Pointer;
  828. function WTSEnumerateSessionsW;
  829. begin
  830.   GetProcedureAddress(_WTSEnumerateSessionsW, wtsapi, 'WTSEnumerateSessionsW');
  831.   asm
  832.     mov esp, ebp
  833.     pop ebp
  834.     jmp [_WTSEnumerateSessionsW]
  835.   end;
  836. end;
  837. {$ELSE}
  838. function WTSEnumerateSessionsW; external wtsapi name 'WTSEnumerateSessionsW';
  839. {$ENDIF DYNAMIC_LINK}
  840. {$IFDEF UNICODE}
  841. {$IFDEF DYNAMIC_LINK}
  842. var
  843.   _WTSEnumerateSessions: Pointer;
  844. function WTSEnumerateSessions;
  845. begin
  846.   GetProcedureAddress(_WTSEnumerateSessions, wtsapi, 'WTSEnumerateSessionsW');
  847.   asm
  848.     mov esp, ebp
  849.     pop ebp
  850.     jmp [_WTSEnumerateSessions]
  851.   end;
  852. end;
  853. {$ELSE}
  854. function WTSEnumerateSessions; external wtsapi name 'WTSEnumerateSessionsW';
  855. {$ENDIF DYNAMIC_LINK}
  856. {$ELSE}
  857. {$IFDEF DYNAMIC_LINK}
  858. var
  859.   _WTSEnumerateSessions: Pointer;
  860. function WTSEnumerateSessions;
  861. begin
  862.   GetProcedureAddress(_WTSEnumerateSessions, wtsapi, 'WTSEnumerateSessionsA');
  863.   asm
  864.     mov esp, ebp
  865.     pop ebp
  866.     jmp [_WTSEnumerateSessions]
  867.   end;
  868. end;
  869. {$ELSE}
  870. function WTSEnumerateSessions; external wtsapi name 'WTSEnumerateSessionsA';
  871. {$ENDIF DYNAMIC_LINK}
  872. {$ENDIF}
  873. {$IFDEF DYNAMIC_LINK}
  874. var
  875.   _WTSEnumerateProcessesA: Pointer;
  876. function WTSEnumerateProcessesA;
  877. begin
  878.   GetProcedureAddress(_WTSEnumerateProcessesA, wtsapi, 'WTSEnumerateProcessesA');
  879.   asm
  880.     mov esp, ebp
  881.     pop ebp
  882.     jmp [_WTSEnumerateProcessesA]
  883.   end;
  884. end;
  885. {$ELSE}
  886. function WTSEnumerateProcessesA; external wtsapi name 'WTSEnumerateProcessesA';
  887. {$ENDIF DYNAMIC_LINK}
  888. {$IFDEF DYNAMIC_LINK}
  889. var
  890.   _WTSEnumerateProcessesW: Pointer;
  891. function WTSEnumerateProcessesW;
  892. begin
  893.   GetProcedureAddress(_WTSEnumerateProcessesW, wtsapi, 'WTSEnumerateProcessesW');
  894.   asm
  895.     mov esp, ebp
  896.     pop ebp
  897.     jmp [_WTSEnumerateProcessesW]
  898.   end;
  899. end;
  900. {$ELSE}
  901. function WTSEnumerateProcessesW; external wtsapi name 'WTSEnumerateProcessesW';
  902. {$ENDIF DYNAMIC_LINK}
  903. {$IFDEF UNICODE}
  904. {$IFDEF DYNAMIC_LINK}
  905. var
  906.   _WTSEnumerateProcesses: Pointer;
  907. function WTSEnumerateProcesses;
  908. begin
  909.   GetProcedureAddress(_WTSEnumerateProcesses, wtsapi, 'WTSEnumerateProcessesW');
  910.   asm
  911.     mov esp, ebp
  912.     pop ebp
  913.     jmp [_WTSEnumerateProcesses]
  914.   end;
  915. end;
  916. {$ELSE}
  917. function WTSEnumerateProcesses; external wtsapi name 'WTSEnumerateProcessesW';
  918. {$ENDIF DYNAMIC_LINK}
  919. {$ELSE}
  920. {$IFDEF DYNAMIC_LINK}
  921. var
  922.   _WTSEnumerateProcesses: Pointer;
  923. function WTSEnumerateProcesses;
  924. begin
  925.   GetProcedureAddress(_WTSEnumerateProcesses, wtsapi, 'WTSEnumerateProcessesA');
  926.   asm
  927.     mov esp, ebp
  928.     pop ebp
  929.     jmp [_WTSEnumerateProcesses]
  930.   end;
  931. end;
  932. {$ELSE}
  933. function WTSEnumerateProcesses; external wtsapi name 'WTSEnumerateProcessesA';
  934. {$ENDIF DYNAMIC_LINK}
  935. {$ENDIF}
  936. {$IFDEF DYNAMIC_LINK}
  937. var
  938.   _WTSTerminateProcess: Pointer;
  939. function WTSTerminateProcess;
  940. begin
  941.   GetProcedureAddress(_WTSTerminateProcess, wtsapi, 'WTSTerminateProcess');
  942.   asm
  943.     mov esp, ebp
  944.     pop ebp
  945.     jmp [_WTSTerminateProcess]
  946.   end;
  947. end;
  948. {$ELSE}
  949. function WTSTerminateProcess; external wtsapi name 'WTSTerminateProcess';
  950. {$ENDIF DYNAMIC_LINK}
  951. {$IFDEF DYNAMIC_LINK}
  952. var
  953.   _WTSQuerySessionInformationA: Pointer;
  954. function WTSQuerySessionInformationA;
  955. begin
  956.   GetProcedureAddress(_WTSQuerySessionInformationA, wtsapi, 'WTSQuerySessionInformationA');
  957.   asm
  958.     mov esp, ebp
  959.     pop ebp
  960.     jmp [_WTSQuerySessionInformationA]
  961.   end;
  962. end;
  963. {$ELSE}
  964. function WTSQuerySessionInformationA; external wtsapi name 'WTSQuerySessionInformationA';
  965. {$ENDIF DYNAMIC_LINK}
  966. {$IFDEF DYNAMIC_LINK}
  967. var
  968.   _WTSQuerySessionInformationW: Pointer;
  969. function WTSQuerySessionInformationW;
  970. begin
  971.   GetProcedureAddress(_WTSQuerySessionInformationW, wtsapi, 'WTSQuerySessionInformationW');
  972.   asm
  973.     mov esp, ebp
  974.     pop ebp
  975.     jmp [_WTSQuerySessionInformationW]
  976.   end;
  977. end;
  978. {$ELSE}
  979. function WTSQuerySessionInformationW; external wtsapi name 'WTSQuerySessionInformationW';
  980. {$ENDIF DYNAMIC_LINK}
  981. {$IFDEF UNICODE}
  982. {$IFDEF DYNAMIC_LINK}
  983. var
  984.   _WTSQuerySessionInformation: Pointer;
  985. function WTSQuerySessionInformation;
  986. begin
  987.   GetProcedureAddress(_WTSQuerySessionInformation, wtsapi, 'WTSQuerySessionInformationW');
  988.   asm
  989.     mov esp, ebp
  990.     pop ebp
  991.     jmp [_WTSQuerySessionInformation]
  992.   end;
  993. end;
  994. {$ELSE}
  995. function WTSQuerySessionInformation; external wtsapi name 'WTSQuerySessionInformationW';
  996. {$ENDIF DYNAMIC_LINK}
  997. {$ELSE}
  998. {$IFDEF DYNAMIC_LINK}
  999. var
  1000.   _WTSQuerySessionInformation: Pointer;
  1001. function WTSQuerySessionInformation;
  1002. begin
  1003.   GetProcedureAddress(_WTSQuerySessionInformation, wtsapi, 'WTSQuerySessionInformationA');
  1004.   asm
  1005.     mov esp, ebp
  1006.     pop ebp
  1007.     jmp [_WTSQuerySessionInformation]
  1008.   end;
  1009. end;
  1010. {$ELSE}
  1011. function WTSQuerySessionInformation; external wtsapi name 'WTSQuerySessionInformationA';
  1012. {$ENDIF DYNAMIC_LINK}
  1013. {$ENDIF}
  1014. {$IFDEF DYNAMIC_LINK}
  1015. var
  1016.   _WTSQueryUserConfigA: Pointer;
  1017. function WTSQueryUserConfigA;
  1018. begin
  1019.   GetProcedureAddress(_WTSQueryUserConfigA, wtsapi, 'WTSQueryUserConfigA');
  1020.   asm
  1021.     mov esp, ebp
  1022.     pop ebp
  1023.     jmp [_WTSQueryUserConfigA]
  1024.   end;
  1025. end;
  1026. {$ELSE}
  1027. function WTSQueryUserConfigA; external wtsapi name 'WTSQueryUserConfigA';
  1028. {$ENDIF DYNAMIC_LINK}
  1029. {$IFDEF DYNAMIC_LINK}
  1030. var
  1031.   _WTSQueryUserConfigW: Pointer;
  1032. function WTSQueryUserConfigW;
  1033. begin
  1034.   GetProcedureAddress(_WTSQueryUserConfigW, wtsapi, 'WTSQueryUserConfigW');
  1035.   asm
  1036.     mov esp, ebp
  1037.     pop ebp
  1038.     jmp [_WTSQueryUserConfigW]
  1039.   end;
  1040. end;
  1041. {$ELSE}
  1042. function WTSQueryUserConfigW; external wtsapi name 'WTSQueryUserConfigW';
  1043. {$ENDIF DYNAMIC_LINK}
  1044. {$IFDEF UNICODE}
  1045. {$IFDEF DYNAMIC_LINK}
  1046. var
  1047.   _WTSQueryUserConfig: Pointer;
  1048. function WTSQueryUserConfig;
  1049. begin
  1050.   GetProcedureAddress(_WTSQueryUserConfig, wtsapi, 'WTSQueryUserConfigW');
  1051.   asm
  1052.     mov esp, ebp
  1053.     pop ebp
  1054.     jmp [_WTSQueryUserConfig]
  1055.   end;
  1056. end;
  1057. {$ELSE}
  1058. function WTSQueryUserConfig; external wtsapi name 'WTSQueryUserConfigW';
  1059. {$ENDIF DYNAMIC_LINK}
  1060. {$ELSE}
  1061. {$IFDEF DYNAMIC_LINK}
  1062. var
  1063.   _WTSQueryUserConfig: Pointer;
  1064. function WTSQueryUserConfig;
  1065. begin
  1066.   GetProcedureAddress(_WTSQueryUserConfig, wtsapi, 'WTSQueryUserConfigA');
  1067.   asm
  1068.     mov esp, ebp
  1069.     pop ebp
  1070.     jmp [_WTSQueryUserConfig]
  1071.   end;
  1072. end;
  1073. {$ELSE}
  1074. function WTSQueryUserConfig; external wtsapi name 'WTSQueryUserConfigA';
  1075. {$ENDIF DYNAMIC_LINK}
  1076. {$ENDIF}
  1077. {$IFDEF DYNAMIC_LINK}
  1078. var
  1079.   _WTSSetUserConfigA: Pointer;
  1080. function WTSSetUserConfigA;
  1081. begin
  1082.   GetProcedureAddress(_WTSSetUserConfigA, wtsapi, 'WTSSetUserConfigA');
  1083.   asm
  1084.     mov esp, ebp
  1085.     pop ebp
  1086.     jmp [_WTSSetUserConfigA]
  1087.   end;
  1088. end;
  1089. {$ELSE}
  1090. function WTSSetUserConfigA; external wtsapi name 'WTSSetUserConfigA';
  1091. {$ENDIF DYNAMIC_LINK}
  1092. {$IFDEF DYNAMIC_LINK}
  1093. var
  1094.   _WTSSetUserConfigW: Pointer;
  1095. function WTSSetUserConfigW;
  1096. begin
  1097.   GetProcedureAddress(_WTSSetUserConfigW, wtsapi, 'WTSSetUserConfigW');
  1098.   asm
  1099.     mov esp, ebp
  1100.     pop ebp
  1101.     jmp [_WTSSetUserConfigW]
  1102.   end;
  1103. end;
  1104. {$ELSE}
  1105. function WTSSetUserConfigW; external wtsapi name 'WTSSetUserConfigW';
  1106. {$ENDIF DYNAMIC_LINK}
  1107. {$IFDEF UNICODE}
  1108. {$IFDEF DYNAMIC_LINK}
  1109. var
  1110.   _WTSSetUserConfig: Pointer;
  1111. function WTSSetUserConfig;
  1112. begin
  1113.   GetProcedureAddress(_WTSSetUserConfig, wtsapi, 'WTSSetUserConfigW');
  1114.   asm
  1115.     mov esp, ebp
  1116.     pop ebp
  1117.     jmp [_WTSSetUserConfig]
  1118.   end;
  1119. end;
  1120. {$ELSE}
  1121. function WTSSetUserConfig; external wtsapi name 'WTSSetUserConfigW';
  1122. {$ENDIF DYNAMIC_LINK}
  1123. {$ELSE}
  1124. {$IFDEF DYNAMIC_LINK}
  1125. var
  1126.   _WTSSetUserConfig: Pointer;
  1127. function WTSSetUserConfig;
  1128. begin
  1129.   GetProcedureAddress(_WTSSetUserConfig, wtsapi, 'WTSSetUserConfigA');
  1130.   asm
  1131.     mov esp, ebp
  1132.     pop ebp
  1133.     jmp [_WTSSetUserConfig]
  1134.   end;
  1135. end;
  1136. {$ELSE}
  1137. function WTSSetUserConfig; external wtsapi name 'WTSSetUserConfigA';
  1138. {$ENDIF DYNAMIC_LINK}
  1139. {$ENDIF}
  1140. {$IFDEF DYNAMIC_LINK}
  1141. var
  1142.   _WTSSendMessageA: Pointer;
  1143. function WTSSendMessageA;
  1144. begin
  1145.   GetProcedureAddress(_WTSSendMessageA, wtsapi, 'WTSSendMessageA');
  1146.   asm
  1147.     mov esp, ebp
  1148.     pop ebp
  1149.     jmp [_WTSSendMessageA]
  1150.   end;
  1151. end;
  1152. {$ELSE}
  1153. function WTSSendMessageA; external wtsapi name 'WTSSendMessageA';
  1154. {$ENDIF DYNAMIC_LINK}
  1155. {$IFDEF DYNAMIC_LINK}
  1156. var
  1157.   _WTSSendMessageW: Pointer;
  1158. function WTSSendMessageW;
  1159. begin
  1160.   GetProcedureAddress(_WTSSendMessageW, wtsapi, 'WTSSendMessageW');
  1161.   asm
  1162.     mov esp, ebp
  1163.     pop ebp
  1164.     jmp [_WTSSendMessageW]
  1165.   end;
  1166. end;
  1167. {$ELSE}
  1168. function WTSSendMessageW; external wtsapi name 'WTSSendMessageW';
  1169. {$ENDIF DYNAMIC_LINK}
  1170. {$IFDEF UNICODE}
  1171. {$IFDEF DYNAMIC_LINK}
  1172. var
  1173.   _WTSSendMessage: Pointer;
  1174. function WTSSendMessage;
  1175. begin
  1176.   GetProcedureAddress(_WTSSendMessage, wtsapi, 'WTSSendMessageW');
  1177.   asm
  1178.     mov esp, ebp
  1179.     pop ebp
  1180.     jmp [_WTSSendMessage]
  1181.   end;
  1182. end;
  1183. {$ELSE}
  1184. function WTSSendMessage; external wtsapi name 'WTSSendMessageW';
  1185. {$ENDIF DYNAMIC_LINK}
  1186. {$ELSE}
  1187. {$IFDEF DYNAMIC_LINK}
  1188. var
  1189.   _WTSSendMessage: Pointer;
  1190. function WTSSendMessage;
  1191. begin
  1192.   GetProcedureAddress(_WTSSendMessage, wtsapi, 'WTSSendMessageA');
  1193.   asm
  1194.     mov esp, ebp
  1195.     pop ebp
  1196.     jmp [_WTSSendMessage]
  1197.   end;
  1198. end;
  1199. {$ELSE}
  1200. function WTSSendMessage; external wtsapi name 'WTSSendMessageA';
  1201. {$ENDIF DYNAMIC_LINK}
  1202. {$ENDIF}
  1203. {$IFDEF DYNAMIC_LINK}
  1204. var
  1205.   _WTSDisconnectSession: Pointer;
  1206. function WTSDisconnectSession;
  1207. begin
  1208.   GetProcedureAddress(_WTSDisconnectSession, wtsapi, 'WTSDisconnectSession');
  1209.   asm
  1210.     mov esp, ebp
  1211.     pop ebp
  1212.     jmp [_WTSDisconnectSession]
  1213.   end;
  1214. end;
  1215. {$ELSE}
  1216. function WTSDisconnectSession; external wtsapi name 'WTSDisconnectSession';
  1217. {$ENDIF DYNAMIC_LINK}
  1218. {$IFDEF DYNAMIC_LINK}
  1219. var
  1220.   _WTSLogoffSession: Pointer;
  1221. function WTSLogoffSession;
  1222. begin
  1223.   GetProcedureAddress(_WTSLogoffSession, wtsapi, 'WTSLogoffSession');
  1224.   asm
  1225.     mov esp, ebp
  1226.     pop ebp
  1227.     jmp [_WTSLogoffSession]
  1228.   end;
  1229. end;
  1230. {$ELSE}
  1231. function WTSLogoffSession; external wtsapi name 'WTSLogoffSession';
  1232. {$ENDIF DYNAMIC_LINK}
  1233. {$IFDEF DYNAMIC_LINK}
  1234. var
  1235.   _WTSShutdownSystem: Pointer;
  1236. function WTSShutdownSystem;
  1237. begin
  1238.   GetProcedureAddress(_WTSShutdownSystem, wtsapi, 'WTSShutdownSystem');
  1239.   asm
  1240.     mov esp, ebp
  1241.     pop ebp
  1242.     jmp [_WTSShutdownSystem]
  1243.   end;
  1244. end;
  1245. {$ELSE}
  1246. function WTSShutdownSystem; external wtsapi name 'WTSShutdownSystem';
  1247. {$ENDIF DYNAMIC_LINK}
  1248. {$IFDEF DYNAMIC_LINK}
  1249. var
  1250.   _WTSWaitSystemEvent: Pointer;
  1251. function WTSWaitSystemEvent;
  1252. begin
  1253.   GetProcedureAddress(_WTSWaitSystemEvent, wtsapi, 'WTSWaitSystemEvent');
  1254.   asm
  1255.     mov esp, ebp
  1256.     pop ebp
  1257.     jmp [_WTSWaitSystemEvent]
  1258.   end;
  1259. end;
  1260. {$ELSE}
  1261. function WTSWaitSystemEvent; external wtsapi name 'WTSWaitSystemEvent';
  1262. {$ENDIF DYNAMIC_LINK}
  1263. {$IFDEF DYNAMIC_LINK}
  1264. var
  1265.   _WTSVirtualChannelOpen: Pointer;
  1266. function WTSVirtualChannelOpen;
  1267. begin
  1268.   GetProcedureAddress(_WTSVirtualChannelOpen, wtsapi, 'WTSVirtualChannelOpen');
  1269.   asm
  1270.     mov esp, ebp
  1271.     pop ebp
  1272.     jmp [_WTSVirtualChannelOpen]
  1273.   end;
  1274. end;
  1275. {$ELSE}
  1276. function WTSVirtualChannelOpen; external wtsapi name 'WTSVirtualChannelOpen';
  1277. {$ENDIF DYNAMIC_LINK}
  1278. {$IFDEF DYNAMIC_LINK}
  1279. var
  1280.   _WTSVirtualChannelClose: Pointer;
  1281. function WTSVirtualChannelClose;
  1282. begin
  1283.   GetProcedureAddress(_WTSVirtualChannelClose, wtsapi, 'WTSVirtualChannelClose');
  1284.   asm
  1285.     mov esp, ebp
  1286.     pop ebp
  1287.     jmp [_WTSVirtualChannelClose]
  1288.   end;
  1289. end;
  1290. {$ELSE}
  1291. function WTSVirtualChannelClose; external wtsapi name 'WTSVirtualChannelClose';
  1292. {$ENDIF DYNAMIC_LINK}
  1293. {$IFDEF DYNAMIC_LINK}
  1294. var
  1295.   _WTSVirtualChannelRead: Pointer;
  1296. function WTSVirtualChannelRead;
  1297. begin
  1298.   GetProcedureAddress(_WTSVirtualChannelRead, wtsapi, 'WTSVirtualChannelRead');
  1299.   asm
  1300.     mov esp, ebp
  1301.     pop ebp
  1302.     jmp [_WTSVirtualChannelRead]
  1303.   end;
  1304. end;
  1305. {$ELSE}
  1306. function WTSVirtualChannelRead; external wtsapi name 'WTSVirtualChannelRead';
  1307. {$ENDIF DYNAMIC_LINK}
  1308. {$IFDEF DYNAMIC_LINK}
  1309. var
  1310.   _WTSVirtualChannelWrite: Pointer;
  1311. function WTSVirtualChannelWrite;
  1312. begin
  1313.   GetProcedureAddress(_WTSVirtualChannelWrite, wtsapi, 'WTSVirtualChannelWrite');
  1314.   asm
  1315.     mov esp, ebp
  1316.     pop ebp
  1317.     jmp [_WTSVirtualChannelWrite]
  1318.   end;
  1319. end;
  1320. {$ELSE}
  1321. function WTSVirtualChannelWrite; external wtsapi name 'WTSVirtualChannelWrite';
  1322. {$ENDIF DYNAMIC_LINK}
  1323. {$IFDEF DYNAMIC_LINK}
  1324. var
  1325.   _WTSVirtualChannelPurgeInput: Pointer;
  1326. function WTSVirtualChannelPurgeInput;
  1327. begin
  1328.   GetProcedureAddress(_WTSVirtualChannelPurgeInput, wtsapi, 'WTSVirtualChannelPurgeInput');
  1329.   asm
  1330.     mov esp, ebp
  1331.     pop ebp
  1332.     jmp [_WTSVirtualChannelPurgeInput]
  1333.   end;
  1334. end;
  1335. {$ELSE}
  1336. function WTSVirtualChannelPurgeInput; external wtsapi name 'WTSVirtualChannelPurgeInput';
  1337. {$ENDIF DYNAMIC_LINK}
  1338. {$IFDEF DYNAMIC_LINK}
  1339. var
  1340.   _WTSVirtualChannelPurgeOutput: Pointer;
  1341. function WTSVirtualChannelPurgeOutput;
  1342. begin
  1343.   GetProcedureAddress(_WTSVirtualChannelPurgeOutput, wtsapi, 'WTSVirtualChannelPurgeOutput');
  1344.   asm
  1345.     mov esp, ebp
  1346.     pop ebp
  1347.     jmp [_WTSVirtualChannelPurgeOutput]
  1348.   end;
  1349. end;
  1350. {$ELSE}
  1351. function WTSVirtualChannelPurgeOutput; external wtsapi name 'WTSVirtualChannelPurgeOutput';
  1352. {$ENDIF DYNAMIC_LINK}
  1353. {$IFDEF DYNAMIC_LINK}
  1354. var
  1355.   _WTSVirtualChannelQuery: Pointer;
  1356. function WTSVirtualChannelQuery;
  1357. begin
  1358.   GetProcedureAddress(_WTSVirtualChannelQuery, wtsapi, 'WTSVirtualChannelQuery');
  1359.   asm
  1360.     mov esp, ebp
  1361.     pop ebp
  1362.     jmp [_WTSVirtualChannelQuery]
  1363.   end;
  1364. end;
  1365. {$ELSE}
  1366. function WTSVirtualChannelQuery; external wtsapi name 'WTSVirtualChannelQuery';
  1367. {$ENDIF DYNAMIC_LINK}
  1368. {$IFDEF DYNAMIC_LINK}
  1369. var
  1370.   _WTSFreeMemory: Pointer;
  1371. procedure WTSFreeMemory;
  1372. begin
  1373.   GetProcedureAddress(_WTSFreeMemory, wtsapi, 'WTSFreeMemory');
  1374.   asm
  1375.     mov esp, ebp
  1376.     pop ebp
  1377.     jmp [_WTSFreeMemory]
  1378.   end;
  1379. end;
  1380. {$ELSE}
  1381. procedure WTSFreeMemory; external wtsapi name 'WTSFreeMemory';
  1382. {$ENDIF DYNAMIC_LINK}
  1383. {$IFDEF DYNAMIC_LINK}
  1384. var
  1385.   _WTSRegisterSessionNotification: Pointer;
  1386. function WTSRegisterSessionNotification;
  1387. begin
  1388.   GetProcedureAddress(_WTSRegisterSessionNotification, wtsapi, 'WTSRegisterSessionNotification');
  1389.   asm
  1390.     mov esp, ebp
  1391.     pop ebp
  1392.     jmp [_WTSRegisterSessionNotification]
  1393.   end;
  1394. end;
  1395. {$ELSE}
  1396. function WTSRegisterSessionNotification; external wtsapi name 'WTSRegisterSessionNotification';
  1397. {$ENDIF DYNAMIC_LINK}
  1398. {$IFDEF DYNAMIC_LINK}
  1399. var
  1400.   _WTSUnRegisterSessionNot: Pointer;
  1401. function WTSUnRegisterSessionNotification;
  1402. begin
  1403.   GetProcedureAddress(_WTSUnRegisterSessionNot, wtsapi, 'WTSUnRegisterSessionNotification');
  1404.   asm
  1405.     mov esp, ebp
  1406.     pop ebp
  1407.     jmp [_WTSUnRegisterSessionNot]
  1408.   end;
  1409. end;
  1410. {$ELSE}
  1411. function WTSUnRegisterSessionNotification; external wtsapi name 'WTSUnRegisterSessionNotification';
  1412. {$ENDIF DYNAMIC_LINK}
  1413. {$IFDEF DYNAMIC_LINK}
  1414. var
  1415.   _WTSQueryUserToken: Pointer;
  1416. function WTSQueryUserToken;
  1417. begin
  1418.   GetProcedureAddress(_WTSQueryUserToken, wtsapi, 'WTSQueryUserToken');
  1419.   asm
  1420.     mov esp, ebp
  1421.     pop ebp
  1422.     jmp [_WTSQueryUserToken]
  1423.   end;
  1424. end;
  1425. {$ELSE}
  1426. function WTSQueryUserToken; external wtsapi name 'WTSQueryUserToken';
  1427. {$ENDIF DYNAMIC_LINK}
  1428. end.