From 5222598c113050b29635497c1267278b78407ffa Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 27 Jan 2026 10:12:14 +0200 Subject: [PATCH] [Windows] Disable MSVC control flow check on IAT hooks. (cherry picked from commit 9c753ebe8432991c88a0b0c934f8dea029f59b6f) --- platform/windows/os_windows.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index bfef44a062..d2d98c1903 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -2758,6 +2758,12 @@ bool OS_Windows::_test_create_rendering_device_and_gl(const String &p_display_dr } #endif +#ifdef _MSC_VER +#define IAT_HOOK_CALL __declspec(guard(nocf)) +#else +#define IAT_HOOK_CALL +#endif + using GetProcAddressType = FARPROC(__stdcall *)(HMODULE, LPCSTR); GetProcAddressType Original_GetProcAddress = nullptr; @@ -2793,7 +2799,7 @@ bool _hid_is_controller(HANDLE p_hid_handle) { return false; } -BOOLEAN __stdcall Hook_HidD_GetProductString(HANDLE p_object, void *p_buffer, ULONG p_buffer_length) { +IAT_HOOK_CALL BOOLEAN __stdcall Hook_HidD_GetProductString(HANDLE p_object, void *p_buffer, ULONG p_buffer_length) { constexpr const wchar_t unknown_product_string[] = L"Unknown HID Device"; constexpr size_t unknown_product_length = sizeof(unknown_product_string); @@ -2811,7 +2817,7 @@ BOOLEAN __stdcall Hook_HidD_GetProductString(HANDLE p_object, void *p_buffer, UL return FALSE; } -FARPROC __stdcall Hook_GetProcAddress(HMODULE p_module, LPCSTR p_name) { +IAT_HOOK_CALL FARPROC __stdcall Hook_GetProcAddress(HMODULE p_module, LPCSTR p_name) { if (String(p_name) == "HidD_GetProductString") { return (FARPROC)(LPVOID)Hook_HidD_GetProductString; }