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.
169 lines
4.2 KiB
169 lines
4.2 KiB
/**************************** Module Header ********************************\
|
|
* Module Name: logon.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* Logon Support Routines
|
|
*
|
|
* History:
|
|
* 01-14-91 JimA Created.
|
|
\***************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
/***************************************************************************\
|
|
* _RegisterLogonProcess
|
|
*
|
|
* Register the logon process and set secure mode flag
|
|
*
|
|
* History:
|
|
* 07-01-91 JimA Created.
|
|
\***************************************************************************/
|
|
|
|
BOOL _RegisterLogonProcess(
|
|
DWORD dwProcessId,
|
|
BOOL fSecure)
|
|
{
|
|
UNREFERENCED_PARAMETER(fSecure);
|
|
|
|
/*
|
|
* Allow only one logon process and then only if it has TCB
|
|
* privilege.
|
|
*/
|
|
if (gpidLogon != 0 || !IsPrivileged(&psTcb)) {
|
|
RIPERR0(ERROR_ACCESS_DENIED,
|
|
RIP_WARNING,
|
|
"Access denied in _RegisterLogonProcess");
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
gpidLogon = (HANDLE)LongToHandle( dwProcessId );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
* _LockWindowStation
|
|
*
|
|
* Locks a windowstation and its desktops and returns the busy status.
|
|
*
|
|
* History:
|
|
* 01-15-91 JimA Created.
|
|
\***************************************************************************/
|
|
UINT _LockWindowStation(
|
|
PWINDOWSTATION pwinsta)
|
|
{
|
|
PDESKTOP pdesk;
|
|
BOOL fBusy = FALSE;
|
|
|
|
/*
|
|
* Make sure the caller is the logon process
|
|
*/
|
|
if (PsGetCurrentProcessId() != gpidLogon) {
|
|
RIPERR0(ERROR_ACCESS_DENIED,
|
|
RIP_WARNING,
|
|
"Access denied in _LockWindowStation");
|
|
|
|
return WSS_ERROR;
|
|
}
|
|
|
|
/*
|
|
* Prevent desktop switches
|
|
*/
|
|
pwinsta->dwWSF_Flags |= WSF_SWITCHLOCK;
|
|
|
|
/*
|
|
* Determine whether the station is busy
|
|
*/
|
|
pdesk = pwinsta->rpdeskList;
|
|
while (pdesk != NULL) {
|
|
if (pdesk != grpdeskLogon &&
|
|
OBJECT_TO_OBJECT_HEADER(pdesk)->HandleCount != 0) {
|
|
|
|
/*
|
|
* This desktop is open, thus the station is busy
|
|
*/
|
|
fBusy = TRUE;
|
|
break;
|
|
}
|
|
pdesk = pdesk->rpdeskNext;
|
|
}
|
|
|
|
if (pwinsta->dwWSF_Flags & WSF_SHUTDOWN)
|
|
pwinsta->dwWSF_Flags |= WSF_OPENLOCK;
|
|
|
|
/*
|
|
* Unlock opens if the station is busy and is not in the middle
|
|
* of shutting down.
|
|
*/
|
|
if (fBusy)
|
|
return WSS_BUSY;
|
|
else
|
|
return WSS_IDLE;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
* _UnlockWindowStation
|
|
*
|
|
* Unlocks a windowstation locked by LogonLockWindowStation.
|
|
*
|
|
* History:
|
|
* 01-15-91 JimA Created.
|
|
\***************************************************************************/
|
|
BOOL _UnlockWindowStation(
|
|
PWINDOWSTATION pwinsta)
|
|
{
|
|
/*
|
|
* Make sure the caller is the logon process.
|
|
*/
|
|
if (PsGetCurrentProcessId() != gpidLogon) {
|
|
RIPERR0(ERROR_ACCESS_DENIED,
|
|
RIP_WARNING,
|
|
"Access denied in _UnlockWindowStation");
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* If shutdown is occuring, only remove the switch lock.
|
|
*/
|
|
if (pwinsta->dwWSF_Flags & WSF_SHUTDOWN) {
|
|
pwinsta->dwWSF_Flags &= ~WSF_SWITCHLOCK;
|
|
} else {
|
|
pwinsta->dwWSF_Flags &= ~(WSF_OPENLOCK | WSF_SWITCHLOCK);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
* _SetLogonNotifyWindow
|
|
*
|
|
* Register the window to notify when logon related events occur.
|
|
*
|
|
* History:
|
|
* 01-13-92 JimA Created.
|
|
\***************************************************************************/
|
|
BOOL _SetLogonNotifyWindow(
|
|
PWND pwnd)
|
|
{
|
|
/*
|
|
* Make sure the caller is the logon process.
|
|
*/
|
|
if (PsGetCurrentProcessId() != gpidLogon) {
|
|
RIPERR0(ERROR_ACCESS_DENIED,
|
|
RIP_WARNING,
|
|
"Access denied in _SetLogonNotifyWindow");
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
Lock(&gspwndLogonNotify, pwnd);
|
|
|
|
return TRUE;
|
|
}
|