(******************************************************************************
 ******************************************************************************
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 ___
                /   |                     ||              ||
               / _  |   ________ ___  ____||__    ___   __||
              / /_\ |  / __/ __//   |/  _/|   \  /   | /   |
             / ___  |__\\__\\  / /\ || |  | /\ \/ /\ |/ /\ | DOT NET
            /_/   \_/___/___/ /_____\|_|  |____/_____\\__/\|
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       [http://assarbad.info | http://assarbad.net | http://assarbad.org]

                                 _\\|//_
                                (` * * ')
 ______________________________ooO_(_)_Ooo_____________________________________
 LEGAL STUFF:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 Portions Copyright (c) 2003, -=Assarbad=- ["copyright holder"]
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

 1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
 3. The name(s) of the copyright holder(s) may not be used to endorse or
    promote products derived from this software without specific prior written
    permission.

 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                             .oooO     Oooo.
 ____________________________(   )_____(   )___________________________________
                              \ (       ) /
                               \_)     (_/

 Platform SDK Release: February 2003

 Original description and abstract:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ++ BUILD Version: 0001    Increment this if a change has global effects

  Copyright (c) 1985-1999, Microsoft Corporation

  Module Name:

    winwlx.h

  Abstract:

      WLX == WinLogon eXtension

      This file contains definitions, data types, and routine prototypes
      necessary to produce a replacement Graphical Identification aNd
      Authentication (GINA) DLL for Winlogon.

  Author:

      Richard Ward (RichardW) and Jim Kelly (JimK) May-1994

  Revision History:

  --
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ******************************************************************************
 ******************************************************************************)

unit WinWlx;
interface
uses
  Windows,
  Messages;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * #defines                                                                   *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

type
  _QUOTA_LIMITS = record
    PagedPoolLimit,
      NonPagedPoolLimit,
      MinimumWorkingSetSize,
      MaximumWorkingSetSize,
      PagefileLimit: LongWord;
    TimeLimit: TLargeInteger;
  end;
  QUOTA_LIMITS = _QUOTA_LIMITS;
  PQUOTA_LIMITS = ^_QUOTA_LIMITS;
  QuotaLimits = QUOTA_LIMITS;
  PQuotaLimits = PQUOTA_LIMITS;

(******************************************************************************
  Revisions of Winlogon API available for use by GINAs
  Version is two parts: Major revision and minor revision.
  Major revision is the upper 16-bits, minor is the lower 16-bits.
 ******************************************************************************)

const
  WLX_VERSION_1_0 = $00010000;
  WLX_VERSION_1_1 = $00010001;
  WLX_VERSION_1_2 = $00010002;
  WLX_VERSION_1_3 = $00010003;
  WLX_VERSION_1_4 = $00010004;
  WLX_CURRENT_VERSION = WLX_VERSION_1_4;


(******************************************************************************
  Secure attention sequence types
  These values are passed to routines that have a dwSasType
  parameter.

  ALL VALUES FROM 0 TO 127 ARE RESERVED FOR MICROSOFT DEFINITION.
  VALUES ABOVE 127 ARE RESERVED FOR CUSTOMER DEFINITION.

      CTRL_ALT_DEL - used to indicate that the standard ctrl-alt-del
          secure attention sequence has been entered.

      SCRNSVR_TIMEOUT - used to indicate that keyboard/mouse inactivity
          has lead to a screensaver activation.  It is up to the GINA
          DLL whether this constitutes a workstation locking event.

      SCRNSVR_ACTIVITY - used to indicate that keyboard or mouse
          activity occured while a secure screensaver was active.

      SC_INSERT - used to indicate that a smart card has been inserted
          to a compatible device

      SC_REMOVE - used to indicate that a smart card has been removed
          from a compatible device
 ******************************************************************************)

const
  WLX_SAS_TYPE_TIMEOUT = 0;
  WLX_SAS_TYPE_CTRL_ALT_DEL = 1;
  WLX_SAS_TYPE_SCRNSVR_TIMEOUT = 2;
  WLX_SAS_TYPE_SCRNSVR_ACTIVITY = 3;
  WLX_SAS_TYPE_USER_LOGOFF = 4;
  WLX_SAS_TYPE_SC_INSERT = 5;
  WLX_SAS_TYPE_SC_REMOVE = 6;
  WLX_SAS_TYPE_AUTHENTICATED = 7;
  WLX_SAS_TYPE_SC_FIRST_READER_ARRIVED = 8;
  WLX_SAS_TYPE_SC_LAST_READER_REMOVED = 9;
  WLX_SAS_TYPE_SWITCHUSER = 10;
  WLX_SAS_TYPE_MAX_MSFT_VALUE = 127;

(******************************************************************************
  This structure is available through WlxGetOption, and is
  passed as the lParam for any S/C SAS notices sent to windows
 ******************************************************************************)

type
  _WLX_SC_NOTIFICATION_INFO = record
    pszCard,
      pszReader,
      pszContainer,
      pszCryptoProvider: PWideChar;
  end;
  WLX_SC_NOTIFICATION_INFO = _WLX_SC_NOTIFICATION_INFO;
  PWLX_SC_NOTIFICATION_INFO = ^_WLX_SC_NOTIFICATION_INFO;
  TWlxScNotificationInfo = WLX_SC_NOTIFICATION_INFO;
  PWlxScNotificationInfo = PWLX_SC_NOTIFICATION_INFO;

(******************************************************************************
  Upon successful logon, the GINA DLL may specify any of the following
  options to Winlogon (via the dwOptions parameter of the WlxLoggedOutSas()
  api).  When set, these options specify:

       NO_PROFILE - Winlogon must NOT load a profile for the logged
                    on user.  Either the GINA DLL will take care of
                    this activity, or the user does not need a profile.
 ******************************************************************************)

const
  WLX_LOGON_OPT_NO_PROFILE = $00000001;

(******************************************************************************
  GINA DLLs are expected to return account information to Winlogon
  following a successful logon.  This information allows Winlogon
  to support profile loading and supplemental network providers.

  To allow different sets of profile information to be returned
  by GINAs over time, the first DWORD of each profile structure
  is expected to contain a type-identifier.  The following constants
  are the defined profile type identifiers.


  Standard profile is V2_0

 ******************************************************************************)

const
  WLX_PROFILE_TYPE_V1_0 = 1;
  WLX_PROFILE_TYPE_V2_0 = 2;

(******************************************************************************
  WlxLoggedOnSas() and WlxWkstaLockedSas() return an action
  value to Winlogon directing Winlogon to either remain unchanged
  or to perform some action (such as force-log the user off).
  These are the values that may be returned.  Note, however, that
  not all of the values may be returned by both of these api.  See
  the description of each api to see which values are expected from
  each.

   LOGON              - User has logged on
   NONE               - Don't change the state of the window station.
   LOCK_WKSTA         - Lock the workstation, wait for next SAS.
   LOGOFF             - Log the user off of the workstation.
   SHUTDOWN           - Log the user off and shutdown the machine.
   PWD_CHANGED        - Indicates that the user changed their password.  Notify network providers.
   TASKLIST           - Invoke the task list.
   UNLOCK_WKSTA       - Unlock the workstation.
   FORCE_LOGOFF       - Forcibly log the user off.
   SHUTDOWN_POWER_OFF - Turn off machine after shutting down.
   SHUTDOWN_REBOOT    - Reboot machine after shutting down.
   SHUTDOWN_SLEEP     - Put the machine to sleep
   SHUTDOWN_SLEEP2    - Put the machine to sleep and disable wakeup events
   SHUTDOWN_HIBERNATE - Hibernate the machine
   RECONNECTED        - Session was reconnected to an earlier session
 ******************************************************************************)

const
  WLX_SAS_ACTION_LOGON = 1;
  WLX_SAS_ACTION_NONE = 2;
  WLX_SAS_ACTION_LOCK_WKSTA = 3;
  WLX_SAS_ACTION_LOGOFF = 4;
  WLX_SAS_ACTION_SHUTDOWN = 5;
  WLX_SAS_ACTION_PWD_CHANGED = 6;
  WLX_SAS_ACTION_TASKLIST = 7;
  WLX_SAS_ACTION_UNLOCK_WKSTA = 8;
  WLX_SAS_ACTION_FORCE_LOGOFF = 9;
  WLX_SAS_ACTION_SHUTDOWN_POWER_OFF = 10;
  WLX_SAS_ACTION_SHUTDOWN_REBOOT = 11;
  WLX_SAS_ACTION_SHUTDOWN_SLEEP = 12;
  WLX_SAS_ACTION_SHUTDOWN_SLEEP2 = 13;
  WLX_SAS_ACTION_SHUTDOWN_HIBERNATE = 14;
  WLX_SAS_ACTION_RECONNECTED = 15;
  WLX_SAS_ACTION_DELAYED_FORCE_LOGOFF = 16;
  WLX_SAS_ACTION_SWITCH_CONSOLE = 17;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * Window Messages                                                            *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

(******************************************************************************
  The WM_SAS is defined as follows

   The wParam parameter has the SAS Type (above)
 ******************************************************************************)

const
  WLX_WM_SAS = WM_USER + 601;

(******************************************************************************
  Dialog return values

  These may be returned by dialogs started by a GINA dll.
 ******************************************************************************)
const
  WLX_DLG_SAS = 101;
// Input (keys, etc) timed out
  WLX_DLG_INPUT_TIMEOUT = 102;
// Screen Saver activated
  WLX_DLG_SCREEN_SAVER_TIMEOUT = 103;
// User logged off
  WLX_DLG_USER_LOGOFF = 104;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * #data types                                                                *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

(******************************************************************************
  The WLX_PROFILE_* structure is returned from a GINA DLL
  following authentication.  This information is used by Winlogon
  to support supplemental Network Providers and to load the
  newly logged-on user's profile.

  Winlogon is responsible for freeing both the profile structure
  and the fields within the structure that are marked as separately
  deallocatable.
 ******************************************************************************)

type
  _WLX_PROFILE_V1_0 = record
// This field identifies the type of profile being returned by a
// GINA DLL.  Profile types are defined with the prefix
// WLX_PROFILE_TYPE_xxx.  It allows Winlogon to typecast the
// structure so the remainder of the structure may be referenced.
    dwType: DWORD;
// pathname of profile to load for user.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszProfile: PWideChar;
  end;
  WLX_PROFILE_V1_0 = _WLX_PROFILE_V1_0;
  PWLX_PROFILE_V1_0 = ^_WLX_PROFILE_V1_0;
  TWlxProfileV1_0 = WLX_PROFILE_V1_0;
  PWlxProfileV1_0 = PWLX_PROFILE_V1_0;

type
  _WLX_PROFILE_V2_0 = record
// This field identifies the type of profile being returned by a
// GINA DLL.  Profile types are defined with the prefix
// WLX_PROFILE_TYPE_xxx.  It allows Winlogon to typecast the
// structure so the remainder of the structure may be referenced.
    dwType: DWORD;
// pathname of profile to load for user.
//
// This parameter can be NULL.  If so, the user has a local
// profile only.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszProfile,
// pathname of policy to load for user.
//
// This parameter can be NULL which prevents network wide policy
// from being applied.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszPolicy,
// pathname of network default user profile
//
// This parameter can be NULL, which causes the Default User
// profile on the local machine to be used.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszNetworkDefaultUserProfile,
// name of the server which validated the user account
//
// This is used to enumerate globals groups the user belongs
// to for policy support.  This parameter can be NULL.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszServerName,
// pointer to a series of null terminated environment variables
//
// envname=environment variable value
//   - or -
// envname=%OtherVar%\more text
//
// Each environment variable is NULL terminated with the last
// environment variable double NULL terminated.  These variables
// are set into the user's initial environment.  The environment
// variable value can contain other environment variables wrapped
// in "%" signs. This parameter can be NULL.
//
// The buffer pointed to by this field must be separately allocated.
// Winlogon will free the buffer when it is no longer needed.
    pszEnvironment: PWideChar;
  end;
  WLX_PROFILE_V2_0 = _WLX_PROFILE_V2_0;
  PWLX_PROFILE_V2_0 = ^_WLX_PROFILE_V2_0;
  TWlxProfileV2_0 = WLX_PROFILE_V2_0;
  PWlxProfileV2_0 = PWLX_PROFILE_V2_0;

(******************************************************************************
  The WLX_NPR_NOTIFICATION_INFO structure is returned
  from a GINA DLL following successful authentication.
  This information is used by Winlogon to provide
  identification and authentication information already
  collected to network providers.  Winlogon is
  responsible for freeing both the main structure and all
  string and other buffers pointed to from within the
  structure.
 ******************************************************************************)

type
  _WLX_MPR_NOTIFY_INFO = record
// The name of the account logged onto (e.g. REDMOND\Joe).
// The string pointed to by this field must be separately
// allocated and will be separately deallocated by Winlogon.
    pszUserName,
// The string pointed to by this field must be separately
// allocated and will be separately deallocated by Winlogon.
    pszDomain,
// Cleartext password of the user account.  If the OldPassword
// field is non-null, then this field contains the new password
// in a password change operation.  The string pointed to by
// this field must be separately allocated and will be seperately
// deallocated by Winlogon.
    pszPassword,
// Cleartext old password of the user account whose password
// has just been changed.  The Password field contains the new
// password.  The string pointed to by this field must be
// separately allocated and will be separately deallocated by
// Winlogon.
    pszOldPassword: PWideChar;
  end;
  WLX_MPR_NOTIFY_INFO = _WLX_MPR_NOTIFY_INFO;
  PWLX_MPR_NOTIFY_INFO = ^_WLX_MPR_NOTIFY_INFO;
  TWlxMprNotifyInfo = WLX_MPR_NOTIFY_INFO;
  PWlxMprNotifyInfo = PWLX_MPR_NOTIFY_INFO;

(******************************************************************************
  WLX_TERMINAL_SERVICES_DATA is used by the GINA during a
  WlxQueryTerminalServicesData() callback into WinLogon from the
  WlxLoggedOutSAS() context, after the user name and domain are known.
  This structure relates to TS user configuration information which is
  retrieved from the Domain Controller and SAM database. Having WinLogon
  pass this information means the GINA does not need to do the same
  off-machines lookups again.
 ******************************************************************************)

const
  WLX_DIRECTORY_LENGTH = 256;

type
  _WLX_TERMINAL_SERVICES_DATA = record
// TS profile path, overrides the standard profile path.
    ProfilePath: array[0..WLX_DIRECTORY_LENGTH] of WideChar;
// TS home directory, overrides standard home directory.
    HomeDir: array[0..WLX_DIRECTORY_LENGTH] of WideChar;
// TS home directory drive, overrides standard drive.
    HomeDirDrive: array[0..4 - 1] of WideChar;
  end;
  WLX_TERMINAL_SERVICES_DATA = _WLX_TERMINAL_SERVICES_DATA;
  PWLX_TERMINAL_SERVICES_DATA = ^_WLX_TERMINAL_SERVICES_DATA;
  TWlxTerminalServicesData = WLX_TERMINAL_SERVICES_DATA;
  PWlxTerminalServicesData = PWLX_TERMINAL_SERVICES_DATA;

(******************************************************************************
  The WLX_CLIENT_CREDENTIALS_INFO structure is returned
  from winlogon from the WlxQueryClientCredentials() call.

  This allows a network client WinStation to pass client
  credentials for automatic logon.

  The MSGINA DLL is responsible for freeing the memory
  and substrings with LocalFree().
 ******************************************************************************)

const
  WLX_CREDENTIAL_TYPE_V1_0 = 1;
  WLX_CREDENTIAL_TYPE_V2_0 = 2;

type
  _WLX_CLIENT_CREDENTIALS_INFO = record
// This field identifies the type of credentials structure being allocated
// by GINA DLL.  Credential types are defined with the prefix
// WLX_CREDENTIAL_TYPE_xxx.  It allows Winlogon to typecast the
// structure so the remainder of the structure may be referenced.
    dwType: DWORD;
    pszUserName,
      pszDomain,
      pszPassword: PWideChar;
// This field forces a prompt for the password. This
// is due to an administrator override.
//
// This allows the distinguishing of autologon
// with no password.
    fPromptForPassword: BOOL;
  end;
  WLX_CLIENT_CREDENTIALS_INFO_V1_0 = _WLX_CLIENT_CREDENTIALS_INFO;
  PWLX_CLIENT_CREDENTIALS_INFO_V1_0 = ^_WLX_CLIENT_CREDENTIALS_INFO;
  TWlxClientCredentialsInfoV1_0 = WLX_CLIENT_CREDENTIALS_INFO_V1_0;
  PWlxClientCredentialsInfoV1_0 = PWLX_CLIENT_CREDENTIALS_INFO_V1_0;

type
  _WLX_CLIENT_CREDENTIALS_INFO_2_0 = record
    dwType: DWORD;
    pszUserName,
      pszDomain,
      pszPassword: PWideChar;
    fPromptForPassword: BOOL;
// This field tells winlogon to disconnect/abort the logon attempt if the
// provided password is incorrect, or if it should reprompt (current
// behavior)
    fDisconnectOnLogonFailure: BOOL;
  end;
  WLX_CLIENT_CREDENTIALS_INFO_V2_0 = _WLX_CLIENT_CREDENTIALS_INFO_2_0;
  PWLX_CLIENT_CREDENTIALS_INFO_V2_0 = ^_WLX_CLIENT_CREDENTIALS_INFO_2_0;
  TWlxClientCredentialsInfoV2_0 = WLX_CLIENT_CREDENTIALS_INFO_V2_0;
  PWlxClientCredentialsInfoV2_0 = PWLX_CLIENT_CREDENTIALS_INFO_V2_0;

(******************************************************************************
  The WLX_CONSOLESWITCH_CREDENTIALS_INFO structure is returned
  from gina in response to WlxGetConsoleSwitchCredentials calls.

  This structure is also returned from winlogon in response to
  to WlxQueryConsoleSwitchCredentials call

  This is used to implement single session Terminal Server. A remote
  session winlogon calls WlxGetConsoleSwitchCredentials to get the token
  and other info of the logged on user from msgina. This info is then passed to
  the console session winlogon to autologon the user on the console session.
  The gina on console session calls WlxQueryConsoleSwitchCredentials to get
  this info from winlogon and logs on the user.

  The caller is responsible for freeing the memory
  and substrings with LocalFree().
 ******************************************************************************)

const
  WLX_CONSOLESWITCHCREDENTIAL_TYPE_V1_0 = 1;

type
  _WLX_CONSOLESWITCH_CREDENTIALS_INFO = record
// This field identifies the type of credentials structure being allocated
// Credential types are defined with the prefix
// WLX_CONSOLESWITCHCREDENTIAL_TYPE_xxx.  It allows Winlogon to typecast the
// structure so the remainder of the structure may be referenced.
    dwType: DWORD;
    UserToken: THandle;
    LogonId: TLargeInteger; // LUID
    Quotas: QUOTA_LIMITS;
    UserName,
      Domain: PWideChar;
    LogonTime: TLargeInteger;
    SmartCardLogon: BOOL;
    ProfileLength: ULONG;
// From MSV1_0_INTERACTIVE_PROFILE
    MessageType: DWORD;
    LogonCount: Word;
    BadPasswordCount: Word;
    ProfileLogonTime,
      LogoffTime,
      KickOffTime,
      PasswordLastSet,
      PasswordCanChange,
      PasswordMustChange: TLargeInteger;
    LogonScript,
      HomeDirectory,
      FullName,
      ProfilePath,
      HomeDirectoryDrive,
      LogonServer: PWideChar;
    UserFlags: ULONG;
    PrivateDataLen: ULONG;
    PrivateData: PByte;
  end;
  WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = _WLX_CONSOLESWITCH_CREDENTIALS_INFO;
  PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = ^_WLX_CONSOLESWITCH_CREDENTIALS_INFO;
  TWlxConsoleswitchCredentialsInfoV1_0 = WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;
  PWlxConsoleswitchCredentialsInfoV1_0 = PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * Services that replacement GINAs   ** MUST ** provide                       *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

type
  TFNWlxNegotiate = function(
    dwWinlogonVersion: DWORD;
    pdwDllVersion: PDWORD
    ): BOOL; stdcall;

type
  TFNWlxInitialize = function(
    lpWinsta: PWideChar;
    hWlx: THandle;
    pvReserved: Pointer;
    pWinlogonFunctions: Pointer;
    var pWlxContext: Pointer
    ): BOOL; stdcall;

type
  TFNWlxDisplaySASNotice = procedure(
    pWlxContext: Pointer
    ); stdcall;

type
  TFNWlxLoggedOutSAS = function(
    pWlxContext: Pointer;
    dwSasType: DWORD;
    pAuthenticationId: PLargeInteger; // PLUID
    pLogonSid: Pointer; // PSID
    pdwOptions: PDWORD;
    var phToken: THandle;
    pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO;
    var pProfile: Pointer
    ): Integer; stdcall;

type
  TFNWlxActivateUserShell = function(
    pWlxContext: Pointer;
    pszDesktopName: PWideChar;
    pszMprLogonScript: PWideChar;
    pEnvironment: Pointer
    ): BOOL; stdcall;

type
  TFNWlxLoggedOnSAS = function(
    pWlxContext: Pointer;
    dwSasType: DWORD;
    pReserved: Pointer
    ): Integer; stdcall;

type
  TFNWlxDisplayLockedNotice = procedure(
    pWlxContext: Pointer
    ); stdcall;

type
  TFNWlxWkstaLockedSAS = function(
    pWlxContext: Pointer;
    dwSasType: DWORD
    ): Integer; stdcall;

type
  TFNWlxIsLockOk = function(
    pWlxContext: Pointer
    ): BOOL; stdcall;

type
  TFNWlxIsLogoffOk = function(
    pWlxContext: Pointer
    ): BOOL; stdcall;

type
  TFNWlxLogoff = procedure(
    pWlxContext: Pointer
    ); stdcall;

type
  TFNWlxShutdown = procedure(
    pWlxContext: Pointer;
    ShutdownType: DWORD
    ); stdcall;

(******************************************************************************
  NEW for version 1.1
 ******************************************************************************)

type
  TFNWlxScreenSaverNotify = function(
    pWlxContext: Pointer;
    var pSecure: BOOL
    ): BOOL; stdcall;

type
  TFNWlxStartApplication = function(
    pWlxContext: Pointer;
    pszDesktopName: PWideChar;
    pEnvironment: Pointer;
    pszCmdLine: PWideChar
    ): BOOL; stdcall;

(******************************************************************************
  New for 1.3
 ******************************************************************************)

type
  TFNWlxNetworkProviderLoad = function(
    pWlxContext: Pointer;
    pNprNotifyInfo: PWLX_MPR_NOTIFY_INFO
    ): BOOL; stdcall;

const
  STATUSMSG_OPTION_NOANIMATION = $00000001;
  STATUSMSG_OPTION_SETFOREGROUND = $00000002;

type
  TFNWlxDisplayStatusMessage = function(
    pWlxContext: Pointer;
    hDesktop: HDESK;
    dwOptions: DWORD;
    pTitle: PWideChar;
    pMessage: PWideChar
    ): BOOL; stdcall;

type
  TFNWlxGetStatusMessage = function(
    pWlxContext: Pointer;
    var pdwOptions: DWORD;
    pMessage: PWideChar;
    dwBufferSize: DWORD
    ): BOOL; stdcall;

type
  TFNWlxRemoveStatusMessage = function(
    pWlxContext: Pointer
    ): BOOL; stdcall;

(******************************************************************************
  New for 1.4
 ******************************************************************************)

type
  TFNWlxGetConsoleSwitchCredentials = function(
    pWlxContext: Pointer;
    pCredInfo: Pointer
    ): BOOL; stdcall;

type
  TFNWlxReconnectNotify = procedure(
    pWlxContext: Pointer
    ); stdcall;

type
  TFNWlxDisconnectNotify = procedure(
    pWlxContext: Pointer
    ); stdcall;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * Services that Winlogon provides                                            *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

type
  _WLX_DESKTOP = record
    Size: DWORD;
    Flags: DWORD;
    hDesktop: HDESK;
    pszDesktopName: PWideChar;
  end;
  WLX_DESKTOP = _WLX_DESKTOP;
  PWLX_DESKTOP = ^_WLX_DESKTOP;
  TWlxDesktop = WLX_DESKTOP;
  PWlxDesktop = PWLX_DESKTOP;

const
  WLX_DESKTOP_NAME = $00000001; // Name present
  WLX_DESKTOP_HANDLE = $00000002; // Handle present

type
  PWLX_USE_CTRL_ALT_DEL = procedure(
    hWlx: THandle
    ); stdcall;
  TFNWlxUseCtrlAltDel = PWLX_USE_CTRL_ALT_DEL;

type
  PWLX_SET_CONTEXT_POINTER = procedure(
    hWlx: THandle;
    pWlxContext: Pointer
    ); stdcall;
  TFNWlxSetContextPointer = PWLX_SET_CONTEXT_POINTER;

type
  PWLX_SAS_NOTIFY = procedure(
    hWlx: THandle;
    dwSasType: DWORD
    ); stdcall;
  TFNWlxSasNotify = PWLX_SAS_NOTIFY;

type
  PWLX_SET_TIMEOUT = function(
    hWlx: THandle;
    Timeout: DWORD
    ): BOOL; stdcall;
  TFNWlxSetTimeout = PWLX_SET_TIMEOUT;

type
  PWLX_ASSIGN_SHELL_PROTECTION = function(
    hWlx: THandle;
    hToken: THandle;
    hProcess: THandle;
    hThread: THandle
    ): Integer; stdcall;
  TFNWlxAssignShellProtection = PWLX_ASSIGN_SHELL_PROTECTION;

type
  PWLX_MESSAGE_BOX = function(
    hWlx: THandle;
    hwndOwner: HWND;
    lpszText: PWideChar;
    lpszTitle: PWideChar;
    fuStyle: UINT
    ): Integer; stdcall;
  TFNWlxMessageBox = PWLX_MESSAGE_BOX;

type
  PWLX_DIALOG_BOX = function(
    hWlx: THandle;
    hInst: THandle;
    lpszTemplate: PWideChar;
    hwndOwner: HWND;
    dlgprc: TFNDlgProc
    ): Integer; stdcall;
  TFNWlxDialogBox = PWLX_DIALOG_BOX;

type
  PWLX_DIALOG_BOX_INDIRECT = function(
    hWlx: THandle;
    hInst: THandle;
    hDialogTemplate: PDlgTemplate;
    hwndOwner: HWND;
    dlgprc: TFNDlgProc
    ): Integer; stdcall;
  TFNWlxDialogBoxIndirect = PWLX_DIALOG_BOX_INDIRECT;

type
  PWLX_DIALOG_BOX_PARAM = function(
    hWlx: THandle;
    hInst: THandle;
    lpszTemplate: PWideChar;
    hwndOwner: HWND;
    dlgprc: TFNDlgProc;
    dwInitParam: LPARAM
    ): Integer; stdcall;
  TFNWlxDialogBoxParam = PWLX_DIALOG_BOX_PARAM;

type
  PWLX_DIALOG_BOX_INDIRECT_PARAM = function(
    hWlx: THandle;
    hInst: THandle;
    hDialogTemplate: PDlgTemplate;
    hwndOwner: HWND;
    dlgprc: TFNDlgProc;
    dwInitParam: LPARAM
    ): Integer; stdcall;
  TFNWlxDialogBoxIndirectParam = PWLX_DIALOG_BOX_INDIRECT_PARAM;

type
  PWLX_SWITCH_DESKTOP_TO_USER = function(
    hWlx: THandle
    ): Integer; stdcall;
  TFNWlxSwitchDesktopToUser = PWLX_SWITCH_DESKTOP_TO_USER;

type
  PWLX_SWITCH_DESKTOP_TO_WINLOGON = function(
    hWlx: THandle
    ): Integer; stdcall;
  TFNWlxSwitchDesktopToWinlogon = PWLX_SWITCH_DESKTOP_TO_WINLOGON;

type
  PWLX_CHANGE_PASSWORD_NOTIFY = function(
    hWlx: THandle;
    pMprInfo: PWLX_MPR_NOTIFY_INFO;
    dwChangeInfo: DWORD
    ): Integer; stdcall;
  TFNWlxChangePasswordNotify = PWLX_CHANGE_PASSWORD_NOTIFY;

type
  PWLX_GET_SOURCE_DESKTOP = function(
    hWlx: THandle;
    var ppDesktop: PWLX_DESKTOP
    ): BOOL; stdcall;
  TFNWlxGetSourceDesktop = PWLX_GET_SOURCE_DESKTOP;

type
  PWLX_SET_RETURN_DESKTOP = function(
    hWlx: THandle;
    pDesktop: PWLX_DESKTOP
    ): BOOL; stdcall;
  TFNWlxSetReturnDesktop = PWLX_SET_RETURN_DESKTOP;

type
  PWLX_CREATE_USER_DESKTOP = function(
    hWlx: THandle;
    hToken: THandle;
    Flags: DWORD;
    pszDesktopName: PWideChar;
    var ppDesktop: PWLX_DESKTOP
    ): BOOL; stdcall;
  TFNWlxCreateUserDesktop = PWLX_CREATE_USER_DESKTOP;

const
  WLX_CREATE_INSTANCE_ONLY = $00000001;
  WLX_CREATE_USER = $00000002;

type
  PWLX_CHANGE_PASSWORD_NOTIFY_EX = function(
    hWlx: THandle;
    pMprInfo: PWLX_MPR_NOTIFY_INFO;
    dwChangeInfo: DWORD;
    ProviderName: PWideChar;
    Reserved: Pointer
    ): Integer; stdcall;
  TFNWlxChangePasswordNotifyEx = PWLX_CHANGE_PASSWORD_NOTIFY_EX;

type
  PWLX_CLOSE_USER_DESKTOP = function(
    hWlx: THandle;
    pDesktop: PWLX_DESKTOP;
    hToken: THandle
    ): BOOL; stdcall;
  TFNWlxCloseUserDesktop = PWLX_CLOSE_USER_DESKTOP;

type
  PWLX_SET_OPTION = function(
    hWlx: THandle;
    Option: DWORD;
    Value: ULONG;
    var OldValue: ULONG
    ): BOOL; stdcall;
  TFNWlxSetOption = PWLX_SET_OPTION;

type
  PWLX_GET_OPTION = function(
    hWlx: THandle;
    Option: DWORD;
    var Value: ULONG
    ): BOOL; stdcall;
  TFNWlxGetOption = PWLX_GET_OPTION;

type
  PWLX_WIN31_MIGRATE = procedure(
    hWlx: THandle
    ); stdcall;
  TFNWlxWin31Migrate = PWLX_WIN31_MIGRATE;

type
  PWLX_QUERY_CLIENT_CREDENTIALS = function(
    pCred: PWLX_CLIENT_CREDENTIALS_INFO_V1_0
    ): BOOL; stdcall;
  TFNWlxQueryClientCredentials = PWLX_QUERY_CLIENT_CREDENTIALS;

type
  PWLX_QUERY_IC_CREDENTIALS = function(
    pCred: PWLX_CLIENT_CREDENTIALS_INFO_V1_0
    ): BOOL; stdcall;
  TFNWlxQueryInetConnectorCredentials = PWLX_QUERY_IC_CREDENTIALS;

type
  PWLX_QUERY_TS_LOGON_CREDENTIALS = function(
    pCred: PWLX_CLIENT_CREDENTIALS_INFO_V2_0
    ): BOOL; stdcall;
  TFNWlxQueryTsLogonCredentials = PWLX_QUERY_TS_LOGON_CREDENTIALS;

type
  PWLX_DISCONNECT = function(
    ): BOOL; stdcall;
  TFNWlxDisconnect = PWLX_DISCONNECT;

type
  PWLX_QUERY_TERMINAL_SERVICES_DATA = function(
    hWlx: THandle;
    pTSData: PWLX_TERMINAL_SERVICES_DATA;
    UserName: PWideChar;
    Domain: PWideChar
    ): DWORD; stdcall;
  TFNWlxQueryTerminalServicesData = PWLX_QUERY_TERMINAL_SERVICES_DATA;

type
  PWLX_QUERY_CONSOLESWITCH_CREDENTIALS = function(
    pCred: PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0
    ): DWORD; stdcall;
  TFNWlxQueryConsoleSwitchCredentials = PWLX_QUERY_CONSOLESWITCH_CREDENTIALS;

(******************************************************************************
  Options that can be get or set:
 ******************************************************************************)

const
  WLX_OPTION_USE_CTRL_ALT_DEL = $00000001;
  WLX_OPTION_CONTEXT_POINTER = $00000002;
  WLX_OPTION_USE_SMART_CARD = $00000003;
  WLX_OPTION_FORCE_LOGOFF_TIME = $00000004;
  WLX_OPTION_IGNORE_AUTO_LOGON = $00000008;
  WLX_OPTION_NO_SWITCH_ON_SAS = $00000009;

(******************************************************************************
  Options that can be queried only:
 ******************************************************************************)

const
  WLX_OPTION_SMART_CARD_PRESENT = $00010001;
  WLX_OPTION_SMART_CARD_INFO = $00010002;
  WLX_OPTION_DISPATCH_TABLE_SIZE = $00010003;

(******************************************************************************
 ******************************************************************************
 *                                                                            *
 * Function dispatch tables.                                                  *
 * One of the following tables will be passed to the GINA DLL                 *
 * in the WlxInitialize() call during initialization.                         *
 *                                                                            *
 ******************************************************************************
 ******************************************************************************)

type
  _WLX_DISPATCH_VERSION_1_0 = record
    WlxUseCtrlAltDel: TFNWlxUseCtrlAltDel;
    WlxSetContextPointer: TFNWlxSetContextPointer;
    WlxSasNotify: TFNWlxSasNotify;
    WlxSetTimeout: TFNWlxSetTimeout;
    WlxAssignShellProtection: TFNWlxAssignShellProtection;
    WlxMessageBox: TFNWlxMessageBox;
    WlxDialogBox: TFNWlxDialogBox;
    WlxDialogBoxParam: TFNWlxDialogBoxParam;
    WlxDialogBoxIndirect: TFNWlxDialogBoxIndirect;
    WlxDialogBoxIndirectParam: TFNWlxDialogBoxIndirectParam;
    WlxSwitchDesktopToUser: TFNWlxSwitchDesktopToUser;
    WlxSwitchDesktopToWinlogon: TFNWlxSwitchDesktopToWinlogon;
    WlxChangePasswordNotify: TFNWlxChangePasswordNotify;
  end;
  WLX_DISPATCH_VERSION_1_0 = _WLX_DISPATCH_VERSION_1_0;
  PWLX_DISPATCH_VERSION_1_0 = ^_WLX_DISPATCH_VERSION_1_0;
  TWlxDispatchVersion1_0 = WLX_DISPATCH_VERSION_1_0;
  PWlxDispatchVersion1_0 = PWLX_DISPATCH_VERSION_1_0;

type
  _WLX_DISPATCH_VERSION_1_1 = record
    WlxUseCtrlAltDel: TFNWlxUseCtrlAltDel;
    WlxSetContextPointer: TFNWlxSetContextPointer;
    WlxSasNotify: TFNWlxSasNotify;
    WlxSetTimeout: TFNWlxSetTimeout;
    WlxAssignShellProtection: TFNWlxAssignShellProtection;
    WlxMessageBox: TFNWlxMessageBox;
    WlxDialogBox: TFNWlxDialogBox;
    WlxDialogBoxParam: TFNWlxDialogBoxParam;
    WlxDialogBoxIndirect: TFNWlxDialogBoxIndirect;
    WlxDialogBoxIndirectParam: TFNWlxDialogBoxIndirectParam;
    WlxSwitchDesktopToUser: TFNWlxSwitchDesktopToUser;
    WlxSwitchDesktopToWinlogon: TFNWlxSwitchDesktopToWinlogon;
    WlxChangePasswordNotify: TFNWlxChangePasswordNotify;
    WlxGetSourceDesktop: TFNWlxGetSourceDesktop;
    WlxSetReturnDesktop: TFNWlxSetReturnDesktop;
    WlxCreateUserDesktop: TFNWlxCreateUserDesktop;
    WlxChangePasswordNotifyEx: TFNWlxChangePasswordNotifyEx;
  end;
  WLX_DISPATCH_VERSION_1_1 = _WLX_DISPATCH_VERSION_1_1;
  PWLX_DISPATCH_VERSION_1_1 = ^_WLX_DISPATCH_VERSION_1_1;
  TWlxDispatchVersion1_1 = WLX_DISPATCH_VERSION_1_1;
  PWlxDispatchVersion1_1 = PWLX_DISPATCH_VERSION_1_1;

type
  _WLX_DISPATCH_VERSION_1_2 = record
    WlxUseCtrlAltDel: TFNWlxUseCtrlAltDel;
    WlxSetContextPointer: TFNWlxSetContextPointer;
    WlxSasNotify: TFNWlxSasNotify;
    WlxSetTimeout: TFNWlxSetTimeout;
    WlxAssignShellProtection: TFNWlxAssignShellProtection;
    WlxMessageBox: TFNWlxMessageBox;
    WlxDialogBox: TFNWlxDialogBox;
    WlxDialogBoxParam: TFNWlxDialogBoxParam;
    WlxDialogBoxIndirect: TFNWlxDialogBoxIndirect;
    WlxDialogBoxIndirectParam: TFNWlxDialogBoxIndirectParam;
    WlxSwitchDesktopToUser: TFNWlxSwitchDesktopToUser;
    WlxSwitchDesktopToWinlogon: TFNWlxSwitchDesktopToWinlogon;
    WlxChangePasswordNotify: TFNWlxChangePasswordNotify;
    WlxGetSourceDesktop: TFNWlxGetSourceDesktop;
    WlxSetReturnDesktop: TFNWlxSetReturnDesktop;
    WlxCreateUserDesktop: TFNWlxCreateUserDesktop;
    WlxChangePasswordNotifyEx: TFNWlxChangePasswordNotifyEx;
    WlxCloseUserDesktop: TFNWlxCloseUserDesktop;
  end;
  WLX_DISPATCH_VERSION_1_2 = _WLX_DISPATCH_VERSION_1_2;
  PWLX_DISPATCH_VERSION_1_2 = ^_WLX_DISPATCH_VERSION_1_2;
  TWlxDispatchVersion1_2 = WLX_DISPATCH_VERSION_1_2;
  PWlxDispatchVersion1_2 = PWLX_DISPATCH_VERSION_1_2;

type
  _WLX_DISPATCH_VERSION_1_3 = record
    WlxUseCtrlAltDel: TFNWlxUseCtrlAltDel;
    WlxSetContextPointer: TFNWlxSetContextPointer;
    WlxSasNotify: TFNWlxSasNotify;
    WlxSetTimeout: TFNWlxSetTimeout;
    WlxAssignShellProtection: TFNWlxAssignShellProtection;
    WlxMessageBox: TFNWlxMessageBox;
    WlxDialogBox: TFNWlxDialogBox;
    WlxDialogBoxParam: TFNWlxDialogBoxParam;
    WlxDialogBoxIndirect: TFNWlxDialogBoxIndirect;
    WlxDialogBoxIndirectParam: TFNWlxDialogBoxIndirectParam;
    WlxSwitchDesktopToUser: TFNWlxSwitchDesktopToUser;
    WlxSwitchDesktopToWinlogon: TFNWlxSwitchDesktopToWinlogon;
    WlxChangePasswordNotify: TFNWlxChangePasswordNotify;
    WlxGetSourceDesktop: TFNWlxGetSourceDesktop;
    WlxSetReturnDesktop: TFNWlxSetReturnDesktop;
    WlxCreateUserDesktop: TFNWlxCreateUserDesktop;
    WlxChangePasswordNotifyEx: TFNWlxChangePasswordNotifyEx;
    WlxCloseUserDesktop: TFNWlxCloseUserDesktop;
    WlxSetOption: TFNWlxSetOption;
    WlxGetOption: TFNWlxGetOption;
    WlxWin31Migrate: TFNWlxWin31Migrate;
    WlxQueryClientCredentials: TFNWlxQueryClientCredentials;
    WlxQueryInetConnectorCredentials: TFNWlxQueryInetConnectorCredentials;
    WlxDisconnect: TFNWlxDisconnect;
    WlxQueryTerminalServicesData: TFNWlxQueryTerminalServicesData;
  end;
  WLX_DISPATCH_VERSION_1_3 = _WLX_DISPATCH_VERSION_1_3;
  PWLX_DISPATCH_VERSION_1_3 = ^_WLX_DISPATCH_VERSION_1_3;
  TWlxDispatchVersion1_3 = WLX_DISPATCH_VERSION_1_3;
  PWlxDispatchVersion1_3 = PWLX_DISPATCH_VERSION_1_3;

type
  _WLX_DISPATCH_VERSION_1_4 = record
    WlxUseCtrlAltDel: TFNWlxUseCtrlAltDel;
    WlxSetContextPointer: TFNWlxSetContextPointer;
    WlxSasNotify: TFNWlxSasNotify;
    WlxSetTimeout: TFNWlxSetTimeout;
    WlxAssignShellProtection: TFNWlxAssignShellProtection;
    WlxMessageBox: TFNWlxMessageBox;
    WlxDialogBox: TFNWlxDialogBox;
    WlxDialogBoxParam: TFNWlxDialogBoxParam;
    WlxDialogBoxIndirect: TFNWlxDialogBoxIndirect;
    WlxDialogBoxIndirectParam: TFNWlxDialogBoxIndirectParam;
    WlxSwitchDesktopToUser: TFNWlxSwitchDesktopToUser;
    WlxSwitchDesktopToWinlogon: TFNWlxSwitchDesktopToWinlogon;
    WlxChangePasswordNotify: TFNWlxChangePasswordNotify;
    WlxGetSourceDesktop: TFNWlxGetSourceDesktop;
    WlxSetReturnDesktop: TFNWlxSetReturnDesktop;
    WlxCreateUserDesktop: TFNWlxCreateUserDesktop;
    WlxChangePasswordNotifyEx: TFNWlxChangePasswordNotifyEx;
    WlxCloseUserDesktop: TFNWlxCloseUserDesktop;
    WlxSetOption: TFNWlxSetOption;
    WlxGetOption: TFNWlxGetOption;
    WlxWin31Migrate: TFNWlxWin31Migrate;
    WlxQueryClientCredentials: TFNWlxQueryClientCredentials;
    WlxQueryInetConnectorCredentials: TFNWlxQueryInetConnectorCredentials;
    WlxDisconnect: TFNWlxDisconnect;
    WlxQueryTerminalServicesData: TFNWlxQueryTerminalServicesData;
    WlxQueryConsoleSwitchCredentials: TFNWlxQueryConsoleSwitchCredentials;
    WlxQueryTsLogonCredentials: TFNWlxQueryTsLogonCredentials;
  end;
  WLX_DISPATCH_VERSION_1_4 = _WLX_DISPATCH_VERSION_1_4;
  PWLX_DISPATCH_VERSION_1_4 = ^_WLX_DISPATCH_VERSION_1_4;
  TWlxDispatchVersion1_4 = WLX_DISPATCH_VERSION_1_4;
  PWlxDispatchVersion1_4 = PWLX_DISPATCH_VERSION_1_4;

(******************************************************************************
  Non-GINA notification DLLs
 ******************************************************************************)

type
  PFNMSGECALLBACK = function(
    bVerbose: BOOL;
    lpMessage: PWideChar
    ): DWORD; stdcall;

type
  _WLX_NOTIFICATION_INFO = record
    Size: ULONG;
    Flags: ULONG;
    UserName,
      Domain,
      WindowStation: PWideChar;
    hToken: THandle;
    hDesktop: HDESK;
    pStatusCallback: PFNMSGECALLBACK;
  end;
  WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
  PWLX_NOTIFICATION_INFO = ^_WLX_NOTIFICATION_INFO;
  TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
  PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;

implementation
end.

{
//-----------------------------------------------------------------------------
// There will be some overlapping names, therefore this area is commented!!!
// This is more thought to be a reference!
//-----------------------------------------------------------------------------
// Windows 2000 Professional Logo (413x72@8BPP)
#define                 IDB_W2KPRO_LOGO_SMALL8BPP       101
// Windows 2000 Server Logo (413x113@4BPP)
#define                 IDB_W2KSRV_LOGO_BIG4BPP         102
// Bluebar Logo (413x5@8BPP)
#define                 IDB_BLUEBAR8BPP                 103
// Windows 2000 Professional Logo (413x88@8BPP)
#define                 IDB_W2KPRO_LOGO_MEDIUM8BPP      107
// Windows 2000 Professional Logo (413x88@4BPP)
#define                 IDB_W2KPRO_LOGO_MEDIUM4BPP      111
// Windows 2000 Server Logo (413x88@4BPP)
#define                 IDB_W2KSRV_LOGO_MEDIUM4BPP      112
// Windows 2000 Professional Logo (413x72@4BPP)
#define                 IDB_W2KPRO_LOGO_SMALL4BPP       113
// Windows 2000 Server Logo (413x72@4BPP)
#define                 IDB_W2KSRV_LOGO_SMALL4BPP       114
// Bluebar Logo (413x5@4BPP)
#define                 IDB_BLUEBAR4BPP                 117
// Windows 2000 Advanced Server Logo (413x72@4BPP)
#define                 IDB_W2KADV_LOGO_SMALL4BPP       118
// Windows 2000 Advanced Server Logo (413x88@4BPP)
#define                 IDB_W2KADV_LOGO_MEDIUM4BPP      119
// Windows 2000 Advanced Server Logo (413x113@4BPP)
#define                 IDB_W2KADV_LOGO_BIG4BPP         120
// Windows 2000 Datacenter Server Logo (413x72@4BPP)
#define                 IDB_W2KDCS_LOGO_SMALL4BPP       121
// Windows 2000 Datacenter Server Logo (413x88@4BPP)
#define                 IDB_W2KDCS_LOGO_MEDIUM4BPP      122
// Windows 2000 Datacenter Server Logo (413x113@4BPP)
#define                 IDB_W2KDCS_LOGO_BIG4BPP         123
// MS Windows Powered Logo (413x72@4BPP)
#define                 IDB_MSW_POWERED_SMALL4BPP       124
// MS Windows Powered Logo (413x88@4BPP)
#define                 IDB_MSW_POWERED_MEDIUM4BPP      125
// MS Windows Powered Logo (413x113@4BPP)
#define                 IDB_MSW_POWERED_BIG4BPP         126
// Network interrupted (ICON)
#define                 IDI_NONETWORK                   13
// Key symbol (ICON)
#define                 IDI_KEYSYMBOL                   21
// Computer symbol (ICON)
#define                 IDI_COMPUTERSYMBOL              22
// Keyboard symbol (ICON)
#define                 IDI_KEYBOARDSYMBOL              109
// Smartcard-Reader symbol (ICON)
#define                 IDI_SMARTCARDSYMBOL             110
// Computer-Locked symbol (ICON)
#define                 IDI_MACHINELOCKEDSYMBOL         115
//-----------------------------------------------------------------------------
// "Please wait for domain list to be created"-dialog
#define                 IDD_WAITFORDOMAINLISTDLG        104
#define                 IDC_STATIC_WAIT                 101
//-----------------------------------------------------------------------------
// Logon-Help (how to use Ctrl+Alt+Del)
#define                 IDD_LOGONHELPDLG                109
// IDOK
#define                 IDC_EDIT_DESCRIPTION            2411
#define                 IDC_ANIMATE_HELP                2412
#define                 IDC_STATIC_USECTRLALTDEL        2414
#define                 IDC_STATIC_CTRL                 2415
#define                 IDC_STATIC_ALT                  2416
#define                 IDC_STATIC_DEL                  2417
//-----------------------------------------------------------------------------
// Some Smartcard-related dialog
#define                 IDD_SMARTCARDDLG                1400
#define                 IDC_STATIC_CAD                  2409
#define                 IDC_ICON_KEYBOARD               2408
#define                 IDC_ICON_SMARTCARD              2407
#define                 IDC_LINK_HELP                   2410
//-----------------------------------------------------------------------------
// The real logon dialog
#define                 IDD_LOGONDLG                    1500
#define                 IDC_STATIC_USERNAME             1506
#define                 IDC_EDIT_USERNAME               1502
#define                 IDC_STATIC_PASSWORD             1507
#define                 IDC_EDIT_PASSWORD               1503
#define                 IDC_STATIC_DOMAIN               1508
#define                 IDC_COMBO_DOMAIN                1504
#define                 IDC_CHECK_RAS                   1505
#define                 IDC_ICON_KBDLAYOUT              2406
// IDOK
// IDCANCEL
#define                 IDC_BTN_SHUTDOWN                1501
#define                 IDC_BTN_OPTIONS                 1514
#define                 IDC_STATIC_LEGALNOTES           2400
//-----------------------------------------------------------------------------
// Dialog which notifies that only the local profile is being used
#define                 IDD_LOCALPROFILEUSEDDLG         1600
#define                 IDC_STATIC_TEXT1                1601
#define                 IDC_STATIC_TEXT1                1602
// IDOK
#define                 IDC_CHECK_DONTSHOWAGAIN         1603
#define                 IDC_ICON_1                      1604
//-----------------------------------------------------------------------------
// Password change dialog
#define                 IDD_CHANGEPASSWORDDLG           1700
#define                 IDC_STATIC_USERNAME             1701
#define                 IDC_EDIT_USERNAME               1702
#define                 IDC_STATIC_DOMAIN               1703
#define                 IDC_COMBO_DOMAIN                1704
#define                 IDC_STATIC_OLDPASSWORD          1705
#define                 IDC_EDIT_OLDPASSWORD            1706
#define                 IDC_STATIC_NEWPASSWORD          1707
#define                 IDC_EDIT_NEWPASSWORD            1708
#define                 IDC_STATIC_CONFIRMPASSWORD      1709
#define                 IDC_EDIT_CONFIRMPASSWORD        1710
#define                 IDC_ICON_KEY                    2406
// IDOK
// IDCANCEL
//-----------------------------------------------------------------------------
// Windows security dialog
#define                 IDD_WINSECDLG                   1800
#define                 IDC_BTN_LOCK                    1800
#define                 IDC_BTN_LOGOFF                  1801
#define                 IDC_BTN_SHUTDOWN                1802
#define                 IDC_BTN_CHANGEPASS              1803
#define                 IDC_BTN_TASKMAN                 1804
// IDCANCEL
#define                 IDC_STATIC_TASKMANDESC          1805
#define                 IDC_GROUP_INFOS                 1657
#define                 IDC_STATIC_LOGONNAME            1806
#define                 IDC_STATIC_LOGONDATETEXT        1659
#define                 IDC_STATIC_LOGONDATE            1807
//-----------------------------------------------------------------------------
// Computer locked dialog
#define                 IDD_MACHINELOCKEDDLG            1900
#define                 IDC_STATIC_LOCKEDTEXT           1752
#define                 IDC__STATIC_LOGGEDONTEXT        1902
#define                 IDC_STATIC_UNLOCKTEXT           1754
#define                 IDC_ICON_LOCKED                 2403
//-----------------------------------------------------------------------------
// Unlock Computer dialog
#define                 IDD_UNLOCKMACHINEDLG            1950
#define                 IDC_STATIC_TEXT1                1852
#define                 IDC_STATIC_TEXT2                1952
#define                 IDC_STATIC_USERNAME             1858
#define                 IDC_EDIT_USERNAME               1953
#define                 IDC_STATIC_PASSWORD             1931
#define                 IDC_EDIT_PASSWORD               1954
#define                 IDC_STATIC_DOMAIN               1957
#define                 IDC_COMBO_DOMAIN                1956
#define                 IDC_ICON_1                      2406
// IDOK
// IDCANCEL
#define                 IDC_BTN_OPTIONS                 2401
#define                 IDC_ICON_2                      2404
//-----------------------------------------------------------------------------
// Shutdown Computer dialog
#define                 IDD_SHUTDOWNDLG                 2200
#define                 IDC_COMBO_SHUTDOWNOPTIONS       2201
#define                 IDC_STATIC_TEXT1                2202
// IDOK
// IDCANCEL
#define                 IDC_BTN_HELP                    9
//-----------------------------------------------------------------------------
// Shutdown to Install dialog
#define                 IDD_SHUTDOWNINSTALLDLG          2203
#define                 IDC_COMBO_SHUTDOWNOPTIONS       2204
#define                 IDC_STATIC_TEXT1                2205
#define                 IDC_RADIO_PLANNED               2218
#define                 IDC_RADIO_NOTPLANNED            2219
// IDOK
// IDCANCEL
//-----------------------------------------------------------------------------
// Logoff dialog
#define                 IDD_LOGOFFDLG                   2250
#define                 IDC_ICON_KEY2                   2251
// IDOK
// IDCANCEL
//-----------------------------------------------------------------------------
// "Please wait"-dialog
#define                 IDD_PLEASEWAITDLG               2450
#define                 IDC_STATIC_TEXT1                2451
//-----------------------------------------------------------------------------
// Unknown dialog
#define                 IDD_MESSAGEBOXDLG               2500
// IDOK
#define                 IDC_EDIT_TEXT1                  2501
}

