From 243bb778d1dca2e0fb0b61204466deeddb017581 Mon Sep 17 00:00:00 2001 From: Kagamine Haku Date: Wed, 16 Oct 2024 04:08:54 +0700 Subject: [PATCH] Add automatically apply OpenSSL patch for Intel Gen 10+ CPUs --- platform/meson.build | 2 + platform/opensslpatch.c | 101 ++++++++++++++++++++++++++++++++++++++++ platform/opensslpatch.h | 8 ++++ platform/platform.c | 3 ++ platform/platform.h | 1 + 5 files changed, 115 insertions(+) create mode 100644 platform/opensslpatch.c create mode 100644 platform/opensslpatch.h diff --git a/platform/meson.build b/platform/meson.build index aa0d362..a00df6b 100644 --- a/platform/meson.build +++ b/platform/meson.build @@ -36,5 +36,7 @@ platform_lib = static_library( 'vfs.h', 'system.c', 'system.h', + 'opensslpatch.c', + 'opensslpatch.h', ], ) diff --git a/platform/opensslpatch.c b/platform/opensslpatch.c new file mode 100644 index 0000000..c2ca13b --- /dev/null +++ b/platform/opensslpatch.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include "util/dprintf.h" +#include "platform/opensslpatch.h" + +int ChecknPatch(void) { + char* cpuname = GetCpuName(); + if (cpuname == NULL) { + dprintf("Error: Unable to detect CPU.\n"); + return 1; + } + + //dprintf("CPU Detected: %s\n", cpuname); + + if (CheckCpu(cpuname)) { + OpenSSLPatch(); + dprintf("OpenSSL Patch applied successfully.\n"); + } else { + dprintf("Info: OpenSSL Patch is not required (AMD or Intel < 10th gen or older CPU detected).\n"); + } + + free(cpuname); + return 0; +} + +char* GetCpuName() { + FILE* fp; + char buffer[128]; + char* cpu_info = NULL; + + fp = _popen("wmic cpu get Name", "r"); + + if (fp == NULL) { + return NULL; + } + + fgets(buffer, sizeof(buffer), fp); + + if (fgets(buffer, sizeof(buffer), fp) != NULL) { + cpu_info = (char*)malloc(strlen(buffer) + 1); + strcpy(cpu_info, buffer); + } + _pclose(fp); + + if (cpu_info != NULL) { + cpu_info[strcspn(cpu_info, "\r\n")] = 0; + } + + return cpu_info; +} + +int CheckCpu(char* cpuname) { + if (strstr(cpuname, "Core 2 Duo") || strstr(cpuname, "Core 2 Quad") || + (strstr(cpuname, "Pentium") && !strstr(cpuname, "G")) || strstr(cpuname, "Celeron")) { + //dprintf("Trash detected. No patch needed.\n"); + return 0; + } + + if (strstr(cpuname, "Intel")) { + char* part = strtok(cpuname, " "); + while (part != NULL) { + if (part[0] == 'i' && strlen(part) >= 4) { + int gen = atoi(part + 1); + if (gen >= 10) { + dprintf("Intel Gen 10+ CPU Detected: %s\n", cpuname); + return 1; + } + } else if (part[0] == 'G' && strlen(part) >= 4) { + int pentium = atoi(part + 1); + if (pentium / 1000 >= 6) { + dprintf("Intel Gen 10+ CPU Detected: %s\n", cpuname); + return 1; + } + } + part = strtok(NULL, " "); + } + } + + return 0; +} + +void OpenSSLPatch(void) { + const char* variablename = "OPENSSL_ia32cap"; + const char* variablevalue = "~0x20000000"; + + HKEY hKey; + if (RegOpenKeyExA(HKEY_CURRENT_USER, "Environment", 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { + if (RegSetValueExA(hKey, variablename, 0, REG_SZ, (const BYTE*)variablevalue, strlen(variablevalue) + 1) == ERROR_SUCCESS) { + dprintf("Successfully set the user environment variable %s to %s\n", variablename, variablevalue); + } else { + dprintf("Error: Failed to set the user environment variable.\n"); + } + + RegCloseKey(hKey); + + SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, NULL); + } else { + dprintf("Error: Failed to open the user environment registry key.\n"); + } +} diff --git a/platform/opensslpatch.h b/platform/opensslpatch.h new file mode 100644 index 0000000..5def7d5 --- /dev/null +++ b/platform/opensslpatch.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +int ChecknPatch(void); +void OpenSSLPatch(void); +char* GetCpuName(void); +int CheckCpu(char* cpuname); diff --git a/platform/platform.c b/platform/platform.c index a769c97..5dbebc7 100644 --- a/platform/platform.c +++ b/platform/platform.c @@ -14,6 +14,7 @@ #include "platform/platform.h" #include "platform/vfs.h" #include "platform/system.h" +#include "platform/opensslpatch.h" HRESULT platform_hook_init( const struct platform_config *cfg, @@ -28,6 +29,8 @@ HRESULT platform_hook_init( assert(platform_id != NULL); assert(redir_mod != NULL); + ChecknPatch(); + hr = amvideo_hook_init(&cfg->amvideo, redir_mod); if (FAILED(hr)) { diff --git a/platform/platform.h b/platform/platform.h index 0b69f12..b9bf7fd 100644 --- a/platform/platform.h +++ b/platform/platform.h @@ -14,6 +14,7 @@ #include "platform/pcbid.h" #include "platform/vfs.h" #include "platform/system.h" +#include "platform/opensslpatch.h" struct platform_config { struct amvideo_config amvideo;