windows-nt/Source/XPSP1/NT/shell/themes/uxtheme/themeldr.cpp
2020-09-26 16:20:57 +08:00

453 lines
13 KiB
C++

//---------------------------------------------------------------------------
// ThemeLdr.cpp - entrypoints for routines declared in ThemeLdr.h
//---------------------------------------------------------------------------
#include "stdafx.h"
#include "Services.h"
#include "ThemeServer.h"
#include "loader.h"
//---------------------------------------------------------------------------
// --------------------------------------------------------------------------
// InjectedThreadDispatcherExceptionFilter
//
// Arguments: pExceptionInfo = Exception that happened.
//
// Returns: LONG
//
// Purpose: Filters exceptions that occur when executing injected threads
// into another process context to prevent the process from
// terminating due to unforeseen exceptions.
//
// History: 2000-10-13 vtan created
// 2001-05-18 vtan copied from theme service LPC
// --------------------------------------------------------------------------
LONG WINAPI InjectedThreadExceptionFilter (struct _EXCEPTION_POINTERS *pExceptionInfo)
{
(LONG)RtlUnhandledExceptionFilter(pExceptionInfo);
return(EXCEPTION_EXECUTE_HANDLER);
}
// --------------------------------------------------------------------------
// ::SessionAllocate
//
// Arguments: hProcess = Winlogon process for the session.
// dwServerChangeNumber = Server base change number.
// pfnRegister = Address of register function.
// pfnUnregister = Address of unregister function.
//
// Returns: void*
//
// Purpose: Allocates a CThemeServer object that contains information
// for a theme session. Wrapped in try/except because of
// critical section initialization.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C void* WINAPI SessionAllocate (HANDLE hProcess, DWORD dwServerChangeNumber, void *pfnRegister, void *pfnUnregister, void *pfnClearStockObjects, DWORD dwStackSizeReserve, DWORD dwStackSizeCommit)
{
CThemeServer *pvContext;
__try
{
pvContext = new CThemeServer(hProcess, dwServerChangeNumber, pfnRegister, pfnUnregister, pfnClearStockObjects, dwStackSizeReserve, dwStackSizeCommit);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
pvContext = NULL;
}
return(pvContext);
}
// --------------------------------------------------------------------------
// ::SessionFree
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: <none>
//
// Purpose: Destroys the CThemeServer object when the session goes away.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C void WINAPI SessionFree (void *pvContext)
{
delete static_cast<CThemeServer*>(pvContext);
}
// --------------------------------------------------------------------------
// ::ThemeHooksOn
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI ThemeHooksOn (void *pvContext)
{
return(static_cast<CThemeServer*>(pvContext)->ThemeHooksOn());
}
// --------------------------------------------------------------------------
// ::ThemeHooksOff
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI ThemeHooksOff (void *pvContext)
{
(HRESULT)static_cast<CThemeServer*>(pvContext)->ThemeHooksOff();
return(S_OK);
}
// --------------------------------------------------------------------------
// ::AreThemeHooksActive
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: BOOL
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C BOOL WINAPI AreThemeHooksActive (void *pvContext)
{
return(static_cast<CThemeServer*>(pvContext)->AreThemeHooksActive());
}
// --------------------------------------------------------------------------
// ::GetCurrentChangeNumber
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: int
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C int WINAPI GetCurrentChangeNumber (void *pvContext)
{
return(static_cast<CThemeServer*>(pvContext)->GetCurrentChangeNumber());
}
// --------------------------------------------------------------------------
// ::GetNewChangeNumber
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: int
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C int WINAPI GetNewChangeNumber (void *pvContext)
{
return(static_cast<CThemeServer*>(pvContext)->GetNewChangeNumber());
}
// --------------------------------------------------------------------------
// ::SetGlobalTheme
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI SetGlobalTheme (void *pvContext, HANDLE hSection)
{
return(static_cast<CThemeServer*>(pvContext)->SetGlobalTheme(hSection));
}
// --------------------------------------------------------------------------
// ::GetGlobalTheme
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI GetGlobalTheme (void *pvContext, HANDLE *phSection)
{
return(static_cast<CThemeServer*>(pvContext)->GetGlobalTheme(phSection));
}
// --------------------------------------------------------------------------
// ::LoadTheme
//
// Arguments: pvContext = CThemeServer this object.
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI LoadTheme (void *pvContext, HANDLE hSection, HANDLE *phSection, LPCWSTR pszName, LPCWSTR pszColor, LPCWSTR pszSize)
{
return(static_cast<CThemeServer*>(pvContext)->LoadTheme(hSection, phSection, pszName, pszColor, pszSize));
}
// --------------------------------------------------------------------------
// ::InitUserTheme
//
// Arguments: BOOL
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI InitUserTheme (BOOL fPolicyCheckOnly)
{
return(CThemeServices::InitUserTheme(fPolicyCheckOnly));
}
// --------------------------------------------------------------------------
// ::InitUserRegistry
//
// Arguments: <none>
//
// Returns: HRESULT
//
// Purpose: Pass thru function.
//
// History: 2000-11-15 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI InitUserRegistry (void)
{
return(CThemeServices::InitUserRegistry());
}
// --------------------------------------------------------------------------
// ::ReestablishServerConnection
//
// Arguments: <none>
//
// Returns: <none>
//
// Purpose: Pass thru function.
//
// History: 2000-11-17 vtan created
// --------------------------------------------------------------------------
EXTERN_C HRESULT WINAPI ReestablishServerConnection (void)
{
return(CThemeServices::ReestablishServerConnection());
}
// --------------------------------------------------------------------------
// ::ThemeHooksInstall
//
// Arguments: pvContext = Unused.
//
// Returns: DWORD
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C DWORD WINAPI ThemeHooksInstall (void *pvContext)
{
UNREFERENCED_PARAMETER(pvContext);
DWORD dwResult;
__try
{
dwResult = CThemeServer::ThemeHooksInstall();
}
__except (InjectedThreadExceptionFilter(GetExceptionInformation()))
{
dwResult = 0;
}
ExitThread(dwResult);
}
// --------------------------------------------------------------------------
// ::ThemeHooksRemove
//
// Arguments: pvContext = Unused.
//
// Returns: DWORD
//
// Purpose: Pass thru function.
//
// History: 2000-11-11 vtan created
// --------------------------------------------------------------------------
EXTERN_C DWORD WINAPI ThemeHooksRemove (void *pvContext)
{
UNREFERENCED_PARAMETER(pvContext);
DWORD dwResult;
__try
{
dwResult = CThemeServer::ThemeHooksRemove();
}
__except (InjectedThreadExceptionFilter(GetExceptionInformation()))
{
dwResult = 0;
}
ExitThread(dwResult);
}
// --------------------------------------------------------------------------
// ::ServerClearStockObjects
//
// Arguments: pvContext = ptr to section
//
// Returns: <none>
//
// Purpose: Pass thru function.
//
// History: 2001-05-01 rfernand created
// --------------------------------------------------------------------------
EXTERN_C void WINAPI ServerClearStockObjects (void *pvContext)
{
DWORD dwResult;
__try
{
dwResult = CThemeServer::ClearStockObjects(HANDLE(pvContext));
}
__except (InjectedThreadExceptionFilter(GetExceptionInformation()))
{
dwResult = 0;
}
ExitThread(dwResult);
}
//---------------------------------------------------------------------------
// --------------------------------------------------------------------------
// ::ClearTheme
//
// Arguments: hSection = Theme section to clear.
//
// Returns: HRESULT
//
// Purpose: Clears stock bitmaps in the theme section data and closes it.
//
// History: 2000-11-21 vtan created
// --------------------------------------------------------------------------
HRESULT WINAPI ClearTheme (HANDLE hSection, BOOL fForce)
{
HRESULT hr;
if (hSection != NULL)
{
hr = CThemeServices::ClearStockObjects(hSection, fForce);
}
else
{
hr = S_OK;
}
//---- always close the handle ----
CloseHandle(hSection);
return(hr);
}
// --------------------------------------------------------------------------
// ::MarkSection
//
// Arguments: hSection = Section to change
// dwAdd, dwRemove = Flags to set or clear in the header.
// See loader.h.
//
// Returns: void
//
// Purpose: Update the global section state.
//
// History: 2001-05-08 lmouton created
// --------------------------------------------------------------------------
EXTERN_C void WINAPI MarkSection (HANDLE hSection, DWORD dwAdd, DWORD dwRemove)
{
Log(LOG_TMLOAD, L"MarkSection: Add %d and remove %d on %X", dwAdd, dwRemove, hSection);
void *pV = MapViewOfFile(hSection,
FILE_MAP_WRITE,
0,
0,
0);
if (pV != NULL)
{
THEMEHDR *hdr = reinterpret_cast<THEMEHDR*>(pV);
// Do some validation
if (0 == memcmp(hdr->szSignature, kszBeginCacheFileSignature, kcbBeginSignature)
&& hdr->dwVersion == THEMEDATA_VERSION)
{
// Only allow this flag for now
if (dwRemove == SECTION_HASSTOCKOBJECTS)
{
Log(LOG_TMLOAD, L"MarkSection: Previous flags were %d", hdr->dwFlags);
hdr->dwFlags &= ~dwRemove;
}
}
UnmapViewOfFile(pV);
}
#ifdef DEBUG
else
{
Log(LOG_TMLOAD, L"MarkSection: Failed to open write handle for %X", hSection);
}
#endif
}