//  --------------------------------------------------------------------------
//  Module Name: glue.cpp
//
//  Copyright (c) 2000-2001, Microsoft Corporation
//
//  C File containing "glue" functions that the shell depot component of
//  msgina uses.
//
//  History:    2001-01-03  vtan        created
//              2001-01-11  vtan        added stub functions for imp library
//  --------------------------------------------------------------------------

extern "C"
{
    #include "msgina.h"
    #include "shtdnp.h"
}

//  --------------------------------------------------------------------------
//  ::_Gina_SasNotify
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//              dwSASType       =   SAS type.
//
//  Returns:    <none>
//
//  Purpose:    Notifies winlogon of a generated SAS.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void        _Gina_SasNotify (void *pWlxContext, DWORD dwSASType)

{
    pWlxFuncs->WlxSasNotify(static_cast<PGLOBALS>(pWlxContext)->hGlobalWlx, dwSASType);
}

//  --------------------------------------------------------------------------
//  ::_Gina_SetTimeout
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//              dwTimeout       =   Timeout value.
//
//  Returns:    BOOL
//
//  Purpose:    Sets the internal msgina timeout value for dialogs.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL        _Gina_SetTimeout (void *pWlxContext, DWORD dwTimeout)

{
    return(pWlxFuncs->WlxSetTimeout(static_cast<PGLOBALS>(pWlxContext)->hGlobalWlx, dwTimeout));
}

//  --------------------------------------------------------------------------
//  ::_Gina_DialogBoxParam
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//              See the platform SDK under DialogBoxParam.
//
//  Returns:    See the platform SDK under DialogBoxParam.
//
//  Purpose:    Calls winlogon's implementation of DialogBoxParam.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    INT_PTR     _Gina_DialogBoxParam (void *pWlxContext, HINSTANCE hInstance, LPCWSTR pszTemplate, HWND hwndParent, DLGPROC pfnDlgProc, LPARAM lParam)

{
    return(pWlxFuncs->WlxDialogBoxParam(static_cast<PGLOBALS>(pWlxContext)->hGlobalWlx,
                                        hInstance,
                                        const_cast<LPWSTR>(pszTemplate),
                                        hwndParent,
                                        pfnDlgProc,
                                        lParam));
}

//  --------------------------------------------------------------------------
//  ::_Gina_MessageBox
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//              See the platform SDK under MessageBox.
//
//  Returns:    See the platform SDK under MessageBox.
//
//  Purpose:    Calls winlogon's implementation of MessageBox.
//
//  History:    2001-03-02  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    INT_PTR     _Gina_MessageBox (void *pWlxContext, HWND hwnd, LPCWSTR pszText, LPCWSTR pszCaption, UINT uiType)

{
    return(pWlxFuncs->WlxMessageBox(static_cast<PGLOBALS>(pWlxContext)->hGlobalWlx,
                                    hwnd,
                                    const_cast<LPWSTR>(pszText),
                                    const_cast<LPWSTR>(pszCaption),
                                    uiType));
}

//  --------------------------------------------------------------------------
//  ::_Gina_SwitchDesktopToUser
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//
//  Returns:    int
//
//  Purpose:    Calls winlogon's implementation for SwitchDesktopToUser.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    int         _Gina_SwitchDesktopToUser (void *pWlxContext)

{
    return(pWlxFuncs->WlxSwitchDesktopToUser(static_cast<PGLOBALS>(pWlxContext)->hGlobalWlx));
}

//  --------------------------------------------------------------------------
//  ::_Gina_ShutdownDialog
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//              hwndParent      =   Parent HWND for dialog.
//              dwExcludeItems  =   Items to exclude from dialog.
//
//  Returns:    INT_PTR
//
//  Purpose:    Displays the shutdown that is hosted from winlogon not
//              explorer.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    INT_PTR     _Gina_ShutdownDialog (void *pWlxContext, HWND hwndParent, DWORD dwExcludeItems)

{
    return(static_cast<DWORD>(WinlogonShutdownDialog(hwndParent, static_cast<PGLOBALS>(pWlxContext), dwExcludeItems)));
}

//  --------------------------------------------------------------------------
//  ::_Gina_GetUserToken
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//
//  Returns:    HANDLE
//
//  Purpose:    Returns the user token handle. This handle must not be closed.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    HANDLE      _Gina_GetUserToken (void *pWlxContext)

{
    return(static_cast<PGLOBALS>(pWlxContext)->UserProcessData.UserToken);
}

//  --------------------------------------------------------------------------
//  ::_Gina_GetUsername
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//
//  Returns:    const WCHAR*
//
//  Purpose:    Returns the user name. Read only string.
//
//  History:    2001-03-28  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    const WCHAR*    _Gina_GetUsername (void *pWlxContext)

{
    return(static_cast<PGLOBALS>(pWlxContext)->UserName);
}

//  --------------------------------------------------------------------------
//  ::_Gina_GetDomain
//
//  Arguments:  pWlxContext     =   PGLOBALS struct.
//
//  Returns:    const WCHAR*
//
//  Purpose:    Returns the domain. Read only string.
//
//  History:    2001-03-28  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    const WCHAR*    _Gina_GetDomain (void *pWlxContext)

{
    return(static_cast<PGLOBALS>(pWlxContext)->Domain);
}

//  --------------------------------------------------------------------------
//  ::_Gina_SetTextFields
//
//  Arguments:  hwndDialog      =   HWND of the dialog.
//              pwszUsername    =   Username to set.
//              pwszDomain      =   Domain to set.
//              pwszPassword    =   Password to set.
//
//  Returns:    <none>
//
//  Purpose:    Sets the values of the msgina logon dialog to the given
//              values. This allows pass thru of credentials from the UI host
//              to msgina to do the work.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void        _Gina_SetTextFields (HWND hwndDialog, const WCHAR *pwszUsername, const WCHAR *pwszDomain, const WCHAR *pwszPassword)

{
    WCHAR   szDomain[DNLEN + sizeof('\0')];

    SetDlgItemText(hwndDialog, IDD_LOGON_NAME, pwszUsername);
    if ((pwszDomain == NULL) || (pwszDomain[0] == L'\0'))
    {
        DWORD   dwComputerNameSize;
        TCHAR   szComputerName[CNLEN + sizeof('\0')];

        dwComputerNameSize = ARRAYSIZE(szComputerName);
        if (GetComputerName(szComputerName, &dwComputerNameSize) != FALSE)
        {
            lstrcpyn(szDomain, szComputerName, ARRAYSIZE(szDomain));
        }
        pwszDomain = szDomain;
    }
    (LRESULT)SendMessage(GetDlgItem(hwndDialog, IDD_LOGON_DOMAIN),
                         CB_SELECTSTRING,
                         static_cast<WPARAM>(-1),
                         reinterpret_cast<LPARAM>(pwszDomain));
    SetDlgItemText(hwndDialog, IDD_LOGON_PASSWORD, pwszPassword);
}

//  --------------------------------------------------------------------------
//  ::_Gina_SetPasswordFocus
//
//  Arguments:  hwndDialog  =   HWND of dialog to set password focus.
//
//  Returns:    BOOL
//
//  Purpose:    Sets the focus to the password field in the dialog.
//
//  History:    2001-01-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL        _Gina_SetPasswordFocus (HWND hwndDialog)

{
    return(SetPasswordFocus(hwndDialog));
}

//  --------------------------------------------------------------------------
//  ::ShellGetUserList
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    LONG    WINAPI  ShellGetUserList (BOOL fRemoveGuest, DWORD *pdwUserCount, void* *pUserList)

{
    return(_ShellGetUserList(fRemoveGuest, pdwUserCount, pUserList));
}

//  --------------------------------------------------------------------------
//  ::ShellIsSingleUserNoPassword
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellIsSingleUserNoPassword (WCHAR *pwszUsername, WCHAR *pwszDomain)

{
    return(_ShellIsSingleUserNoPassword(pwszUsername, pwszDomain));
}

//  --------------------------------------------------------------------------
//  ::ShellIsFriendlyUIActive
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellIsFriendlyUIActive (void)

{
    return(_ShellIsFriendlyUIActive());
}

//  --------------------------------------------------------------------------
//  ::ShellIsMultipleUsersEnabled
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellIsMultipleUsersEnabled (void)

{
    return(_ShellIsMultipleUsersEnabled());
}

//  --------------------------------------------------------------------------
//  ::ShellIsRemoteConnectionsEnabled
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellIsRemoteConnectionsEnabled (void)

{
    return(_ShellIsRemoteConnectionsEnabled());
}

//  --------------------------------------------------------------------------
//  ::ShellEnableFriendlyUI
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellEnableFriendlyUI (BOOL fEnable)

{
    return(_ShellEnableFriendlyUI(fEnable));
}

//  --------------------------------------------------------------------------
//  ::ShellEnableMultipleUsers
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellEnableMultipleUsers (BOOL fEnable)

{
    return(_ShellEnableMultipleUsers(fEnable));
}

//  --------------------------------------------------------------------------
//  ::ShellEnableRemoteConnections
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellEnableRemoteConnections (BOOL fEnable)

{
    return(_ShellEnableRemoteConnections(fEnable));
}

//  --------------------------------------------------------------------------
//  ::ShellTurnOffDialog
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    DWORD   WINAPI  ShellTurnOffDialog (HWND hwndParent)

{
    return(_ShellTurnOffDialog(hwndParent));
}

//  --------------------------------------------------------------------------
//  ::ShellACPIPowerButtonPressed
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    int     WINAPI  ShellACPIPowerButtonPressed (void *pWlxContext, UINT uiEventType, BOOL fLocked)

{
    return(_ShellACPIPowerButtonPressed(pWlxContext, uiEventType, fLocked));
}

//  --------------------------------------------------------------------------
//  ::ShellIsSuspendAllowed
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellIsSuspendAllowed (void)

{
    return(_ShellIsSuspendAllowed());
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostBegin
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostBegin (UINT uiStartType)

{
    _ShellStatusHostBegin(uiStartType);
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostEnd
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostEnd (UINT uiEndType)

{
    _ShellStatusHostEnd(uiEndType);
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostShuttingDown
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostShuttingDown (void)

{
    _ShellStatusHostShuttingDown();
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostPowerEvent
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostPowerEvent (void)

{
    _ShellStatusHostPowerEvent();
}

//  --------------------------------------------------------------------------
//  ::ShellSwitchWhenInteractiveReady
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    BOOL    WINAPI  ShellSwitchWhenInteractiveReady (SWITCHTYPE eSwitchType, void *pWlxContext)

{
    return(_ShellSwitchWhenInteractiveReady(eSwitchType, pWlxContext));
}

//  --------------------------------------------------------------------------
//  ::ShellDimScreen
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    HRESULT     WINAPI  ShellDimScreen (IUnknown* *ppIUnknown, HWND* phwndDimmed)

{
    return(_ShellDimScreen(ppIUnknown, phwndDimmed));
}

//  --------------------------------------------------------------------------
//  ::ShellInstallAccountFilterData
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellInstallAccountFilterData (void)

{
    _ShellInstallAccountFilterData();
}

//  --------------------------------------------------------------------------
//  ::ShellSwitchUser
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    DWORD   WINAPI  ShellSwitchUser (BOOL fWait)

{
    return(_ShellSwitchUser(fWait));
}

//  --------------------------------------------------------------------------
//  ::ShellIsUserInteractiveLogonAllowed
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    int     WINAPI  ShellIsUserInteractiveLogonAllowed (const WCHAR *pwszUsername)

{
    return(_ShellIsUserInteractiveLogonAllowed(pwszUsername));
}

//  --------------------------------------------------------------------------
//  ::ShellNotifyThemeUserChange
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellNotifyThemeUserChange (USERLOGTYPE eUserLogType, HANDLE hToken)

{
    _ShellNotifyThemeUserChange(eUserLogType, hToken);
}

//  --------------------------------------------------------------------------
//  ::ShellReturnToWelcome
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-01-11  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    DWORD   WINAPI  ShellReturnToWelcome (BOOL fUnlock)

{
    return(_ShellReturnToWelcome(fUnlock));
}

//  --------------------------------------------------------------------------
//  ::ShellStartCredentialServer
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-03  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    DWORD   WINAPI  ShellStartCredentialServer (const WCHAR *pwszUsername, const WCHAR *pwszDomain, WCHAR *pwszPassword, DWORD dwTimeout)

{
    return(_ShellStartCredentialServer(pwszUsername, pwszDomain, pwszPassword, dwTimeout));
}

//  --------------------------------------------------------------------------
//  ::ShellAcquireLogonMutex
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-04  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellAcquireLogonMutex (void)

{
    _ShellAcquireLogonMutex();
}

//  --------------------------------------------------------------------------
//  ::ShellReleaseLogonMutex
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-04  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellReleaseLogonMutex (BOOL fSignalEvent)

{
    _ShellReleaseLogonMutex(fSignalEvent);
}

//  --------------------------------------------------------------------------
//  ::ShellSignalShutdown
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-06  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellSignalShutdown (void)

{
    _ShellSignalShutdown();
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostHide
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-12  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostHide (void)

{
    _ShellStatusHostHide();
}

//  --------------------------------------------------------------------------
//  ::ShellStatusHostShow
//
//  Arguments:  See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Returns:    See %SDXROOT%\shell\ext\gina\exports.cpp
//
//  Purpose:    Stub function for export.
//
//  History:    2001-04-12  vtan        created
//  --------------------------------------------------------------------------

EXTERN_C    void    WINAPI  ShellStatusHostShow (void)

{
    _ShellStatusHostShow();
}