Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

941 lines
31 KiB

// --------------------------------------------------------------------------
// Module Name: Exports.cpp
//
// Copyright (c) 2000, Microsoft Corporation
//
// C header file that contains function prototypes that are to be exported
// from msgina.dll
//
// History: 2000-02-04 vtan created
// 2000-02-28 vtan added ShellIsFriendlyUIActive
// 2000-02-29 vtan added ShellIsSingleUserNoPassword
// 2000-03-02 vtan added ShellIsMultipleUsersEnabled
// 2000-04-27 vtan added ShellTurnOffDialog
// 2000-04-27 vtan added ShellACPIPowerButtonPressed
// 2000-05-03 vtan added ShellStatusHostBegin
// 2000-05-03 vtan added ShellStatusHostEnd
// 2000-05-04 vtan added ShellSwitchWhenInteractiveReady
// 2000-05-18 vtan added ShellDimScreen
// 2000-06-02 vtan added ShellInstallAccountFilterData
// 2000-07-14 vtan added ShellStatusHostShuttingDown
// 2000-07-27 vtan added ShellIsSuspendAllowed
// 2000-07-28 vtan added ShellEnableMultipleUsers
// 2000-07-28 vtan added ShellEnableRemoteConnections
// 2000-08-01 vtan added ShellEnableFriendlyUI
// 2000-08-01 vtan added ShellIsRemoteConnectionsEnabled
// 2000-08-03 vtan added ShellSwitchUser
// 2000-08-09 vtan added ShellNotifyThemeUserChange
// 2000-08-14 vtan added ShellIsUserInteractiveLogonAllowed
// 2000-10-13 vtan added ShellStartThemeServer
// 2000-10-17 vtan added ShellStopThemeServer
// 2000-11-30 vtan removed ShellStartThemeServer
// 2000-11-30 vtan removed ShellStopThemeServer
// 2001-01-11 vtan renamed functions to _Shell
// 2001-01-11 vtan added ShellReturnToWelcome
// 2001-01-31 vtan added ShellStatusHostPowerEvent
// 2001-04-03 vtan added ShellStartCredentialServer
// 2001-04-04 vtan added ShellAcquireLogonMutex
// 2001-04-04 vtan added ShellReleaseLogonMutex
// 2001-04-12 vtan added ShellStatusHostHide
// 2001-04-12 vtan added ShellStatusHostShow
// --------------------------------------------------------------------------
#include "StandardHeader.h"
#include <msginaexports.h>
#include <shlobj.h>
#include <shlobjp.h>
#include <winsta.h>
#include <winwlx.h>
#include <LPCThemes.h>
#include "Compatibility.h"
#include "CredentialTransfer.h"
#include "DimmedWindow.h"
#include "LogonMutex.h"
#include "PowerButton.h"
#include "PrivilegeEnable.h"
#include "ReturnToWelcome.h"
#include "SpecialAccounts.h"
#include "StatusCode.h"
#include "SystemSettings.h"
#include "TokenInformation.h"
#include "TurnOffDialog.h"
#include "UserList.h"
#include "UserSettings.h"
#include "WaitInteractiveReady.h"
// --------------------------------------------------------------------------
// ::ShellGetUserList
//
// Arguments: fRemoveGuest = Always remove the "Guest" account.
// pdwReturnEntryCount = Returned number of entries. This
// may be NULL.
// pvBuffer = Buffer containing user data. This
// may be NULL.
//
// Returns: LONG
//
// Purpose: Gets the count of valid users and the user list on this
// system. This calls a static member function so that the
// context doesn't need to be supplied. This allows shgina (the
// logonocx) to call this function as a stand-alone function.
//
// History: 1999-10-15 vtan created
// 2000-01-31 vtan moved from Neptune to Whistler
// --------------------------------------------------------------------------
EXTERN_C LONG _ShellGetUserList(BOOL fRemoveGuest, DWORD *pdwUserCount, void* *pUserList)
{
return(CUserList::Get((fRemoveGuest != FALSE), pdwUserCount, reinterpret_cast<GINA_USER_INFORMATION**>(pUserList)));
}
// --------------------------------------------------------------------------
// ::ShellIsSingleUserNoPassword
//
// Arguments: pszUsername = Name of single user with no password.
// pszDomain = Domain for the user.
//
// Returns: BOOL
//
// Purpose: Returns whether this system is using friendly UI and has a
// single user with no password. If there is a single user with
// no password the login name is returned otherwise the parameter
// is unused.
//
// History: 2000-02-29 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellIsSingleUserNoPassword (WCHAR *pwszUsername, WCHAR *pwszDomain)
{
BOOL fResult;
fResult = FALSE;
if (CSystemSettings::IsFriendlyUIActive())
{
DWORD dwReturnedEntryCount;
GINA_USER_INFORMATION *pUserList;
if (ERROR_SUCCESS == CUserList::Get(true, &dwReturnedEntryCount, &pUserList))
{
if (dwReturnedEntryCount == 1)
{
HANDLE hToken;
if (CTokenInformation::LogonUser(pUserList->pszName,
pUserList->pszDomain,
L"",
&hToken) == ERROR_SUCCESS)
{
fResult = TRUE;
if (pwszUsername != NULL)
{
(WCHAR*)lstrcpyW(pwszUsername, pUserList->pszName);
}
if (pwszDomain != NULL)
{
(WCHAR*)lstrcpyW(pwszDomain, pUserList->pszDomain);
}
if (hToken != NULL)
{
TBOOL(CloseHandle(hToken));
}
}
}
(HLOCAL)LocalFree(pUserList);
}
}
return(fResult);
}
// --------------------------------------------------------------------------
// ::ShellIsFriendlyUIActive
//
// Arguments: <none>
//
// Returns: BOOL
//
// Purpose: Returns whether the friendly UI is active.
//
// History: 2000-02-28 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellIsFriendlyUIActive (void)
{
return(CSystemSettings::IsFriendlyUIActive());
}
// --------------------------------------------------------------------------
// ::ShellIsMultipleUsersEnabled
//
// Arguments: <none>
//
// Returns: BOOL
//
// Purpose: Returns whether multiple users is enabled. This includes
// checking a registry key as well as whether terminal services
// is enabled on this machine.
//
// History: 2000-03-02 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellIsMultipleUsersEnabled (void)
{
return(CSystemSettings::IsMultipleUsersEnabled());
}
// --------------------------------------------------------------------------
// ::ShellIsRemoteConnectionsEnabled
//
// Arguments: <none>
//
// Returns: BOOL
//
// Purpose: Returns whether remote connections are enabled. This includes
// checking a registry key as well as whether terminal services
// is enabled on this machine.
//
// History: 2000-08-01 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellIsRemoteConnectionsEnabled (void)
{
return(CSystemSettings::IsRemoteConnectionsEnabled());
}
// --------------------------------------------------------------------------
// ::ShellEnableFriendlyUI
//
// Arguments: fEnable = Enable or disable friendly UI.
//
// Returns: BOOL
//
// Purpose: Enables or disables friendly UI via the CSystemSettings
// implementaion.
//
// History: 2000-08-01 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellEnableFriendlyUI (BOOL fEnable)
{
return(CSystemSettings::EnableFriendlyUI(fEnable != FALSE));
}
// --------------------------------------------------------------------------
// ::ShellEnableMultipleUsers
//
// Arguments: fEnable = Enable or disable multiple users.
//
// Returns: BOOL
//
// Purpose: Enables or disables multiple users via the CSystemSettings
// implementaion.
//
// History: 2000-07-28 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellEnableMultipleUsers (BOOL fEnable)
{
return(CSystemSettings::EnableMultipleUsers(fEnable != FALSE));
}
// --------------------------------------------------------------------------
// ::ShellEnableRemoteConnections
//
// Arguments: fEnable = Enable or disable remote connections.
//
// Returns: BOOL
//
// Purpose: Enables or disables remote connections via the CSystemSettings
// implementaion.
//
// History: 2000-07-28 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellEnableRemoteConnections (BOOL fEnable)
{
return(CSystemSettings::EnableRemoteConnections(fEnable != FALSE));
}
// --------------------------------------------------------------------------
// ::ShellTurnOffDialog
//
// Arguments: hwndParent = HWND to parent the dialog to.
//
// Returns: DWORD
//
// Purpose: Displays the "Turn Off Computer" dialog and allows the user to
// make a choice of available shut down options.
//
// History: 2000-03-02 vtan created
// 2000-04-17 vtan moved from shell to msgina
// --------------------------------------------------------------------------
EXTERN_C DWORD _ShellTurnOffDialog (HWND hwndParent)
{
CTurnOffDialog turnOffDialog(hDllInstance);
return(turnOffDialog.Show(hwndParent));
}
// --------------------------------------------------------------------------
// ::ShellACPIPowerButtonPressed
//
// Arguments: pWlxContext = PGLOBALS allocated at WlxInitialize.
// uiEventType = Event code for the power message.
// fLocked = Is workstation locked or not.
//
// Returns: DWORD
//
// Purpose: Displays the "Turn Off Computer" dialog and allows the user to
// make a choice of available shut down options. This is called
// in response to an ACPI power button press. The return codes
// are MSGINA_DLG_xxx return codes to winlogon.
//
// History: 2000-04-17 vtan created
// 2001-06-12 vtan added fLocked flag
// --------------------------------------------------------------------------
EXTERN_C int _ShellACPIPowerButtonPressed (void *pWlxContext, UINT uiEventType, BOOL fLocked)
{
int iResult;
CTokenInformation tokenInformation;
CUserSettings userSettings;
if ((uiEventType & (POWER_USER_NOTIFY_BUTTON | POWER_USER_NOTIFY_SHUTDOWN)) != 0)
{
// This code should not be re-entrant for multiple ACPI power button
// presses while the dialog is up. Blow off any further requests.
// Conditions for the prompt:
// 1) This session is the active console session
// 2) Power button dialog not already displayed
// 3) User is not restricted from closing the taskbar (shut down options)
// 4) User has the privilege to shut down the machine or the friendly UI is NOT active
// 5) User is not the system OR shut down without logon is allowed
if (CSystemSettings::IsActiveConsoleSession() &&
!userSettings.IsRestrictedNoClose() &&
(tokenInformation.UserHasPrivilege(SE_SHUTDOWN_PRIVILEGE) || !CSystemSettings::IsFriendlyUIActive()) &&
(!tokenInformation.IsUserTheSystem() || CSystemSettings::IsShutdownWithoutLogonAllowed()))
{
DWORD dwExitWindowsFlags;
if ((uiEventType & POWER_USER_NOTIFY_SHUTDOWN) != 0)
{
iResult = CTurnOffDialog::ShellCodeToGinaCode(SHTDN_SHUTDOWN);
}
else
{
DWORD dwResult;
CPowerButton *pPowerButton;
// Create a thread to handle the dialog. This is required because
// the dialog must be put on the input desktop which isn't necessarily
// the same as this thread's desktop. Wait for its completion.
pPowerButton = new CPowerButton(pWlxContext, hDllInstance);
if (pPowerButton != NULL)
{
(DWORD)pPowerButton->WaitForCompletion(INFINITE);
// Get the dialog result and check its validity. Only execute
// valid requests.
dwResult = pPowerButton->GetResult();
pPowerButton->Release();
}
else
{
dwResult = MSGINA_DLG_FAILURE;
}
iResult = dwResult;
}
dwExitWindowsFlags = CTurnOffDialog::GinaCodeToExitWindowsFlags(iResult);
// If this is a restart or a shutdown then decide to display a warning.
// If the user is the system then use EWX_SYSTEM_CALLER.
// If the workstation is locked then use EWX_WINLOGON_CALLER.
// Otherwise use nothing but still possibly display a warning.
if ((dwExitWindowsFlags != 0) && (DisplayExitWindowsWarnings((tokenInformation.IsUserTheSystem() ? EWX_SYSTEM_CALLER : fLocked ? EWX_WINLOGON_CALLER : 0) | dwExitWindowsFlags) == FALSE))
{
iResult = MSGINA_DLG_FAILURE;
}
}
else
{
iResult = -1;
}
}
else
{
WARNINGMSG("Unknown event type in _ShellACPIPowerButtonPressed.\r\n");
iResult = MSGINA_DLG_FAILURE;
}
return(iResult);
}
// --------------------------------------------------------------------------
// ::ShellIsSuspendAllowed
//
// Arguments: <none>
//
// Returns: BOOL
//
// Purpose: Returns whether suspend is allowed. This is important to
// prevent the UI host from going into an uncertain state due to
// the asynchronous nature of suspend and the WM_POWERBROADCAST
// messages.
//
// Suspend is allowed if ANY of these conditions are satisfied.
//
// 1) Friendly UI is NOT active
// 2) No UI Host exists
// 3) UI Host exists and is active (not as status host)
//
// History: 2000-07-27 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellIsSuspendAllowed (void)
{
return(!CSystemSettings::IsFriendlyUIActive() || _Shell_LogonStatus_IsSuspendAllowed());
}
// --------------------------------------------------------------------------
// ::ShellStatusHostBegin
//
// Arguments: uiStartType = Mode to start UI host in.
//
// Returns: <none>
//
// Purpose: Starts the status UI host if specified.
//
// History: 2000-05-03 vtan created
// 2000-07-13 vtan add shutdown parameter
// 2000-07-17 vtan changed to start type parameter
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostBegin (UINT uiStartType)
{
_Shell_LogonStatus_Init(uiStartType);
}
// --------------------------------------------------------------------------
// ::ShellStatusHostEnd
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Terminates the status UI host if one was started.
//
// History: 2000-05-03 vtan created
// 2001-01-09 vtan add end type parameter
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostEnd (UINT uiEndType)
{
_Shell_LogonStatus_Destroy(uiEndType);
}
// --------------------------------------------------------------------------
// ::ShellStatusHostShuttingDown
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Tell the status UI host to display a title that the system is
// shutting down.
//
// History: 2000-07-14 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostShuttingDown (void)
{
_Shell_LogonStatus_NotifyWait();
_Shell_LogonStatus_SetStateStatus(0);
}
// --------------------------------------------------------------------------
// ::ShellStatusHostPowerEvent
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Tell the status UI host to go into "Please Wait" mode in
// preparation for a power event.
//
// History: 2001-01-31 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostPowerEvent (void)
{
_Shell_LogonStatus_NotifyWait();
_Shell_LogonStatus_SetStateStatus(SHELL_LOGONSTATUS_LOCK_MAGIC_NUMBER);
}
// --------------------------------------------------------------------------
// ::ShellSwitchWhenInteractiveReady
//
// Arguments: eSwitchType = Switch type.
// pWlxContext = PGLOBALS allocated at WlxInitialize.
//
// Returns: BOOL
//
// Purpose: Does one of three things.
//
// 1) Create the switch event and registers the wait on it.
// 2) Checks the switch event and switches now or when signaled.
// 3) Cancels any outstanding wait and clean up.
//
// History: 2000-05-04 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL _ShellSwitchWhenInteractiveReady (SWITCHTYPE eSwitchType, void *pWlxContext)
{
NTSTATUS status;
switch (eSwitchType)
{
case SWITCHTYPE_CREATE:
if (!CSystemSettings::IsSafeMode() && _Shell_LogonStatus_Exists() && CSystemSettings::IsFriendlyUIActive())
{
status = CWaitInteractiveReady::Create(pWlxContext);
}
else
{
status = STATUS_UNSUCCESSFUL;
}
break;
case SWITCHTYPE_REGISTER:
status = CWaitInteractiveReady::Register(pWlxContext);
break;
case SWITCHTYPE_CANCEL:
status = CWaitInteractiveReady::Cancel();
break;
default:
DISPLAYMSG("Unexpected switch type in _ShellSwitchWhenInteractiveReady");
status = STATUS_UNSUCCESSFUL;
break;
}
return(NT_SUCCESS(status));
}
// --------------------------------------------------------------------------
// ::ShellDimScreen
//
// Arguments: ppIUnknown = IUnknown returned for release.
// phwndDimmed = HWND of the dimmed window for parenting.
//
// Returns: HRESULT
//
// Purpose:
//
// History: 2000-05-18 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT _ShellDimScreen (IUnknown* *ppIUnknown, HWND* phwndDimmed)
{
HRESULT hr;
CDimmedWindow *pDimmedWindow;
if (IsBadWritePtr(ppIUnknown, sizeof(*ppIUnknown)) || IsBadWritePtr(phwndDimmed, sizeof(*phwndDimmed)))
{
hr = E_INVALIDARG;
}
else
{
*ppIUnknown = NULL;
pDimmedWindow = new CDimmedWindow(hDllInstance);
if (pDimmedWindow != NULL)
{
hr = pDimmedWindow->QueryInterface(IID_IUnknown, reinterpret_cast<void**>(ppIUnknown));
if (SUCCEEDED(hr))
{
pDimmedWindow->Release();
*phwndDimmed = pDimmedWindow->Create();
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
return(hr);
}
// --------------------------------------------------------------------------
// ::ShellInstallAccountFilterData
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Called by shgina registration to install special accounts
// that need to be filtered by name.
//
// History: 2000-06-02 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellInstallAccountFilterData (void)
{
CSpecialAccounts::Install();
}
// --------------------------------------------------------------------------
// ::ShellSwitchUser
//
// Arguments: fWait = Wait for console disconnect to complete.
//
// Returns: DWORD
//
// Purpose: Checks for available memory before doing a disconnect. If the
// disconnect succeeds the processes running in the session have
// their working set dropped.
//
// History: 2000-08-03 vtan created
// --------------------------------------------------------------------------
EXTERN_C DWORD _ShellSwitchUser (BOOL fWait)
{
static BOOL s_fIsServer = static_cast<BOOL>(-1);
DWORD dwErrorCode;
dwErrorCode = ERROR_SUCCESS;
if (s_fIsServer == static_cast<BOOL>(-1))
{
OSVERSIONINFOEX osVersionInfoEx;
ZeroMemory(&osVersionInfoEx, sizeof(osVersionInfoEx));
osVersionInfoEx.dwOSVersionInfoSize = sizeof(osVersionInfoEx);
if (GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&osVersionInfoEx)) != FALSE)
{
s_fIsServer = ((VER_NT_SERVER == osVersionInfoEx.wProductType) || (VER_NT_DOMAIN_CONTROLLER == osVersionInfoEx.wProductType));
}
else
{
dwErrorCode = GetLastError();
}
}
if (dwErrorCode == ERROR_SUCCESS)
{
bool fRemote;
fRemote = (GetSystemMetrics(SM_REMOTESESSION) != 0);
if (s_fIsServer)
{
// Normal Server TS case (RemoteAdmin and TerminalServer)
if (fRemote)
{
if (WinStationDisconnect(SERVERNAME_CURRENT, LOGONID_CURRENT, static_cast<BOOLEAN>(fWait)) == FALSE)
{
dwErrorCode = GetLastError();
}
}
else
{
dwErrorCode = ERROR_NOT_SUPPORTED;
}
}
else if (ShellIsMultipleUsersEnabled() && !fRemote)
{
NTSTATUS status;
// Fast user switching case - need to do some extra work
// FUS is always on the console. When the session is remoted
// fall thru to PTS.
status = CCompatibility::TerminateNonCompliantApplications();
if (status == STATUS_PORT_DISCONNECTED)
{
status = CCompatibility::TerminateNonCompliantApplications();
}
dwErrorCode = static_cast<DWORD>(CStatusCode::ErrorCodeOfStatusCode(status));
if (dwErrorCode == ERROR_SUCCESS)
{
if (CCompatibility::HasEnoughMemoryForNewSession())
{
HANDLE hEvent;
TBOOL(_ShellSwitchWhenInteractiveReady(SWITCHTYPE_CANCEL, NULL));
hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, CReturnToWelcome::GetEventName());
if (hEvent != NULL)
{
TBOOL(SetEvent(hEvent));
TBOOL(CloseHandle(hEvent));
}
}
else
{
dwErrorCode = ERROR_NOT_ENOUGH_MEMORY;
}
}
}
else
{
// Normal PTS case or FUS remoted, just call the api
if (WinStationDisconnect(SERVERNAME_CURRENT, LOGONID_CURRENT, static_cast<BOOLEAN>(fWait)) == FALSE)
{
dwErrorCode = GetLastError();
}
}
}
return(dwErrorCode);
}
// --------------------------------------------------------------------------
// ::ShellIsUserInteractiveLogonAllowed
//
// Arguments: pwszUsername = User name to check interactive logon.
//
// Returns: int
//
// Purpose: Checks whether the given user has interactive logon right to
// the local system. The presence of SeDenyInteractiveLogonRight
// determines this.
//
// -1 = indeterminate state
// 0 = interactive logon not allowed
// 1 = interactive logon allowed.
//
// History: 2000-08-14 vtan created
// --------------------------------------------------------------------------
EXTERN_C int _ShellIsUserInteractiveLogonAllowed (const WCHAR *pwszUsername)
{
return(CUserList::IsInteractiveLogonAllowed(pwszUsername));
}
// --------------------------------------------------------------------------
// ::ShellNotifyThemeUserChange
//
// Arguments: hToken = Token of user being logged on.
// fUserLoggedOn = Indicates logon or logoff.
//
// Returns: <none>
//
// Purpose: Gives themes a chance to change the active theme based on a
// user logging on or logging off. This may be required because
// the default theme may be different from the user theme.
//
// History: 2000-08-09 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellNotifyThemeUserChange (USERLOGTYPE eUserLogType, HANDLE hToken)
{
static HANDLE s_hToken = NULL;
switch (eUserLogType)
{
case ULT_LOGON:
(BOOL)ThemeUserLogon(hToken);
if (QueueUserWorkItem(CSystemSettings::AdjustFUSCompatibilityServiceState,
NULL,
WT_EXECUTELONGFUNCTION) == FALSE)
{
(DWORD)CSystemSettings::AdjustFUSCompatibilityServiceState(NULL);
}
s_hToken = hToken;
break;
case ULT_LOGOFF:
if (s_hToken != NULL)
{
(DWORD)CSystemSettings::AdjustFUSCompatibilityServiceState(NULL);
s_hToken = NULL;
}
(BOOL)ThemeUserLogoff();
break;
case ULT_TSRECONNECT:
(BOOL)ThemeUserTSReconnect();
break;
case ULT_STARTSHELL:
(BOOL)ThemeUserStartShell();
break;
default:
DISPLAYMSG("Unexpected eUserLogType in ::_ShellNotifyThemeUserChange");
break;
}
}
// --------------------------------------------------------------------------
// ::_ShellReturnToWelcome
//
// Arguments: fUnlock = Unlock status mode required.
//
// Returns: int
//
// Purpose: Handles the dialog that is brought up behind the welcome
// screen. This dialog is similar to WlxLoggedOutSAS but is
// specific to return to welcome.
//
// History: 2001-01-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C DWORD _ShellReturnToWelcome (BOOL fUnlock)
{
CReturnToWelcome returnToWelcome;
return(static_cast<DWORD>(returnToWelcome.Show(fUnlock != FALSE)));
}
// --------------------------------------------------------------------------
// ::_ShellStartCredentialServer
//
// Arguments: pwszUsername = User name.
// pwszDomain = Domain.
// pwszPassword = Password.
// dwTimeout = Timeout.
//
// Returns: DWORD
//
// Purpose: Starts a credential transfer server in the host process. The
// caller must have SE_TCB_PRIVILEGE to execute this function.
//
// History: 2001-04-03 vtan created
// --------------------------------------------------------------------------
EXTERN_C DWORD _ShellStartCredentialServer (const WCHAR *pwszUsername, const WCHAR *pwszDomain, WCHAR *pwszPassword, DWORD dwTimeout)
{
DWORD dwErrorCode;
CTokenInformation tokenInformation;
if (tokenInformation.UserHasPrivilege(SE_TCB_PRIVILEGE))
{
TSTATUS(CCredentials::StaticInitialize(false));
dwErrorCode = CStatusCode::ErrorCodeOfStatusCode(CCredentialServer::Start(pwszUsername, pwszDomain, pwszPassword, dwTimeout));
}
else
{
dwErrorCode = ERROR_PRIVILEGE_NOT_HELD;
}
return(dwErrorCode);
}
// --------------------------------------------------------------------------
// ::_ShellAcquireLogonMutex
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Acquire the logon mutex.
//
// History: 2001-04-04 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellAcquireLogonMutex (void)
{
CLogonMutex::Acquire();
}
// --------------------------------------------------------------------------
// ::_ShellReleaseLogonMutex
//
// Arguments: fSignalEvent = Signal completion event.
//
// Returns: <none>
//
// Purpose: Release the logon mutex. If required to signal the completion
// event then signal it.
//
// History: 2001-04-04 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellReleaseLogonMutex (BOOL fSignalEvent)
{
if (fSignalEvent != FALSE)
{
CLogonMutex::SignalReply();
}
CLogonMutex::Release();
}
// --------------------------------------------------------------------------
// ::_ShellSignalShutdown
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Signal the shut down event to prevent further interactive
// logon requeusts.
//
// History: 2001-04-06 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellSignalShutdown (void)
{
CLogonMutex::SignalShutdown();
}
// --------------------------------------------------------------------------
// ::_ShellStatusHostHide
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose:
//
// History: 2001-04-12 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostHide (void)
{
_Shell_LogonStatus_Hide();
}
// --------------------------------------------------------------------------
// ::_ShellStatusHostShow
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose:
//
// History: 2001-04-12 vtan created
// --------------------------------------------------------------------------
EXTERN_C void _ShellStatusHostShow (void)
{
_Shell_LogonStatus_Show();
}