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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { WinLogon 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: winwlx.h, released June 2000. The original Pascal      }
  9. { code is: WinWlx.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 JwaWinWlx;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "WinWlx.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType, JwaWinUser, JwaWinNT;
  52. //    WLX == WinLogon eXtension
  53. //
  54. //    This file contains definitions, data types, and routine prototypes
  55. //    necessary to produce a replacement Graphical Identification aNd
  56. //    Authentication (GINA) DLL for Winlogon.
  57. /////////////////////////////////////////////////////////////////////////
  58. /////////////////////////////////////////////////////////////////////////
  59. //
  60. // Revisions of Winlogon API available for use by GINAs
  61. // Version is two parts: Major revision and minor revision.
  62. // Major revision is the upper 16-bits, minor is the lower
  63. // 16-bits.
  64. //
  65. const
  66.   WLX_VERSION_1_0     = ($00010000);
  67.   {$EXTERNALSYM WLX_VERSION_1_0}
  68.   WLX_VERSION_1_1     = ($00010001);
  69.   {$EXTERNALSYM WLX_VERSION_1_1}
  70.   WLX_VERSION_1_2     = ($00010002);
  71.   {$EXTERNALSYM WLX_VERSION_1_2}
  72.   WLX_VERSION_1_3     = ($00010003);
  73.   {$EXTERNALSYM WLX_VERSION_1_3}
  74.   WLX_VERSION_1_4     = ($00010004);
  75.   {$EXTERNALSYM WLX_VERSION_1_4}
  76.   WLX_CURRENT_VERSION = (WLX_VERSION_1_4);
  77.   {$EXTERNALSYM WLX_CURRENT_VERSION}
  78. /////////////////////////////////////////////////////////////////////////
  79. /////////////////////////////////////////////////////////////////////////
  80. //
  81. // Secure attention sequence types
  82. // These values are passed to routines that have a dwSasType
  83. // parameter.
  84. //
  85. //  ALL VALUES FROM 0 TO 127 ARE RESERVED FOR MICROSOFT DEFINITION.
  86. //  VALUES ABOVE 127 ARE RESERVED FOR CUSTOMER DEFINITION.
  87. //
  88. //      CTRL_ALT_DEL - used to indicate that the standard ctrl-alt-del
  89. //          secure attention sequence has been entered.
  90. //
  91. //      SCRNSVR_TIMEOUT - used to indicate that keyboard/mouse inactivity
  92. //          has lead to a screensaver activation.  It is up to the GINA
  93. //          DLL whether this constitutes a workstation locking event.
  94. //
  95. //      SCRNSVR_ACTIVITY - used to indicate that keyboard or mouse
  96. //          activity occured while a secure screensaver was active.
  97. //
  98. //      SC_INSERT - used to indicate that a smart card has been inserted
  99. //          to a compatible device
  100. //
  101. //      SC_REMOVE - used to indicate that a smart card has been removed
  102. //          from a compatible device
  103. //
  104.   WLX_SAS_TYPE_TIMEOUT          = (0);
  105.   {$EXTERNALSYM WLX_SAS_TYPE_TIMEOUT}
  106.   WLX_SAS_TYPE_CTRL_ALT_DEL     = (1);
  107.   {$EXTERNALSYM WLX_SAS_TYPE_CTRL_ALT_DEL}
  108.   WLX_SAS_TYPE_SCRNSVR_TIMEOUT  = (2);
  109.   {$EXTERNALSYM WLX_SAS_TYPE_SCRNSVR_TIMEOUT}
  110.   WLX_SAS_TYPE_SCRNSVR_ACTIVITY = (3);
  111.   {$EXTERNALSYM WLX_SAS_TYPE_SCRNSVR_ACTIVITY}
  112.   WLX_SAS_TYPE_USER_LOGOFF      = (4);
  113.   {$EXTERNALSYM WLX_SAS_TYPE_USER_LOGOFF}
  114.   WLX_SAS_TYPE_SC_INSERT        = (5);
  115.   {$EXTERNALSYM WLX_SAS_TYPE_SC_INSERT}
  116.   WLX_SAS_TYPE_SC_REMOVE        = (6);
  117.   {$EXTERNALSYM WLX_SAS_TYPE_SC_REMOVE}
  118.   WLX_SAS_TYPE_AUTHENTICATED    = (7);
  119.   {$EXTERNALSYM WLX_SAS_TYPE_AUTHENTICATED}
  120.   WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED = (8);
  121.   {$EXTERNALSYM WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED}
  122.   WLX_SAS_TYPE_SC_LAST_READER_REMOVED  = (9);
  123.   {$EXTERNALSYM WLX_SAS_TYPE_SC_LAST_READER_REMOVED}
  124.   WLX_SAS_TYPE_SWITCHUSER       = (10);
  125.   {$EXTERNALSYM WLX_SAS_TYPE_SWITCHUSER}
  126.   WLX_SAS_TYPE_MAX_MSFT_VALUE   = (127);
  127.   {$EXTERNALSYM WLX_SAS_TYPE_MAX_MSFT_VALUE}
  128. //
  129. // This structure is available through WlxGetOption, and is
  130. // passed as the lParam for any S/C SAS notices sent to windows
  131. //
  132. type
  133.   PWLX_SC_NOTIFICATION_INFO = ^WLX_SC_NOTIFICATION_INFO;
  134.   {$EXTERNALSYM PWLX_SC_NOTIFICATION_INFO}
  135.   _WLX_SC_NOTIFICATION_INFO = record
  136.     pszCard: PWSTR;
  137.     pszReader: PWSTR;
  138.     pszContainer: PWSTR;
  139.     pszCryptoProvider: PWSTR;
  140.   end;
  141.   {$EXTERNALSYM _WLX_SC_NOTIFICATION_INFO}
  142.   WLX_SC_NOTIFICATION_INFO = _WLX_SC_NOTIFICATION_INFO;
  143.   {$EXTERNALSYM WLX_SC_NOTIFICATION_INFO}
  144.   TWlxScNotificationInfo = WLX_SC_NOTIFICATION_INFO;
  145.   PWlxScNotificationInfo = PWLX_SC_NOTIFICATION_INFO;
  146. /////////////////////////////////////////////////////////////////////////
  147. /////////////////////////////////////////////////////////////////////////
  148. //
  149. // Upon successful logon, the GINA DLL may specify any of the following
  150. // options to Winlogon (via the dwOptions parameter of the WlxLoggedOutSas()
  151. // api).  When set, these options specify:
  152. //
  153. //      NO_PROFILE - Winlogon must NOT load a profile for the logged
  154. //                   on user.  Either the GINA DLL will take care of
  155. //                   this activity, or the user does not need a profile.
  156. //
  157. const
  158.   WLX_LOGON_OPT_NO_PROFILE = ($00000001);
  159.   {$EXTERNALSYM WLX_LOGON_OPT_NO_PROFILE}
  160. /////////////////////////////////////////////////////////////////////////
  161. /////////////////////////////////////////////////////////////////////////
  162. //
  163. // GINA DLLs are expected to return account information to Winlogon
  164. // following a successful logon.  This information allows Winlogon
  165. // to support profile loading and supplemental network providers.
  166. //
  167. // To allow different sets of profile information to be returned
  168. // by GINAs over time, the first DWORD of each profile structure
  169. // is expected to contain a type-identifier.  The following constants
  170. // are the defined profile type identifiers.
  171. //
  172. //
  173. // Standard profile is V2_0
  174. //
  175.   WLX_PROFILE_TYPE_V1_0 = (1);
  176.   {$EXTERNALSYM WLX_PROFILE_TYPE_V1_0}
  177.   WLX_PROFILE_TYPE_V2_0 = (2);
  178.   {$EXTERNALSYM WLX_PROFILE_TYPE_V2_0}
  179. /////////////////////////////////////////////////////////////////////////
  180. /////////////////////////////////////////////////////////////////////////
  181. //
  182. // WlxLoggedOnSas() and WlxWkstaLockedSas() return an action
  183. // value to Winlogon directing Winlogon to either remain unchanged
  184. // or to perform some action (such as force-log the user off).
  185. // These are the values that may be returned.  Note, however, that
  186. // not all of the values may be returned by both of these api.  See
  187. // the description of each api to see which values are expected from
  188. // each.
  189. //
  190. //  LOGON              - User has logged on
  191. //  NONE               - Don't change the state of the window station.
  192. //  LOCK_WKSTA         - Lock the workstation, wait for next SAS.
  193. //  LOGOFF             - Log the user off of the workstation.
  194. //  SHUTDOWN           - Log the user off and shutdown the machine.
  195. //  PWD_CHANGED        - Indicates that the user changed their password.  Notify network providers.
  196. //  TASKLIST           - Invoke the task list.
  197. //  UNLOCK_WKSTA       - Unlock the workstation.
  198. //  FORCE_LOGOFF       - Forcibly log the user off.
  199. //  SHUTDOWN_POWER_OFF - Turn off machine after shutting down.
  200. //  SHUTDOWN_REBOOT    - Reboot machine after shutting down.
  201. //  SHUTDOWN_SLEEP     - Put the machine to sleep
  202. //  SHUTDOWN_SLEEP2    - Put the machine to sleep and disable wakeup events
  203. //  SHUTDOWN_HIBERNATE - Hibernate the machine
  204. //  RECONNECTED        - Session was reconnected to an earlier session
  205. //
  206.   WLX_SAS_ACTION_LOGON                = (1);
  207.   {$EXTERNALSYM WLX_SAS_ACTION_LOGON}
  208.   WLX_SAS_ACTION_NONE                 = (2);
  209.   {$EXTERNALSYM WLX_SAS_ACTION_NONE}
  210.   WLX_SAS_ACTION_LOCK_WKSTA           = (3);
  211.   {$EXTERNALSYM WLX_SAS_ACTION_LOCK_WKSTA}
  212.   WLX_SAS_ACTION_LOGOFF               = (4);
  213.   {$EXTERNALSYM WLX_SAS_ACTION_LOGOFF}
  214.   WLX_SAS_ACTION_SHUTDOWN             = (5);
  215.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN}
  216.   WLX_SAS_ACTION_PWD_CHANGED          = (6);
  217.   {$EXTERNALSYM WLX_SAS_ACTION_PWD_CHANGED}
  218.   WLX_SAS_ACTION_TASKLIST             = (7);
  219.   {$EXTERNALSYM WLX_SAS_ACTION_TASKLIST}
  220.   WLX_SAS_ACTION_UNLOCK_WKSTA         = (8);
  221.   {$EXTERNALSYM WLX_SAS_ACTION_UNLOCK_WKSTA}
  222.   WLX_SAS_ACTION_FORCE_LOGOFF         = (9);
  223.   {$EXTERNALSYM WLX_SAS_ACTION_FORCE_LOGOFF}
  224.   WLX_SAS_ACTION_SHUTDOWN_POWER_OFF   = (10);
  225.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN_POWER_OFF}
  226.   WLX_SAS_ACTION_SHUTDOWN_REBOOT      = (11);
  227.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN_REBOOT}
  228.   WLX_SAS_ACTION_SHUTDOWN_SLEEP       = (12);
  229.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN_SLEEP}
  230.   WLX_SAS_ACTION_SHUTDOWN_SLEEP2      = (13);
  231.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN_SLEEP2}
  232.   WLX_SAS_ACTION_SHUTDOWN_HIBERNATE   = (14);
  233.   {$EXTERNALSYM WLX_SAS_ACTION_SHUTDOWN_HIBERNATE}
  234.   WLX_SAS_ACTION_RECONNECTED          = (15);
  235.   {$EXTERNALSYM WLX_SAS_ACTION_RECONNECTED}
  236.   WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF = (16);
  237.   {$EXTERNALSYM WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF}
  238.   WLX_SAS_ACTION_SWITCH_CONSOLE       = (17);
  239.   {$EXTERNALSYM WLX_SAS_ACTION_SWITCH_CONSOLE}
  240. ////////////////////////////////////////////////////////////////////////
  241. //                                                                    //
  242. //  Window Messages                                                   //
  243. //                                                                    //
  244. ////////////////////////////////////////////////////////////////////////
  245. //
  246. // The WM_SAS is defined as follows
  247. //
  248. //  The wParam parameter has the SAS Type (above)
  249.   WLX_WM_SAS = (WM_USER + 601);
  250.   {$EXTERNALSYM WLX_WM_SAS}
  251. //
  252. // Dialog return values
  253. //
  254. // These may be returned by dialogs started by a GINA dll.
  255. //
  256.   WLX_DLG_SAS                  = 101;
  257.   {$EXTERNALSYM WLX_DLG_SAS}
  258.   WLX_DLG_INPUT_TIMEOUT        = 102; // Input (keys, etc) timed out
  259.   {$EXTERNALSYM WLX_DLG_INPUT_TIMEOUT}
  260.   WLX_DLG_SCREEN_SAVER_TIMEOUT = 103; // Screen Saver activated
  261.   {$EXTERNALSYM WLX_DLG_SCREEN_SAVER_TIMEOUT}
  262.   WLX_DLG_USER_LOGOFF          = 104; // User logged off
  263.   {$EXTERNALSYM WLX_DLG_USER_LOGOFF}
  264. /////////////////////////////////////////////////////////////////////////
  265. /////////////////////////////////////////////////////////////////////////
  266. //
  267. // The WLX_PROFILE_* structure is returned from a GINA DLL
  268. // following authentication.  This information is used by Winlogon
  269. // to support supplemental Network Providers and to load the
  270. // newly logged-on user's profile.
  271. //
  272. // Winlogon is responsible for freeing both the profile structure
  273. // and the fields within the structure that are marked as separately
  274. // deallocatable.
  275. //
  276. type
  277.   PWLX_PROFILE_V1_0 = ^WLX_PROFILE_V1_0;
  278.   {$EXTERNALSYM PWLX_PROFILE_V1_0}
  279.   _WLX_PROFILE_V1_0 = record
  280.     //
  281.     // This field identifies the type of profile being returned by a
  282.     // GINA DLL.  Profile types are defined with the prefix
  283.     // WLX_PROFILE_TYPE_xxx.  It allows Winlogon to typecast the
  284.     // structure so the remainder of the structure may be referenced.
  285.     //
  286.     dwType: DWORD;
  287.     //
  288.     // pathname of profile to load for user.
  289.     //
  290.     // The buffer pointed to by this field must be separately allocated.
  291.     // Winlogon will free the buffer when it is no longer needed.
  292.     //
  293.     //
  294.     pszProfile: PWSTR;
  295.   end;
  296.   {$EXTERNALSYM _WLX_PROFILE_V1_0}
  297.   WLX_PROFILE_V1_0 = _WLX_PROFILE_V1_0;
  298.   {$EXTERNALSYM WLX_PROFILE_V1_0}
  299.   TWlxProfileV1_0 = WLX_PROFILE_V1_0;
  300.   PWlxProfileV1_0 = PWLX_PROFILE_V1_0;
  301.   PWLX_PROFILE_V2_0 = ^WLX_PROFILE_V2_0;
  302.   {$EXTERNALSYM PWLX_PROFILE_V2_0}
  303.   _WLX_PROFILE_V2_0 = record
  304.     //
  305.     // This field identifies the type of profile being returned by a
  306.     // GINA DLL.  Profile types are defined with the prefix
  307.     // WLX_PROFILE_TYPE_xxx.  It allows Winlogon to typecast the
  308.     // structure so the remainder of the structure may be referenced.
  309.     //
  310.     dwType: DWORD;
  311.     //
  312.     // pathname of profile to load for user.
  313.     //
  314.     // This parameter can be NULL.  If so, the user has a local
  315.     // profile only.
  316.     //
  317.     // The buffer pointed to by this field must be separately allocated.
  318.     // Winlogon will free the buffer when it is no longer needed.
  319.     //
  320.     //
  321.     pszProfile: PWSTR;
  322.     //
  323.     // pathname of policy to load for user.
  324.     //
  325.     // This parameter can be NULL which prevents network wide policy
  326.     // from being applied.
  327.     //
  328.     // The buffer pointed to by this field must be separately allocated.
  329.     // Winlogon will free the buffer when it is no longer needed.
  330.     //
  331.     //
  332.     pszPolicy: PWSTR;
  333.     //
  334.     // pathname of network default user profile
  335.     //
  336.     // This parameter can be NULL, which causes the Default User
  337.     // profile on the local machine to be used.
  338.     //
  339.     // The buffer pointed to by this field must be separately allocated.
  340.     // Winlogon will free the buffer when it is no longer needed.
  341.     //
  342.     //
  343.     pszNetworkDefaultUserProfile: PWSTR;
  344.     //
  345.     // name of the server which validated the user account
  346.     //
  347.     // This is used to enumerate globals groups the user belongs
  348.     // to for policy support.  This parameter can be NULL.
  349.     //
  350.     // The buffer pointed to by this field must be separately allocated.
  351.     // Winlogon will free the buffer when it is no longer needed.
  352.     //
  353.     //
  354.     pszServerName: PWSTR;
  355.     //
  356.     // pointer to a series of null terminated environment variables
  357.     //
  358.     // envname=environment variable value
  359.     //   - or -
  360.     // envname=%OtherVar%more text
  361.     //
  362.     // Each environment variable is NULL terminated with the last
  363.     // environment variable double NULL terminated.  These variables
  364.     // are set into the user's initial environment.  The environment
  365.     // variable value can contain other environment variables wrapped
  366.     // in "%" signs. This parameter can be NULL.
  367.     //
  368.     // The buffer pointed to by this field must be separately allocated.
  369.     // Winlogon will free the buffer when it is no longer needed.
  370.     //
  371.     //
  372.     pszEnvironment: PWSTR;
  373.   end;
  374.   {$EXTERNALSYM _WLX_PROFILE_V2_0}
  375.   WLX_PROFILE_V2_0 = _WLX_PROFILE_V2_0;
  376.   {$EXTERNALSYM WLX_PROFILE_V2_0}
  377.   TWlxProfileV2_0 = WLX_PROFILE_V2_0;
  378.   PWlxProfileV2_0 = PWLX_PROFILE_V2_0;
  379. /////////////////////////////////////////////////////////////////////////
  380. /////////////////////////////////////////////////////////////////////////
  381. //
  382. // The WLX_NPR_NOTIFICATION_INFO structure is returned
  383. // from a GINA DLL following successful authentication.
  384. // This information is used by Winlogon to provide
  385. // identification and authentication information already
  386. // collected to network providers.  Winlogon is
  387. // responsible for freeing both the main structure and all
  388. // string and other buffers pointed to from within the
  389. // structure.
  390. //
  391.   PWLX_MPR_NOTIFY_INFO = ^WLX_MPR_NOTIFY_INFO;
  392.   {$EXTERNALSYM PWLX_MPR_NOTIFY_INFO}
  393.   _WLX_MPR_NOTIFY_INFO = record
  394.     //
  395.     // The name of the account logged onto (e.g. REDMONDJoe).
  396.     // The string pointed to by this field must be separately
  397.     // allocated and will be separately deallocated by Winlogon.
  398.     //
  399.     pszUserName: PWSTR;
  400.     //
  401.     // The string pointed to by this field must be separately
  402.     // allocated and will be separately deallocated by Winlogon.
  403.     //
  404.     pszDomain: PWSTR;
  405.     //
  406.     // Cleartext password of the user account.  If the OldPassword
  407.     // field is non-null, then this field contains the new password
  408.     // in a password change operation.  The string pointed to by
  409.     // this field must be separately allocated and will be seperately
  410.     // deallocated by Winlogon.
  411.     //
  412.     pszPassword: PWSTR;
  413.     //
  414.     // Cleartext old password of the user account whose password
  415.     // has just been changed.  The Password field contains the new
  416.     // password.  The string pointed to by this field must be
  417.     // separately allocated and will be separately deallocated by
  418.     // Winlogon.
  419.     //
  420.     pszOldPassword: PWSTR;
  421.   end;
  422.   {$EXTERNALSYM _WLX_MPR_NOTIFY_INFO}
  423.   WLX_MPR_NOTIFY_INFO = _WLX_MPR_NOTIFY_INFO;
  424.   {$EXTERNALSYM WLX_MPR_NOTIFY_INFO}
  425.   TWlxMprNotifyInfo = WLX_MPR_NOTIFY_INFO;
  426.   PWlxMprNotifyInfo = PWLX_MPR_NOTIFY_INFO;
  427. /////////////////////////////////////////////////////////////////////////
  428. /////////////////////////////////////////////////////////////////////////
  429. //
  430. // WLX_TERMINAL_SERVICES_DATA is used by the GINA during a
  431. // WlxQueryTerminalServicesData() callback into WinLogon from the
  432. // WlxLoggedOutSAS() context, after the user name and domain are known.
  433. // This structure relates to TS user configuration information which is
  434. // retrieved from the Domain Controller and SAM database. Having WinLogon
  435. // pass this information means the GINA does not need to do the same
  436. // off-machines lookups again.
  437. //
  438. const
  439.   WLX_DIRECTORY_LENGTH = 256;
  440.   {$EXTERNALSYM WLX_DIRECTORY_LENGTH}
  441. type
  442.   PWLX_TERMINAL_SERVICES_DATA = ^WLX_TERMINAL_SERVICES_DATA;
  443.   {$EXTERNALSYM PWLX_TERMINAL_SERVICES_DATA}
  444.   _WLX_TERMINAL_SERVICES_DATA = record
  445.     //
  446.     // TS profile path, overrides the standard profile path.
  447.     //
  448.     ProfilePath: array [0..WLX_DIRECTORY_LENGTH] of WCHAR;
  449.     //
  450.     // TS home directory, overrides standard home directory.
  451.     //
  452.     HomeDir: array [0..WLX_DIRECTORY_LENGTH] of WCHAR;
  453.     //
  454.     // TS home directory drive, overrides standard drive.
  455.     //
  456.     HomeDirDrive: array [0..3] of WCHAR;
  457.   end;
  458.   {$EXTERNALSYM _WLX_TERMINAL_SERVICES_DATA}
  459.   WLX_TERMINAL_SERVICES_DATA = _WLX_TERMINAL_SERVICES_DATA;
  460.   {$EXTERNALSYM WLX_TERMINAL_SERVICES_DATA}
  461.   TWlxTerminalServicesData = WLX_TERMINAL_SERVICES_DATA;
  462.   PWlxTerminalServicesData = PWLX_TERMINAL_SERVICES_DATA;
  463. /////////////////////////////////////////////////////////////////////////
  464. /////////////////////////////////////////////////////////////////////////
  465. //
  466. // The WLX_CLIENT_CREDENTIALS_INFO structure is returned
  467. // from winlogon from the WlxQueryClientCredentials() call.
  468. //
  469. // This allows a network client WinStation to pass client
  470. // credentials for automatic logon.
  471. //
  472. // The MSGINA DLL is responsible for freeing the memory
  473. // and substrings with LocalFree().
  474. //
  475. const
  476.   WLX_CREDENTIAL_TYPE_V1_0 = (1);
  477.   {$EXTERNALSYM WLX_CREDENTIAL_TYPE_V1_0}
  478.   WLX_CREDENTIAL_TYPE_V2_0 = (2);
  479.   {$EXTERNALSYM WLX_CREDENTIAL_TYPE_V2_0}
  480. type
  481.   PWLX_CLIENT_CREDENTIALS_INFO_V1_0 = ^WLX_CLIENT_CREDENTIALS_INFO_V1_0;
  482.   {$EXTERNALSYM PWLX_CLIENT_CREDENTIALS_INFO_V1_0}
  483.   _WLX_CLIENT_CREDENTIALS_INFO = record
  484.     //
  485.     // This field identifies the type of credentials structure being allocated
  486.     // by GINA DLL.  Credential types are defined with the prefix
  487.     // WLX_CREDENTIAL_TYPE_xxx.  It allows Winlogon to typecast the
  488.     // structure so the remainder of the structure may be referenced.
  489.     //
  490.     dwType: DWORD;
  491.     pszUserName: PWSTR;
  492.     pszDomain: PWSTR;
  493.     pszPassword: PWSTR;
  494.     //
  495.     // This field forces a prompt for the password. This
  496.     // is due to an administrator override.
  497.     //
  498.     // This allows the distinguishing of autologon
  499.     // with no password.
  500.     //
  501.     fPromptForPassword: BOOL;
  502.   end;
  503.   {$EXTERNALSYM _WLX_CLIENT_CREDENTIALS_INFO}
  504.   WLX_CLIENT_CREDENTIALS_INFO_V1_0 = _WLX_CLIENT_CREDENTIALS_INFO;
  505.   {$EXTERNALSYM WLX_CLIENT_CREDENTIALS_INFO_V1_0}
  506.   TWlxClientCredentialsInfoV1_0 = WLX_CLIENT_CREDENTIALS_INFO_V1_0;
  507.   PWlxClientCredentialsInfoV1_0 = PWLX_CLIENT_CREDENTIALS_INFO_V1_0;
  508.   _WLX_CLIENT_CREDENTIALS_INFO_V2_0 = record
  509.     dwType: DWORD;
  510.     pszUserName: PWSTR;
  511.     pszDomain: PWSTR;
  512.     pszPassword: PWSTR;
  513.     fPromptForPassword: BOOL;
  514.     //
  515.     // This field tells winlogon to disconnect/abort the logon attempt if the
  516.     // provided password is incorrect, or if it should reprompt (current
  517.     // behavior)
  518.     //
  519.     fDisconnectOnLogonFailure: BOOL;
  520.   end;
  521.   {$EXTERNALSYM _WLX_CLIENT_CREDENTIALS_INFO_V2_0}
  522.   WLX_CLIENT_CREDENTIALS_INFO_V2_0 = _WLX_CLIENT_CREDENTIALS_INFO_V2_0;
  523.   {$EXTERNALSYM WLX_CLIENT_CREDENTIALS_INFO_V2_0}
  524.   PWLX_CLIENT_CREDENTIALS_INFO_V2_0 = ^WLX_CLIENT_CREDENTIALS_INFO_V2_0;
  525.   {$EXTERNALSYM PWLX_CLIENT_CREDENTIALS_INFO_V2_0}
  526.   TWlxClientCredentialsInfoV2_0 = WLX_CLIENT_CREDENTIALS_INFO_V2_0;
  527.   PWlxClientCredentialsInfoV2_0 = PWLX_CLIENT_CREDENTIALS_INFO_V2_0;  
  528. /////////////////////////////////////////////////////////////////////////
  529. /////////////////////////////////////////////////////////////////////////
  530. //
  531. // The WLX_CONSOLESWITCH_CREDENTIALS_INFO structure is returned
  532. // from gina in response to WlxGetConsoleSwitchCredentials calls.
  533. // This structure is also returned from winlogon in response to
  534. // to WlxQueryConsoleSwitchCredentials call
  535. //
  536. // This is used to implement single session Terminal Server. A remote
  537. // session winlogon calls WlxGetConsoleSwitchCredentials to get the token
  538. // and other info of the logged on user from msgina. This info is then passed to
  539. // the console session winlogon to autologon the user on the console session.
  540. // The gina on console session calls WlxQueryConsoleSwitchCredentials to get
  541. // this info from winlogon and logs on the user.
  542. //
  543. // The caller is responsible for freeing the memory
  544. // and substrings with LocalFree().
  545. //
  546. const
  547.   WLX_CONSOLESWITCHCREDENTIAL_TYPE_V1_0 = (1);
  548.   {$EXTERNALSYM WLX_CONSOLESWITCHCREDENTIAL_TYPE_V1_0}
  549. type
  550.   _WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = record
  551.     //
  552.     // This field identifies the type of credentials structure being allocated
  553.     // Credential types are defined with the prefix
  554.     // WLX_CONSOLESWITCHCREDENTIAL_TYPE_xxx.  It allows Winlogon to typecast the
  555.     // structure so the remainder of the structure may be referenced.
  556.     //
  557.     dwType: DWORD;
  558.     UserToken: HANDLE;
  559.     LogonId: LUID;
  560.     Quotas: QUOTA_LIMITS;
  561.     UserName: PWSTR;
  562.     Domain: PWSTR;
  563.     LogonTime: LARGE_INTEGER;
  564.     SmartCardLogon: BOOL;
  565.     ProfileLength: ULONG;
  566.     //
  567.     // From MSV1_0_INTERACTIVE_PROFILE
  568.     //
  569.     MessageType: DWORD;
  570.     LogonCount: USHORT;
  571.     BadPasswordCount: USHORT;
  572.     ProfileLogonTime: LARGE_INTEGER;
  573.     LogoffTime: LARGE_INTEGER;
  574.     KickOffTime: LARGE_INTEGER;
  575.     PasswordLastSet: LARGE_INTEGER;
  576.     PasswordCanChange: LARGE_INTEGER;
  577.     PasswordMustChange: LARGE_INTEGER;
  578.     LogonScript: PWSTR;
  579.     HomeDirectory: PWSTR;
  580.     FullName: PWSTR;
  581.     ProfilePath: PWSTR;
  582.     HomeDirectoryDrive: PWSTR;
  583.     LogonServer: PWSTR;
  584.     UserFlags: ULONG;
  585.     PrivateDataLen: ULONG;
  586.     PrivateData: PBYTE;
  587.   end;
  588.   {$EXTERNALSYM _WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0}
  589.   WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = _WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;
  590.   {$EXTERNALSYM WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0}
  591.   PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = ^WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;
  592.   {$EXTERNALSYM PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0}
  593.   TWlxConsoleSwitchCredentialsInfoV1_0 = WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;
  594.   PWlxConsoleSwitchCredentialsInfoV1_0 = PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;  
  595. ////////////////////////////////////////////////////////////////////////
  596. //                                                                    //
  597. //  Services that replacement GINAs   ** MUST ** provide              //
  598. //                                                                    //
  599. ////////////////////////////////////////////////////////////////////////
  600. {$IFDEF IMPORT_MS_GINA}
  601. {$IFDEF MSGINA1_0}
  602. function WlxNegotiate(dwWinlogonVersion: DWORD; var pdwDllVersion: WORD): BOOL; stdcall;
  603. {$EXTERNALSYM WlxNegotiate}
  604. function WlxInitialize(lpWinsta: LPWSTR; hWlx: HANDLE; pvReserved: PVOID;
  605.   pWinlogonFunctions: PVOID; var pWlxContext: PVOID): BOOL; stdcall;
  606. {$EXTERNALSYM WlxInitialize}
  607. procedure WlxDisplaySASNotice(pWlxContext: PVOID); stdcall;
  608. {$EXTERNALSYM WlxDisplaySASNotice}
  609. function WlxLoggedOutSAS(pWlxContext: PVOID; dwSasType: DWORD;
  610.   var pAuthenticationId: LUID; var pLogonSid: SID; var pdwOptions: DWORD;
  611.   var phToken: HANDLE; var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO;
  612.   var pProfile: PVOID): Integer; stdcall;
  613. {$EXTERNALSYM WlxLoggedOutSAS}
  614. function WlxActivateUserShell(pWlxContext: PVOID; pszDesktopName: PWSTR;
  615.   pszMprLogonScript: PWSTR; pEnvironment: PVOID): BOOL; stdcall;
  616. {$EXTERNALSYM WlxActivateUserShell}
  617. function WlxLoggedOnSAS(pWlxContext: PVOID; dwSasType: DWORD; pReserved: PVOID): Integer; stdcall;
  618. {$EXTERNALSYM WlxLoggedOnSAS}
  619. procedure WlxDisplayLockedNotice(pWlxContext: PVOID); stdcall;
  620. {$EXTERNALSYM WlxDisplayLockedNotice}
  621. function WlxWkstaLockedSAS(pWlxContext: PVOID; dwSasType: DWORD): Integer; stdcall;
  622. {$EXTERNALSYM WlxWkstaLockedSAS}
  623. function WlxIsLockOk(pWlxContext: PVOID): BOOL; stdcall;
  624. {$EXTERNALSYM WlxIsLockOk}
  625. function WlxIsLogoffOk(pWlxContext: PVOID): BOOL; stdcall;
  626. {$EXTERNALSYM WlxIsLogoffOk}
  627. procedure WlxLogoff(pWlxContext: PVOID); stdcall;
  628. {$EXTERNALSYM WlxLogoff}
  629. procedure WlxShutdown(pWlxContext: PVOID; ShutdownType: DWORD); stdcall;
  630. {$EXTERNALSYM WlxShutdown}
  631. {$ENDIF}
  632. {$IFDEF MSGINA1_1}
  633. function WlxScreenSaverNotify(pWlxContext: PVOID; var pSecure: BOOL): BOOL; stdcall;
  634. {$EXTERNALSYM WlxScreenSaverNotify}
  635. function WlxStartApplication(pWlxContext: PVOID; pszDesktopName: PWSTR;
  636.   pEnvironment: PVOID; pszCmdLine: PWSTR): BOOL; stdcall;
  637. {$EXTERNALSYM WlxStartApplication}
  638. {$ENDIF}
  639. {$IFDEF MSGINA1_3}
  640. function WlxNetworkProviderLoad(pWlxContext: PVOID;
  641.   var pNprNotifyInfo: WLX_MPR_NOTIFY_INFO): BOOL; stdcall;
  642. {$EXTERNALSYM WlxNetworkProviderLoad}
  643. const
  644.   STATUSMSG_OPTION_NOANIMATION   = $00000001;
  645.   {$EXTERNALSYM STATUSMSG_OPTION_NOANIMATION}
  646.   STATUSMSG_OPTION_SETFOREGROUND = $00000002;
  647.   {$EXTERNALSYM STATUSMSG_OPTION_SETFOREGROUND}
  648. function WlxDisplayStatusMessage(pWlxContext: PVOID; hDesktop: HDESK;
  649.   dwOptions: DWORD; pTitle: PWSTR; pMessage: PWSTR): BOOL; stdcall;
  650. {$EXTERNALSYM WlxDisplayStatusMessage}
  651. function WlxGetStatusMessage(pWlxContext: PVOID; var pdwOptions: DWORD;
  652.   pMessage: PWSTR; dwBufferSize: DWORD): BOOL; stdcall;
  653. {$EXTERNALSYM WlxGetStatusMessage}
  654. function WlxRemoveStatusMessage(pWlxContext: PVOID): BOOL; stdcall;
  655. {$EXTERNALSYM WlxRemoveStatusMessage}
  656. {$ENDIF}
  657. {$IFDEF MSGINA1_4}
  658. function WlxGetConsoleSwitchCredentials(pWlxContext, pCredInfo: PVOID): BOOL; stdcall;
  659. {$EXTERNALSYM WlxGetConsoleSwitchCredentials}
  660. procedure WlxReconnectNotify(pWlxContext: PVOID); stdcall;
  661. {$EXTERNALSYM WlxReconnectNotify}
  662. procedure WlxDisconnectNotify(pWlxContext: PVOID); stdcall;
  663. {$EXTERNALSYM WlxDisconnectNotify}
  664. {$ENDIF}
  665. {$ENDIF IMPORT_MS_GINA}
  666. ////////////////////////////////////////////////////////////////////////
  667. //                                                                    //
  668. //  Services that Winlogon provides                                   //
  669. //                                                                    //
  670. ////////////////////////////////////////////////////////////////////////
  671. type
  672.   PWLX_DESKTOP = ^WLX_DESKTOP;
  673.   {$EXTERNALSYM PWLX_DESKTOP}
  674.   _WLX_DESKTOP = record
  675.     Size: DWORD;
  676.     Flags: DWORD;
  677.     hDesktop: HDESK;
  678.     pszDesktopName: PWSTR;
  679.   end;
  680.   {$EXTERNALSYM _WLX_DESKTOP}
  681.   WLX_DESKTOP = _WLX_DESKTOP;
  682.   {$EXTERNALSYM WLX_DESKTOP}
  683.   TWlxDesktop = WLX_DESKTOP;
  684.   PWlxDesktop = PWLX_DESKTOP;
  685. const
  686.   WLX_DESKTOP_NAME   = $00000001; // Name present
  687.   {$EXTERNALSYM WLX_DESKTOP_NAME}
  688.   WLX_DESKTOP_HANDLE = $00000002; // Handle present
  689.   {$EXTERNALSYM WLX_DESKTOP_HANDLE}
  690. type
  691.   PWLX_USE_CTRL_ALT_DEL = procedure (hWlx: HANDLE); stdcall;
  692.   {$EXTERNALSYM PWLX_USE_CTRL_ALT_DEL}
  693.   PWLX_SET_CONTEXT_POINTER = procedure (hWlx: HANDLE; pWlxContext: PVOID); stdcall;
  694.   {$EXTERNALSYM PWLX_SET_CONTEXT_POINTER}
  695.   PWLX_SAS_NOTIFY = procedure (hWlx: HANDLE; dwSasType: DWORD); stdcall;
  696.   {$EXTERNALSYM PWLX_SAS_NOTIFY}
  697.   PWLX_SET_TIMEOUT = function (hWlx: HANDLE; Timeout: DWORD): BOOL; stdcall;
  698.   {$EXTERNALSYM PWLX_SET_TIMEOUT}
  699.   PWLX_ASSIGN_SHELL_PROTECTION = function (hWlx, hToken, hProcess, hThread: HANDLE): Integer; stdcall;
  700.   {$EXTERNALSYM PWLX_ASSIGN_SHELL_PROTECTION}
  701.   PWLX_MESSAGE_BOX = function (hWlx: HANDLE; hwndOwner: HWND; lpszText,
  702.     lpszTitle: LPWSTR; fuStyle: UINT): Integer; stdcall;
  703.   {$EXTERNALSYM PWLX_MESSAGE_BOX}
  704.   PWLX_DIALOG_BOX = function (hWlx, hInst: HANDLE; lpszTemplate: LPWSTR;
  705.     hwndOwner: HWND; dlgprc: DLGPROC): Integer; stdcall;
  706.   {$EXTERNALSYM PWLX_DIALOG_BOX}
  707.   PWLX_DIALOG_BOX_INDIRECT = function (hWlx, hInst: HANDLE;
  708.     hDialogTemplate: LPCDLGTEMPLATE; hwndOwner: HWND; dlgprc: DLGPROC): Integer; stdcall;
  709.   {$EXTERNALSYM PWLX_DIALOG_BOX_INDIRECT}
  710.   PWLX_DIALOG_BOX_PARAM = function (hWlx, hInst: HANDLE; lpszTemplate: LPWSTR;
  711.     hwndOwner: HWND; dlgprc: DLGPROC; dwInitParam: LPARAM): Integer; stdcall;
  712.   {$EXTERNALSYM PWLX_DIALOG_BOX_PARAM}
  713.   PWLX_DIALOG_BOX_INDIRECT_PARAM = function (hWlx, hInst: HANDLE;
  714.     hDialogTemplate: LPCDLGTEMPLATE; hwndOwner: HWND; dlgprc: DLGPROC;
  715.     dwInitParam: LPARAM): Integer; stdcall;
  716.   {$EXTERNALSYM PWLX_DIALOG_BOX_INDIRECT_PARAM}
  717.   PWLX_SWITCH_DESKTOP_TO_USER = function (hWlx: HANDLE): Integer; stdcall;
  718.   {$EXTERNALSYM PWLX_SWITCH_DESKTOP_TO_USER}
  719.   PWLX_SWITCH_DESKTOP_TO_WINLOGON = function (hWlx: HANDLE): Integer; stdcall;
  720.   {$EXTERNALSYM PWLX_SWITCH_DESKTOP_TO_WINLOGON}
  721.   PWLX_CHANGE_PASSWORD_NOTIFY = function (hWlx: HANDLE;
  722.     var pMprInfo: WLX_MPR_NOTIFY_INFO; dwChangeInfo: DWORD): Integer; stdcall;
  723.   {$EXTERNALSYM PWLX_CHANGE_PASSWORD_NOTIFY}
  724.   PWLX_GET_SOURCE_DESKTOP = function (hWlx: HANDLE; var ppDesktop: PWLX_DESKTOP): BOOL; stdcall;
  725.   {$EXTERNALSYM PWLX_GET_SOURCE_DESKTOP}
  726.   PWLX_SET_RETURN_DESKTOP = function (hWlx: HANDLE; const pDesktop: WLX_DESKTOP): BOOL; stdcall;
  727.   {$EXTERNALSYM PWLX_SET_RETURN_DESKTOP}
  728.   PWLX_CREATE_USER_DESKTOP = function (hWlx, hToken: HANDLE; Flags: DWORD;
  729.     pszDesktopName: PWSTR; var ppDesktop: PWLX_DESKTOP): BOOL; stdcall;
  730.   {$EXTERNALSYM PWLX_CREATE_USER_DESKTOP}
  731. const
  732.   WLX_CREATE_INSTANCE_ONLY = $00000001;
  733.   {$EXTERNALSYM WLX_CREATE_INSTANCE_ONLY}
  734.   WLX_CREATE_USER          = $00000002;
  735.   {$EXTERNALSYM WLX_CREATE_USER}
  736. type
  737.   PWLX_CHANGE_PASSWORD_NOTIFY_EX = function (hWlx: HANDLE;
  738.     const pMprInfo: WLX_MPR_NOTIFY_INFO; dwChangeInfo: DWORD;
  739.     ProviderName: PWSTR; Reserved: PVOID): Integer; stdcall;
  740.   {$EXTERNALSYM PWLX_CHANGE_PASSWORD_NOTIFY_EX}
  741.   PWLX_CLOSE_USER_DESKTOP = function (hWlx: HANDLE; const pDesktop: WLX_DESKTOP;
  742.     hToken: HANDLE): BOOL; stdcall;
  743.   {$EXTERNALSYM PWLX_CLOSE_USER_DESKTOP}
  744.   PWLX_SET_OPTION = function (hWlx: HANDLE; Option: DWORD; Value: ULONG_PTR;
  745.     var OldValue: ULONG_PTR): BOOL; stdcall;
  746.   {$EXTERNALSYM PWLX_SET_OPTION}
  747.   PWLX_GET_OPTION = function (hWlx: HANDLE; Option: DWORD; var Value: ULONG_PTR): BOOL; stdcall;
  748.   {$EXTERNALSYM PWLX_GET_OPTION}
  749.   PWLX_WIN31_MIGRATE = procedure (hWlx: HANDLE); stdcall;
  750.   {$EXTERNALSYM PWLX_WIN31_MIGRATE}
  751.   PWLX_QUERY_CLIENT_CREDENTIALS = function (var pCred: WLX_CLIENT_CREDENTIALS_INFO_V1_0): BOOL; stdcall;
  752.   {$EXTERNALSYM PWLX_QUERY_CLIENT_CREDENTIALS}
  753.   PWLX_QUERY_IC_CREDENTIALS = function (var pCred: WLX_CLIENT_CREDENTIALS_INFO_V1_0): BOOL; stdcall;
  754.   {$EXTERNALSYM PWLX_QUERY_IC_CREDENTIALS}
  755.   PWLX_QUERY_TS_LOGON_CREDENTIALS = function (pCred: PWLX_CLIENT_CREDENTIALS_INFO_V2_0): BOOL; stdcall;
  756.   {$EXTERNALSYM PWLX_QUERY_TS_LOGON_CREDENTIALS}
  757.   PWLX_DISCONNECT = function : BOOL; stdcall;
  758.   {$EXTERNALSYM PWLX_DISCONNECT}
  759.   PWLX_QUERY_TERMINAL_SERVICES_DATA = function (hWlx: HANDLE;
  760.     var pTSData: WLX_TERMINAL_SERVICES_DATA; UserName, Domain: PWCHAR): DWORD; stdcall;
  761.   {$EXTERNALSYM PWLX_DISCONNECT}
  762.   PWLX_QUERY_CONSOLESWITCH_CREDENTIALS = function (pCred: PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0): DWORD; stdcall;
  763.   {$EXTERNALSYM PWLX_QUERY_CONSOLESWITCH_CREDENTIALS}
  764. //
  765. // Options that can be get or set:
  766. //
  767. const
  768.   WLX_OPTION_USE_CTRL_ALT_DEL  = $00000001;
  769.   {$EXTERNALSYM WLX_OPTION_USE_CTRL_ALT_DEL}
  770.   WLX_OPTION_CONTEXT_POINTER   = $00000002;
  771.   {$EXTERNALSYM WLX_OPTION_CONTEXT_POINTER}
  772.   WLX_OPTION_USE_SMART_CARD    = $00000003;
  773.   {$EXTERNALSYM WLX_OPTION_USE_SMART_CARD}
  774.   WLX_OPTION_FORCE_LOGOFF_TIME = $00000004;
  775.   {$EXTERNALSYM WLX_OPTION_FORCE_LOGOFF_TIME}
  776.   WLX_OPTION_IGNORE_AUTO_LOGON = $00000008;
  777.   {$EXTERNALSYM WLX_OPTION_IGNORE_AUTO_LOGON}
  778.   WLX_OPTION_NO_SWITCH_ON_SAS  = $00000009;
  779.   {$EXTERNALSYM WLX_OPTION_NO_SWITCH_ON_SAS}
  780. //
  781. // Options that can be queried only:
  782. //
  783.   WLX_OPTION_SMART_CARD_PRESENT  = $00010001;
  784.   {$EXTERNALSYM WLX_OPTION_SMART_CARD_PRESENT}
  785.   WLX_OPTION_SMART_CARD_INFO     = $00010002;
  786.   {$EXTERNALSYM WLX_OPTION_SMART_CARD_INFO}
  787.   WLX_OPTION_DISPATCH_TABLE_SIZE = $00010003;
  788.   {$EXTERNALSYM WLX_OPTION_DISPATCH_TABLE_SIZE}
  789. ////////////////////////////////////////////////////////////////////////
  790. //                                                                    //
  791. //  Function dispatch tables.                                         //
  792. //  One of the following tables will be passed to the GINA DLL        //
  793. //  in the WlxInitialize() call during initialization.                //
  794. //                                                                    //
  795. ////////////////////////////////////////////////////////////////////////
  796. type
  797.   PWLX_DISPATCH_VERSION_1_0 = ^WLX_DISPATCH_VERSION_1_0;
  798.   {$EXTERNALSYM PWLX_DISPATCH_VERSION_1_0}
  799.   _WLX_DISPATCH_VERSION_1_0 = record
  800.     WlxUseCtrlAltDel: PWLX_USE_CTRL_ALT_DEL;
  801.     WlxSetContextPointer: PWLX_SET_CONTEXT_POINTER;
  802.     WlxSasNotify: PWLX_SAS_NOTIFY;
  803.     WlxSetTimeout: PWLX_SET_TIMEOUT;
  804.     WlxAssignShellProtection: PWLX_ASSIGN_SHELL_PROTECTION;
  805.     WlxMessageBox: PWLX_MESSAGE_BOX;
  806.     WlxDialogBox: PWLX_DIALOG_BOX;
  807.     WlxDialogBoxParam: PWLX_DIALOG_BOX_PARAM;
  808.     WlxDialogBoxIndirect: PWLX_DIALOG_BOX_INDIRECT;
  809.     WlxDialogBoxIndirectParam: PWLX_DIALOG_BOX_INDIRECT_PARAM;
  810.     WlxSwitchDesktopToUser: PWLX_SWITCH_DESKTOP_TO_USER;
  811.     WlxSwitchDesktopToWinlogon: PWLX_SWITCH_DESKTOP_TO_WINLOGON;
  812.     WlxChangePasswordNotify: PWLX_CHANGE_PASSWORD_NOTIFY;
  813.   end;
  814.   {$EXTERNALSYM _WLX_DISPATCH_VERSION_1_0}
  815.   WLX_DISPATCH_VERSION_1_0 = _WLX_DISPATCH_VERSION_1_0;
  816.   {$EXTERNALSYM WLX_DISPATCH_VERSION_1_0}
  817.   TWlxDispatchVersion1_0 = WLX_DISPATCH_VERSION_1_0;
  818.   PWlxDispatchVersion1_0 = PWLX_DISPATCH_VERSION_1_0;
  819.   PWLX_DISPATCH_VERSION_1_1 = ^WLX_DISPATCH_VERSION_1_1;
  820.   {$EXTERNALSYM PWLX_DISPATCH_VERSION_1_1}
  821.   _WLX_DISPATCH_VERSION_1_1 = record
  822.     WlxUseCtrlAltDel: PWLX_USE_CTRL_ALT_DEL;
  823.     WlxSetContextPointer: PWLX_SET_CONTEXT_POINTER;
  824.     WlxSasNotify: PWLX_SAS_NOTIFY;
  825.     WlxSetTimeout: PWLX_SET_TIMEOUT;
  826.     WlxAssignShellProtection: PWLX_ASSIGN_SHELL_PROTECTION;
  827.     WlxMessageBox: PWLX_MESSAGE_BOX;
  828.     WlxDialogBox: PWLX_DIALOG_BOX;
  829.     WlxDialogBoxParam: PWLX_DIALOG_BOX_PARAM;
  830.     WlxDialogBoxIndirect: PWLX_DIALOG_BOX_INDIRECT;
  831.     WlxDialogBoxIndirectParam: PWLX_DIALOG_BOX_INDIRECT_PARAM;
  832.     WlxSwitchDesktopToUser: PWLX_SWITCH_DESKTOP_TO_USER;
  833.     WlxSwitchDesktopToWinlogon: PWLX_SWITCH_DESKTOP_TO_WINLOGON;
  834.     WlxChangePasswordNotify: PWLX_CHANGE_PASSWORD_NOTIFY;
  835.     WlxGetSourceDesktop: PWLX_GET_SOURCE_DESKTOP;
  836.     WlxSetReturnDesktop: PWLX_SET_RETURN_DESKTOP;
  837.     WlxCreateUserDesktop: PWLX_CREATE_USER_DESKTOP;
  838.     WlxChangePasswordNotifyEx: PWLX_CHANGE_PASSWORD_NOTIFY_EX;
  839.   end;
  840.   {$EXTERNALSYM _WLX_DISPATCH_VERSION_1_1}
  841.   WLX_DISPATCH_VERSION_1_1 = _WLX_DISPATCH_VERSION_1_1;
  842.   {$EXTERNALSYM WLX_DISPATCH_VERSION_1_1}
  843.   TWlxDispatchVersion1_1 = WLX_DISPATCH_VERSION_1_1;
  844.   PWlxDispatchVersion1_1 = PWLX_DISPATCH_VERSION_1_1;
  845.   PWLX_DISPATCH_VERSION_1_2 = ^WLX_DISPATCH_VERSION_1_2;
  846.   {$EXTERNALSYM PWLX_DISPATCH_VERSION_1_2}
  847.   _WLX_DISPATCH_VERSION_1_2 = record
  848.     WlxUseCtrlAltDel: PWLX_USE_CTRL_ALT_DEL;
  849.     WlxSetContextPointer: PWLX_SET_CONTEXT_POINTER;
  850.     WlxSasNotify: PWLX_SAS_NOTIFY;
  851.     WlxSetTimeout: PWLX_SET_TIMEOUT;
  852.     WlxAssignShellProtection: PWLX_ASSIGN_SHELL_PROTECTION;
  853.     WlxMessageBox: PWLX_MESSAGE_BOX;
  854.     WlxDialogBox: PWLX_DIALOG_BOX;
  855.     WlxDialogBoxParam: PWLX_DIALOG_BOX_PARAM;
  856.     WlxDialogBoxIndirect: PWLX_DIALOG_BOX_INDIRECT;
  857.     WlxDialogBoxIndirectParam: PWLX_DIALOG_BOX_INDIRECT_PARAM;
  858.     WlxSwitchDesktopToUser: PWLX_SWITCH_DESKTOP_TO_USER;
  859.     WlxSwitchDesktopToWinlogon: PWLX_SWITCH_DESKTOP_TO_WINLOGON;
  860.     WlxChangePasswordNotify: PWLX_CHANGE_PASSWORD_NOTIFY;
  861.     WlxGetSourceDesktop: PWLX_GET_SOURCE_DESKTOP;
  862.     WlxSetReturnDesktop: PWLX_SET_RETURN_DESKTOP;
  863.     WlxCreateUserDesktop: PWLX_CREATE_USER_DESKTOP;
  864.     WlxChangePasswordNotifyEx: PWLX_CHANGE_PASSWORD_NOTIFY_EX;
  865.     WlxCloseUserDesktop : PWLX_CLOSE_USER_DESKTOP;
  866.   end;
  867.   {$EXTERNALSYM _WLX_DISPATCH_VERSION_1_2}
  868.   WLX_DISPATCH_VERSION_1_2 = _WLX_DISPATCH_VERSION_1_2;
  869.   {$EXTERNALSYM WLX_DISPATCH_VERSION_1_2}
  870.   TWlxDispatchVersion1_2 = WLX_DISPATCH_VERSION_1_2;
  871.   PWlxDispatchVersion1_2 = PWLX_DISPATCH_VERSION_1_2;
  872.   PWLX_DISPATCH_VERSION_1_3 = ^WLX_DISPATCH_VERSION_1_3;
  873.   {$EXTERNALSYM PWLX_DISPATCH_VERSION_1_3}
  874.   _WLX_DISPATCH_VERSION_1_3 = record
  875.     WlxUseCtrlAltDel: PWLX_USE_CTRL_ALT_DEL;
  876.     WlxSetContextPointer: PWLX_SET_CONTEXT_POINTER;
  877.     WlxSasNotify: PWLX_SAS_NOTIFY;
  878.     WlxSetTimeout: PWLX_SET_TIMEOUT;
  879.     WlxAssignShellProtection: PWLX_ASSIGN_SHELL_PROTECTION;
  880.     WlxMessageBox: PWLX_MESSAGE_BOX;
  881.     WlxDialogBox: PWLX_DIALOG_BOX;
  882.     WlxDialogBoxParam: PWLX_DIALOG_BOX_PARAM;
  883.     WlxDialogBoxIndirect: PWLX_DIALOG_BOX_INDIRECT;
  884.     WlxDialogBoxIndirectParam: PWLX_DIALOG_BOX_INDIRECT_PARAM;
  885.     WlxSwitchDesktopToUser: PWLX_SWITCH_DESKTOP_TO_USER;
  886.     WlxSwitchDesktopToWinlogon: PWLX_SWITCH_DESKTOP_TO_WINLOGON;
  887.     WlxChangePasswordNotify: PWLX_CHANGE_PASSWORD_NOTIFY;
  888.     WlxGetSourceDesktop: PWLX_GET_SOURCE_DESKTOP;
  889.     WlxSetReturnDesktop: PWLX_SET_RETURN_DESKTOP;
  890.     WlxCreateUserDesktop: PWLX_CREATE_USER_DESKTOP;
  891.     WlxChangePasswordNotifyEx: PWLX_CHANGE_PASSWORD_NOTIFY_EX;
  892.     WlxCloseUserDesktop : PWLX_CLOSE_USER_DESKTOP;
  893.     WlxSetOption: PWLX_SET_OPTION;
  894.     WlxGetOption: PWLX_GET_OPTION;
  895.     WlxWin31Migrate: PWLX_WIN31_MIGRATE;
  896.     WlxQueryClientCredentials: PWLX_QUERY_CLIENT_CREDENTIALS;
  897.     WlxQueryInetConnectorCredentials: PWLX_QUERY_IC_CREDENTIALS;
  898.     WlxDisconnect: PWLX_DISCONNECT;
  899.     WlxQueryTerminalServicesData: PWLX_QUERY_TERMINAL_SERVICES_DATA;
  900.   end;
  901.   {$EXTERNALSYM _WLX_DISPATCH_VERSION_1_3}
  902.   WLX_DISPATCH_VERSION_1_3 = _WLX_DISPATCH_VERSION_1_3;
  903.   {$EXTERNALSYM WLX_DISPATCH_VERSION_1_3}
  904.   TWlxDispatchVersion1_3 = WLX_DISPATCH_VERSION_1_3;
  905.   PWlxDispatchVersion1_3 = PWLX_DISPATCH_VERSION_1_3;
  906.   PWLX_DISPATCH_VERSION_1_4 = ^WLX_DISPATCH_VERSION_1_4;
  907.   {$EXTERNALSYM PWLX_DISPATCH_VERSION_1_4}
  908.   _WLX_DISPATCH_VERSION_1_4 = record
  909.     WlxUseCtrlAltDel: PWLX_USE_CTRL_ALT_DEL;
  910.     WlxSetContextPointer: PWLX_SET_CONTEXT_POINTER;
  911.     WlxSasNotify: PWLX_SAS_NOTIFY;
  912.     WlxSetTimeout: PWLX_SET_TIMEOUT;
  913.     WlxAssignShellProtection: PWLX_ASSIGN_SHELL_PROTECTION;
  914.     WlxMessageBox: PWLX_MESSAGE_BOX;
  915.     WlxDialogBox: PWLX_DIALOG_BOX;
  916.     WlxDialogBoxParam: PWLX_DIALOG_BOX_PARAM;
  917.     WlxDialogBoxIndirect: PWLX_DIALOG_BOX_INDIRECT;
  918.     WlxDialogBoxIndirectParam: PWLX_DIALOG_BOX_INDIRECT_PARAM;
  919.     WlxSwitchDesktopToUser: PWLX_SWITCH_DESKTOP_TO_USER;
  920.     WlxSwitchDesktopToWinlogon: PWLX_SWITCH_DESKTOP_TO_WINLOGON;
  921.     WlxChangePasswordNotify: PWLX_CHANGE_PASSWORD_NOTIFY;
  922.     WlxGetSourceDesktop: PWLX_GET_SOURCE_DESKTOP;
  923.     WlxSetReturnDesktop: PWLX_SET_RETURN_DESKTOP;
  924.     WlxCreateUserDesktop: PWLX_CREATE_USER_DESKTOP;
  925.     WlxChangePasswordNotifyEx: PWLX_CHANGE_PASSWORD_NOTIFY_EX;
  926.     WlxCloseUserDesktop : PWLX_CLOSE_USER_DESKTOP;
  927.     WlxSetOption: PWLX_SET_OPTION;
  928.     WlxGetOption: PWLX_GET_OPTION;
  929.     WlxWin31Migrate: PWLX_WIN31_MIGRATE;
  930.     WlxQueryClientCredentials: PWLX_QUERY_CLIENT_CREDENTIALS;
  931.     WlxQueryInetConnectorCredentials: PWLX_QUERY_IC_CREDENTIALS;
  932.     WlxDisconnect: PWLX_DISCONNECT;
  933.     WlxQueryTerminalServicesData: PWLX_QUERY_TERMINAL_SERVICES_DATA;
  934.     WlxQueryConsoleSwitchCredentials: PWLX_QUERY_CONSOLESWITCH_CREDENTIALS;
  935.     WlxQueryTsLogonCredentials: PWLX_QUERY_TS_LOGON_CREDENTIALS;
  936.   end;
  937.   {$EXTERNALSYM _WLX_DISPATCH_VERSION_1_4}
  938.   WLX_DISPATCH_VERSION_1_4 = _WLX_DISPATCH_VERSION_1_4;
  939.   {$EXTERNALSYM WLX_DISPATCH_VERSION_1_4}
  940.   TWlxDispatchVersion1_4 = WLX_DISPATCH_VERSION_1_4;
  941.   PWlxDispatchVersion1_4 = PWLX_DISPATCH_VERSION_1_4;
  942. //
  943. // Non-GINA notification DLLs
  944. //
  945.   PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
  946.   {$EXTERNALSYM PFNMSGECALLBACK}
  947.   TFnMsgeCallback = PFNMSGECALLBACK;
  948.   PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
  949.   {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
  950.   _WLX_NOTIFICATION_INFO = record
  951.     Size: ULONG;
  952.     Flags: ULONG;
  953.     UserName: PWSTR;
  954.     Domain: PWSTR;
  955.     WindowStation: PWSTR;
  956.     hToken: HANDLE;
  957.     hDesktop: HDESK;
  958.     pStatusCallback: PFNMSGECALLBACK;
  959.   end;
  960.   {$EXTERNALSYM _WLX_NOTIFICATION_INFO}
  961.   WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
  962.   {$EXTERNALSYM WLX_NOTIFICATION_INFO}
  963.   TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
  964.   PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;
  965. implementation
  966. {$IFDEF IMPORT_MS_GINA}
  967. const
  968.   msgina = 'msgina.dll';
  969. {$IFDEF MSGINA1_0}
  970. {$IFDEF DYNAMIC_LINK}
  971. var
  972.   _WlxNegotiate: Pointer;
  973. function WlxNegotiate;
  974. begin
  975.   GetProcedureAddress(_WlxNegotiate, msgina, 'WlxNegotiate');
  976.   asm
  977.     mov esp, ebp
  978.     pop ebp
  979.     jmp [_WlxNegotiate]
  980.   end;
  981. end;
  982. {$ELSE}
  983. function WlxNegotiate; external msgina name 'WlxNegotiate';
  984. {$ENDIF DYNAMIC_LINK}
  985. {$IFDEF DYNAMIC_LINK}
  986. var
  987.   _WlxInitialize: Pointer;
  988. function WlxInitialize;
  989. begin
  990.   GetProcedureAddress(_WlxInitialize, msgina, 'WlxInitialize');
  991.   asm
  992.     mov esp, ebp
  993.     pop ebp
  994.     jmp [_WlxInitialize]
  995.   end;
  996. end;
  997. {$ELSE}
  998. function WlxInitialize; external msgina name 'WlxInitialize';
  999. {$ENDIF DYNAMIC_LINK}
  1000. {$IFDEF DYNAMIC_LINK}
  1001. var
  1002.   _WlxDisplaySASNotice: Pointer;
  1003. procedure WlxDisplaySASNotice;
  1004. begin
  1005.   GetProcedureAddress(_WlxDisplaySASNotice, msgina, 'WlxDisplaySASNotice');
  1006.   asm
  1007.     mov esp, ebp
  1008.     pop ebp
  1009.     jmp [_WlxDisplaySASNotice]
  1010.   end;
  1011. end;
  1012. {$ELSE}
  1013. procedure WlxDisplaySASNotice; external msgina name 'WlxDisplaySASNotice';
  1014. {$ENDIF DYNAMIC_LINK}
  1015. {$IFDEF DYNAMIC_LINK}
  1016. var
  1017.   _WlxLoggedOutSAS: Pointer;
  1018. function WlxLoggedOutSAS;
  1019. begin
  1020.   GetProcedureAddress(_WlxLoggedOutSAS, msgina, 'WlxLoggedOutSAS');
  1021.   asm
  1022.     mov esp, ebp
  1023.     pop ebp
  1024.     jmp [_WlxLoggedOutSAS]
  1025.   end;
  1026. end;
  1027. {$ELSE}
  1028. function WlxLoggedOutSAS; external msgina name 'WlxLoggedOutSAS';
  1029. {$ENDIF DYNAMIC_LINK}
  1030. {$IFDEF DYNAMIC_LINK}
  1031. var
  1032.   _WlxActivateUserShell: Pointer;
  1033. function WlxActivateUserShell;
  1034. begin
  1035.   GetProcedureAddress(_WlxActivateUserShell, msgina, 'WlxActivateUserShell');
  1036.   asm
  1037.     mov esp, ebp
  1038.     pop ebp
  1039.     jmp [_WlxActivateUserShell]
  1040.   end;
  1041. end;
  1042. {$ELSE}
  1043. function WlxActivateUserShell; external msgina name 'WlxActivateUserShell';
  1044. {$ENDIF DYNAMIC_LINK}
  1045. {$IFDEF DYNAMIC_LINK}
  1046. var
  1047.   _WlxLoggedOnSAS: Pointer;
  1048. function WlxLoggedOnSAS;
  1049. begin
  1050.   GetProcedureAddress(_WlxLoggedOnSAS, msgina, 'WlxLoggedOnSAS');
  1051.   asm
  1052.     mov esp, ebp
  1053.     pop ebp
  1054.     jmp [_WlxLoggedOnSAS]
  1055.   end;
  1056. end;
  1057. {$ELSE}
  1058. function WlxLoggedOnSAS; external msgina name 'WlxLoggedOnSAS';
  1059. {$ENDIF DYNAMIC_LINK}
  1060. {$IFDEF DYNAMIC_LINK}
  1061. var
  1062.   _WlxDisplayLockedNotice: Pointer;
  1063. procedure WlxDisplayLockedNotice;
  1064. begin
  1065.   GetProcedureAddress(_WlxDisplayLockedNotice, msgina, 'WlxDisplayLockedNotice');
  1066.   asm
  1067.     mov esp, ebp
  1068.     pop ebp
  1069.     jmp [_WlxDisplayLockedNotice]
  1070.   end;
  1071. end;
  1072. {$ELSE}
  1073. procedure WlxDisplayLockedNotice; external msgina name 'WlxDisplayLockedNotice';
  1074. {$ENDIF DYNAMIC_LINK}
  1075. {$IFDEF DYNAMIC_LINK}
  1076. var
  1077.   _WlxWkstaLockedSAS: Pointer;
  1078. function WlxWkstaLockedSAS;
  1079. begin
  1080.   GetProcedureAddress(_WlxWkstaLockedSAS, msgina, 'WlxWkstaLockedSAS');
  1081.   asm
  1082.     mov esp, ebp
  1083.     pop ebp
  1084.     jmp [_WlxWkstaLockedSAS]
  1085.   end;
  1086. end;
  1087. {$ELSE}
  1088. function WlxWkstaLockedSAS; external msgina name 'WlxWkstaLockedSAS';
  1089. {$ENDIF DYNAMIC_LINK}
  1090. {$IFDEF DYNAMIC_LINK}
  1091. var
  1092.   _WlxIsLockOk: Pointer;
  1093. function WlxIsLockOk;
  1094. begin
  1095.   GetProcedureAddress(_WlxIsLockOk, msgina, 'WlxIsLockOk');
  1096.   asm
  1097.     mov esp, ebp
  1098.     pop ebp
  1099.     jmp [_WlxIsLockOk]
  1100.   end;
  1101. end;
  1102. {$ELSE}
  1103. function WlxIsLockOk; external msgina name 'WlxIsLockOk';
  1104. {$ENDIF DYNAMIC_LINK}
  1105. {$IFDEF DYNAMIC_LINK}
  1106. var
  1107.   _WlxIsLogoffOk: Pointer;
  1108. function WlxIsLogoffOk;
  1109. begin
  1110.   GetProcedureAddress(_WlxIsLogoffOk, msgina, 'WlxIsLogoffOk');
  1111.   asm
  1112.     mov esp, ebp
  1113.     pop ebp
  1114.     jmp [_WlxIsLogoffOk]
  1115.   end;
  1116. end;
  1117. {$ELSE}
  1118. function WlxIsLogoffOk; external msgina name 'WlxIsLogoffOk';
  1119. {$ENDIF DYNAMIC_LINK}
  1120. {$IFDEF DYNAMIC_LINK}
  1121. var
  1122.   _WlxLogoff: Pointer;
  1123. procedure WlxLogoff;
  1124. begin
  1125.   GetProcedureAddress(_WlxLogoff, msgina, 'WlxLogoff');
  1126.   asm
  1127.     mov esp, ebp
  1128.     pop ebp
  1129.     jmp [_WlxLogoff]
  1130.   end;
  1131. end;
  1132. {$ELSE}
  1133. procedure WlxLogoff; external msgina name 'WlxLogoff';
  1134. {$ENDIF DYNAMIC_LINK}
  1135. {$IFDEF DYNAMIC_LINK}
  1136. var
  1137.   _WlxShutdown: Pointer;
  1138. procedure WlxShutdown;
  1139. begin
  1140.   GetProcedureAddress(_WlxShutdown, msgina, 'WlxShutdown');
  1141.   asm
  1142.     mov esp, ebp
  1143.     pop ebp
  1144.     jmp [_WlxShutdown]
  1145.   end;
  1146. end;
  1147. {$ELSE}
  1148. procedure WlxShutdown; external msgina name 'WlxShutdown';
  1149. {$ENDIF DYNAMIC_LINK}
  1150. {$ENDIF}
  1151. {$IFDEF MSGINA1_1}
  1152. {$IFDEF DYNAMIC_LINK}
  1153. var
  1154.   _WlxScreenSaverNotify: Pointer;
  1155. function WlxScreenSaverNotify;
  1156. begin
  1157.   GetProcedureAddress(_WlxScreenSaverNotify, msgina, 'WlxScreenSaverNotify');
  1158.   asm
  1159.     mov esp, ebp
  1160.     pop ebp
  1161.     jmp [_WlxScreenSaverNotify]
  1162.   end;
  1163. end;
  1164. {$ELSE}
  1165. function WlxScreenSaverNotify; external msgina name 'WlxScreenSaverNotify';
  1166. {$ENDIF DYNAMIC_LINK}
  1167. {$IFDEF DYNAMIC_LINK}
  1168. var
  1169.   _WlxStartApplication: Pointer;
  1170. function WlxStartApplication;
  1171. begin
  1172.   GetProcedureAddress(_WlxStartApplication, msgina, 'WlxStartApplication');
  1173.   asm
  1174.     mov esp, ebp
  1175.     pop ebp
  1176.     jmp [_WlxStartApplication]
  1177.   end;
  1178. end;
  1179. {$ELSE}
  1180. function WlxStartApplication; external msgina name 'WlxStartApplication';
  1181. {$ENDIF DYNAMIC_LINK}
  1182. {$ENDIF}
  1183. {$IFDEF MSGINA1_3}
  1184. {$IFDEF DYNAMIC_LINK}
  1185. var
  1186.   _WlxNetworkProviderLoad: Pointer;
  1187. function WlxNetworkProviderLoad;
  1188. begin
  1189.   GetProcedureAddress(_WlxNetworkProviderLoad, msgina, 'WlxNetworkProviderLoad');
  1190.   asm
  1191.     mov esp, ebp
  1192.     pop ebp
  1193.     jmp [_WlxNetworkProviderLoad]
  1194.   end;
  1195. end;
  1196. {$ELSE}
  1197. function WlxNetworkProviderLoad; external msgina name 'WlxNetworkProviderLoad';
  1198. {$ENDIF DYNAMIC_LINK}
  1199. {$IFDEF DYNAMIC_LINK}
  1200. var
  1201.   _WlxDisplayStatusMessage: Pointer;
  1202. function WlxDisplayStatusMessage;
  1203. begin
  1204.   GetProcedureAddress(_WlxDisplayStatusMessage, msgina, 'WlxDisplayStatusMessage');
  1205.   asm
  1206.     mov esp, ebp
  1207.     pop ebp
  1208.     jmp [_WlxDisplayStatusMessage]
  1209.   end;
  1210. end;
  1211. {$ELSE}
  1212. function WlxDisplayStatusMessage; external msgina name 'WlxDisplayStatusMessage';
  1213. {$ENDIF DYNAMIC_LINK}
  1214. {$IFDEF DYNAMIC_LINK}
  1215. var
  1216.   _WlxGetStatusMessage: Pointer;
  1217. function WlxGetStatusMessage;
  1218. begin
  1219.   GetProcedureAddress(_WlxGetStatusMessage, msgina, 'WlxGetStatusMessage');
  1220.   asm
  1221.     mov esp, ebp
  1222.     pop ebp
  1223.     jmp [_WlxGetStatusMessage]
  1224.   end;
  1225. end;
  1226. {$ELSE}
  1227. function WlxGetStatusMessage; external msgina name 'WlxGetStatusMessage';
  1228. {$ENDIF DYNAMIC_LINK}
  1229. {$IFDEF DYNAMIC_LINK}
  1230. var
  1231.   _WlxRemoveStatusMessage: Pointer;
  1232. function WlxRemoveStatusMessage;
  1233. begin
  1234.   GetProcedureAddress(_WlxRemoveStatusMessage, msgina, 'WlxRemoveStatusMessage');
  1235.   asm
  1236.     mov esp, ebp
  1237.     pop ebp
  1238.     jmp [_WlxRemoveStatusMessage]
  1239.   end;
  1240. end;
  1241. {$ELSE}
  1242. function WlxRemoveStatusMessage; external msgina name 'WlxRemoveStatusMessage';
  1243. {$ENDIF DYNAMIC_LINK}
  1244. {$ENDIF}
  1245. {$IFDEF MSGINA1_3}
  1246. {$IFDEF DYNAMIC_LINK}
  1247. var
  1248.   _WlxGetConsoleSwitchCredentials: Pointer;
  1249. function WlxGetConsoleSwitchCredentials;
  1250. begin
  1251.   GetProcedureAddress(_WlxGetConsoleSwitchCredentials, msgina, 'WlxGetConsoleSwitchCredentials');
  1252.   asm
  1253.     mov esp, ebp
  1254.     pop ebp
  1255.     jmp [_WlxGetConsoleSwitchCredentials]
  1256.   end;
  1257. end;
  1258. {$ELSE}
  1259. function WlxGetConsoleSwitchCredentials; external msgina name 'WlxGetConsoleSwitchCredentials';
  1260. {$ENDIF DYNAMIC_LINK}
  1261. {$IFDEF DYNAMIC_LINK}
  1262. var
  1263.   _WlxReconnectNotify: Pointer;
  1264. procedure WlxReconnectNotify;
  1265. begin
  1266.   GetProcedureAddress(_WlxReconnectNotify, msgina, 'WlxReconnectNotify');
  1267.   asm
  1268.     mov esp, ebp
  1269.     pop ebp
  1270.     jmp [_WlxReconnectNotify]
  1271.   end;
  1272. end;
  1273. {$ELSE}
  1274. procedure WlxReconnectNotify; external msgina name 'WlxReconnectNotify';
  1275. {$ENDIF DYNAMIC_LINK}
  1276. {$IFDEF DYNAMIC_LINK}
  1277. var
  1278.   _WlxDisconnectNotify: Pointer;
  1279. procedure WlxDisconnectNotify;
  1280. begin
  1281.   GetProcedureAddress(_WlxDisconnectNotify, msgina, 'WlxDisconnectNotify');
  1282.   asm
  1283.     mov esp, ebp
  1284.     pop ebp
  1285.     jmp [_WlxDisconnectNotify]
  1286.   end;
  1287. end;
  1288. {$ELSE}
  1289. procedure WlxDisconnectNotify; external msgina name 'WlxDisconnectNotify';
  1290. {$ENDIF DYNAMIC_LINK}
  1291. {$ENDIF}
  1292. {$ENDIF IMPORT_MS_GINA}
  1293. end.