windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/as/cpi32/swl.cpp

188 lines
4.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
//
// SWL.CPP
// Shared Window List
//
// Copyright(c) Microsoft 1997-
//
#define MLZ_FILE_ZONE ZONE_CORE
//
// SWL strategy when network packets are not available
//
// The SWL only sends one type of message - the window structure message.
// When no network packets are available the SWL will drop its current
// packet and remember that the window structure has changed since it was
// last able to send a packet. SWL_Periodic will also return FALSE when
// this happens so that the DCS will know not to send any updates if it
// failed to send a window structure.
//
// This pending of window structure messages is integrated with the
// ignore envelopes where the SWL wants to ignore changes caused by itself
// (or other components if they call the SWL_Begin/EndIgnoreWindowChanges
// functions).
//
//
// SWL strategy for backward compatibility.
//
// The differences between the R2.0 and 3.0 SWL protocol are:
// 1. Tokenless packets.
// 2. No shadows.
//
//
// SWL_HostStarting()
//
BOOL ASHost::SWL_HostStarting(void)
{
BOOL rc = FALSE;
DebugEntry(ASHost::SWL_HostStarting);
//
// If this is NT, get the name of our startup desktop
//
if (!g_asWin95)
{
ASSERT(m_aswlOurDesktopName[0] == 0);
GetUserObjectInformation(GetThreadDesktop(g_asMainThreadId),
UOI_NAME, m_aswlOurDesktopName,
sizeof(m_aswlOurDesktopName), NULL);
TRACE_OUT(("Our desktop name is %s", m_aswlOurDesktopName));
}
if (!m_aswlOurDesktopName[0])
{
// Use default name
TRACE_OUT(("Couldn't get desktop name; using %s",
NAME_DESKTOP_DEFAULT));
lstrcpy(m_aswlOurDesktopName, NAME_DESKTOP_DEFAULT);
}
rc = TRUE;
DebugExitBOOL(ASHost::SWL_HostStarting, rc);
return(rc);
}
//
// SWL_UpdateCurrentDesktop()
//
// This checks what the current desktop is, and if it's changed, updates
// the NT input hooks for winlogon/screensaver for the service. But normal
// SWL and AWC also make use of this info.
//
void ASHost::SWL_UpdateCurrentDesktop(void)
{
HDESK hDeskCurrent = NULL;
UINT newCurrentDesktop;
char szName[SWL_DESKTOPNAME_MAX];
DebugEntry(ASHost::SWL_UpdateCurrentDesktop);
newCurrentDesktop = DESKTOP_OURS;
if (g_asWin95)
{
// Nothing to do
DC_QUIT;
}
//
// Get the current desktop. If we can't even get it, assume it's the
// winlogon desktop.
//
hDeskCurrent = OpenInputDesktop(0, TRUE, DESKTOP_READOBJECTS);
if (!hDeskCurrent)
{
TRACE_OUT(("OpenInputDesktop failed; must be WINLOGON"));
newCurrentDesktop = DESKTOP_WINLOGON;
DC_QUIT;
}
// Get the name of the current desktop
szName[0] = 0;
GetUserObjectInformation(hDeskCurrent, UOI_NAME, szName,
sizeof(szName), NULL);
TRACE_OUT(("GetUserObjectInformation returned %s for name", szName));
if (!lstrcmpi(szName, m_aswlOurDesktopName))
{
newCurrentDesktop = DESKTOP_OURS;
}
else if (!lstrcmpi(szName, NAME_DESKTOP_SCREENSAVER))
{
newCurrentDesktop = DESKTOP_SCREENSAVER;
}
else if (!lstrcmpi(szName, NAME_DESKTOP_WINLOGON))
{
newCurrentDesktop = DESKTOP_WINLOGON;
}
else
{
newCurrentDesktop = DESKTOP_OTHER;
}
DC_EXIT_POINT:
if (newCurrentDesktop != m_swlCurrentDesktop)
{
//
// If this is the service, adjust where we playback events
// and/or block local input.
//
OSI_DesktopSwitch(m_swlCurrentDesktop, newCurrentDesktop);
m_swlCurrentDesktop = newCurrentDesktop;
}
if (hDeskCurrent != NULL)
{
CloseDesktop(hDeskCurrent);
}
DebugExitVOID(ASHost::SWL_UpdateCurrentDesktop);
}
//
// SWL_IsOurDesktopActive()
//
BOOL ASHost::SWL_IsOurDesktopActive(void)
{
return(!g_asSharedMemory->fullScreen && (m_swlCurrentDesktop == DESKTOP_OURS));
}
//
// SWL_Periodic()
//
// DESCRIPTION:
//
// Called periodically. If the window structure has changed (such that it
// impacts remote systems) then send a new one if we can.
//
//
void ASHost::SWL_Periodic(void)
{
DebugEntry(ASSHost::SWL_Periodic);
SWL_UpdateCurrentDesktop();
DebugExitVOID(ASHost::SWL_Periodic);
}