2021-12-30 17:20:41 +01:00
|
|
|
#include "core/stdafx.h"
|
|
|
|
#include "windows/system.h"
|
2022-07-26 00:36:35 +02:00
|
|
|
#include "engine/host_state.h"
|
2021-12-30 17:20:41 +01:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-04-19 03:55:20 +02:00
|
|
|
typedef BOOL(WINAPI* IGetVersionExA)(
|
|
|
|
_Inout_ LPOSVERSIONINFOA lpVersionInformation);
|
|
|
|
typedef BOOL(WINAPI* IPeekMessage)(
|
|
|
|
_Out_ LPMSG lpMsg,
|
|
|
|
_In_opt_ HWND hWnd,
|
|
|
|
_In_ UINT wMsgFilterMin,
|
|
|
|
_In_ UINT wMsgFilterMax,
|
|
|
|
_In_ UINT wRemoveMsg);
|
|
|
|
static IGetVersionExA VGetVersionExA = nullptr;
|
|
|
|
static IPeekMessage VPeekMessageA = nullptr;
|
|
|
|
static IPeekMessage VPeekMessageW = nullptr;
|
2021-12-30 17:20:41 +01:00
|
|
|
|
|
|
|
//#############################################################################
|
|
|
|
// SYSTEM HOOKS
|
|
|
|
//#############################################################################
|
|
|
|
|
2022-04-19 03:55:20 +02:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
HGetVersionExA(
|
|
|
|
_Inout_ LPOSVERSIONINFOA lpVersionInformation)
|
2021-12-30 17:20:41 +01:00
|
|
|
{
|
|
|
|
#ifdef DEDICATED
|
2022-03-16 02:03:06 +01:00
|
|
|
// Return false for dedicated to skip 'SetProcessDpiAwareness' in 'CEngineAPI:OnStartup()'.
|
2021-12-30 17:20:41 +01:00
|
|
|
return NULL;
|
|
|
|
#else
|
2022-04-19 03:55:20 +02:00
|
|
|
return VGetVersionExA(lpVersionInformation);
|
|
|
|
#endif // DEDICATED
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
HPeekMessage(
|
|
|
|
_Out_ LPMSG lpMsg,
|
|
|
|
_In_opt_ HWND hWnd,
|
|
|
|
_In_ UINT wMsgFilterMin,
|
|
|
|
_In_ UINT wMsgFilterMax,
|
|
|
|
_In_ UINT wRemoveMsg)
|
|
|
|
{
|
|
|
|
#ifdef DEDICATED
|
2022-09-09 19:47:31 +02:00
|
|
|
// Return false for dedicated to reduce unnecessary overhead when calling 'PeekMessageA/W()' every frame.
|
2022-04-19 03:55:20 +02:00
|
|
|
return NULL;
|
|
|
|
#else
|
|
|
|
return VPeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
|
2021-12-30 17:20:41 +01:00
|
|
|
#endif // DEDICATED
|
|
|
|
}
|
|
|
|
|
2022-07-26 00:36:35 +02:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
ConsoleHandlerRoutine(
|
|
|
|
DWORD eventCode)
|
|
|
|
{
|
|
|
|
switch (eventCode)
|
|
|
|
{
|
2024-01-14 11:25:50 +01:00
|
|
|
case CTRL_C_EVENT:
|
|
|
|
case CTRL_BREAK_EVENT:
|
2022-07-26 00:36:35 +02:00
|
|
|
case CTRL_CLOSE_EVENT:
|
|
|
|
case CTRL_LOGOFF_EVENT:
|
|
|
|
case CTRL_SHUTDOWN_EVENT:
|
|
|
|
if (g_pHostState)
|
|
|
|
{
|
|
|
|
g_pHostState->m_iNextState = HostStates_t::HS_SHUTDOWN;
|
|
|
|
}
|
|
|
|
|
2024-01-14 11:25:50 +01:00
|
|
|
// Give it time to shutdown properly, value is set to the max possible
|
|
|
|
// of SPI_GETWAITTOKILLSERVICETIMEOUT, which is 20000ms by default.
|
|
|
|
Sleep(20000);
|
2022-07-26 00:36:35 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2021-12-30 17:20:41 +01:00
|
|
|
//#############################################################################
|
|
|
|
// MANAGEMENT
|
|
|
|
//#############################################################################
|
|
|
|
|
|
|
|
void WinSys_Init()
|
|
|
|
{
|
2023-01-31 17:09:56 +01:00
|
|
|
#ifdef DEDICATED
|
2022-04-19 03:55:20 +02:00
|
|
|
VGetVersionExA = (IGetVersionExA)DetourFindFunction("KERNEL32.dll", "GetVersionExA");
|
|
|
|
VPeekMessageA = (IPeekMessage)DetourFindFunction("USER32.dll", "PeekMessageA");
|
|
|
|
VPeekMessageW = (IPeekMessage)DetourFindFunction("USER32.dll", "PeekMessageW");
|
|
|
|
|
2021-12-30 17:20:41 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
DetourTransactionBegin();
|
|
|
|
DetourUpdateThread(GetCurrentThread());
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
2022-04-19 03:55:20 +02:00
|
|
|
DetourAttach(&(LPVOID&)VGetVersionExA, (PBYTE)HGetVersionExA);
|
|
|
|
DetourAttach(&(LPVOID&)VPeekMessageA, (PBYTE)HPeekMessage);
|
|
|
|
//DetourAttach(&(LPVOID&)VPeekMessageW, (PBYTE)HPeekMessage);
|
2021-12-30 17:20:41 +01:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
2023-01-30 22:09:15 +01:00
|
|
|
HRESULT hr = DetourTransactionCommit();
|
|
|
|
if (hr != NO_ERROR)
|
|
|
|
{
|
|
|
|
// Failed to hook into the process, terminate
|
2024-01-02 15:21:36 +01:00
|
|
|
Assert(0);
|
2023-01-30 22:09:15 +01:00
|
|
|
Error(eDLL_T::COMMON, 0xBAD0C0DE, "Failed to detour process: error code = %08x\n", hr);
|
|
|
|
}
|
2022-04-19 03:55:20 +02:00
|
|
|
#endif // DEDICATED
|
2021-12-30 17:20:41 +01:00
|
|
|
}
|
|
|
|
|
2023-01-31 17:09:56 +01:00
|
|
|
void WinSys_Shutdown()
|
2021-12-30 17:20:41 +01:00
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
#ifdef DEDICATED
|
2021-12-30 17:20:41 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
DetourTransactionBegin();
|
|
|
|
DetourUpdateThread(GetCurrentThread());
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
2022-04-19 03:55:20 +02:00
|
|
|
DetourDetach(&(LPVOID&)VGetVersionExA, (PBYTE)HGetVersionExA);
|
|
|
|
DetourDetach(&(LPVOID&)VPeekMessageA, (PBYTE)HPeekMessage);
|
|
|
|
//DetourDetach(&(LPVOID&)VPeekMessageW, (PBYTE)HPeekMessage);
|
2021-12-30 17:20:41 +01:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
DetourTransactionCommit();
|
2022-04-19 03:55:20 +02:00
|
|
|
#endif // DEDICATED
|
2021-12-30 17:20:41 +01:00
|
|
|
}
|