Windows2003-3790/windows/appcompat/shims/general/emulategetuieffects.cpp
2020-09-30 16:53:55 +02:00

159 lines
3.7 KiB
C++

/*++
Copyright (c) 2002 Microsoft Corporation
Module Name:
EmulateGetUIEffects.cpp
Abstract:
Force SPI_GETUIEFFECTS to FALSE if this is a remote (TS) session
History:
08/07/2002 linstev Created
08/22/2002 robkenny Converted to a general shim
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(EmulateGetUIEffects)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(SystemParametersInfoA)
APIHOOK_ENUM_ENTRY(SystemParametersInfoW)
APIHOOK_ENUM_END
BOOL bGetUIEffects = FALSE;
/*++
If the caller was after SPI_GETUIEFFECTS and this is a TS session
force the value to the value specified on the command line.
--*/
VOID CorrectGetUIEffects(
UINT uiAction, // system parameter to retrieve or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update option
)
{
if (pvParam && (uiAction == SPI_GETUIEFFECTS))
{
if (GetSystemMetrics(SM_REMOTESESSION))
{
BOOL * bUiEffect = (BOOL *)pvParam;
// Only spew the message if we are actually changing the value
if (*bUiEffect != bGetUIEffects)
{
LOGN(eDbgLevelWarning, "SystemParametersInfoA: Forcing SPI_GETUIEFFECTS to %s", bGetUIEffects ? "TRUE" : "FALSE");
*bUiEffect = bGetUIEffects;
}
}
}
}
/*++
Force SPI_GETUIEFFECTS to bGetUIEffects (defaults to FALSE) if this is a remote (TS) session
--*/
BOOL
APIHOOK(SystemParametersInfoA)(
UINT uiAction, // system parameter to retrieve or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update option
)
{
BOOL bRet = ORIGINAL_API(SystemParametersInfoA)(uiAction, uiParam, pvParam, fWinIni);
if (bRet)
{
CorrectGetUIEffects(uiAction, uiParam, pvParam, fWinIni);
}
return bRet;
}
BOOL
APIHOOK(SystemParametersInfoW)(
UINT uiAction, // system parameter to retrieve or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update option
)
{
BOOL bRet = ORIGINAL_API(SystemParametersInfoW)(uiAction, uiParam, pvParam, fWinIni);
if (bRet)
{
CorrectGetUIEffects(uiAction, uiParam, pvParam, fWinIni);
}
return bRet;
}
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
CSTRING_TRY
{
CString csCl(COMMAND_LINE);
if (csCl.CompareNoCase(L"true") == 0)
{
DPFN(eDbgLevelSpew, "EmulateGetUIEffects command line forcing SPI_GETUIEFFECTS to TRUE");
bGetUIEffects = TRUE;
}
else if (csCl.CompareNoCase(L"false") == 0)
{
DPFN(eDbgLevelSpew, "EmulateGetUIEffects command line forcing SPI_GETUIEFFECTS to FALSE");
bGetUIEffects = FALSE;
}
}
CSTRING_CATCH
{
return FALSE;
}
}
break;
default:
break;
}
return TRUE;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(USER32.DLL, SystemParametersInfoA)
APIHOOK_ENTRY(USER32.DLL, SystemParametersInfoW)
HOOK_END
IMPLEMENT_SHIM_END