automatically add needed dll override for Linux/macOS/Android (WINE)

This commit is contained in:
FunkyFr3sh
2025-01-05 07:06:01 -03:00
committed by majcosta
parent f471b74f5b
commit fd6ffd8d69
4 changed files with 91 additions and 0 deletions
+1
View File
@@ -29,6 +29,7 @@ set(UtilsSrc
"${CMAKE_CURRENT_SOURCE_DIR}/Text Utils.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Timer Control.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Utilities.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/wine.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/WordWrap.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/XMLProperties.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/XMLWriter.cpp"
+65
View File
@@ -0,0 +1,65 @@
#include <windows.h>
#include <stdio.h>
#include "wine.h"
BOOL wine_add_dll_overrides()
{
BOOL dd = wine_add_dll_override(L"ddraw");
//BOOL ws = wine_add_dll_override(L"wsock32");
return dd; // || ws;
}
BOOL wine_add_dll_override(const WCHAR* dll_name)
{
if (!IS_WINE)
return FALSE;
WCHAR exe_path[MAX_PATH] = { 0 };
if (!GetModuleFileNameW(NULL, exe_path, _countof(exe_path) - 1))
return FALSE;
WCHAR exe_file_name[MAX_PATH] = { 0 };
WCHAR exe_file_ext[MAX_PATH] = { 0 };
_wsplitpath(exe_path, NULL, NULL, exe_file_name, exe_file_ext);
WCHAR reg_path[512] = { 0 };
_snwprintf(
reg_path,
_countof(reg_path) - 1,
L"SOFTWARE\\Wine\\AppDefaults\\%s%s\\DllOverrides",
exe_file_name,
exe_file_ext);
BOOL result = FALSE;
HKEY hkey;
LONG status =
RegCreateKeyExW(
HKEY_CURRENT_USER,
reg_path,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ,
NULL,
&hkey,
NULL);
if (status == ERROR_SUCCESS)
{
if (RegQueryValueExW(hkey, dll_name, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
{
WCHAR v[] = L"native, builtin";
if (RegSetValueExW(hkey, dll_name, 0, REG_SZ, (LPCBYTE)v, sizeof(v)) == ERROR_SUCCESS &&
RegQueryValueExW(hkey, dll_name, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
result = TRUE;
}
}
RegCloseKey(hkey);
}
return result;
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef WINE_H
#define WINE_H
#define IS_WINE (GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0)
// ### types ###
// ### Variables ###
// ### Functions ###
BOOL wine_add_dll_overrides();
BOOL wine_add_dll_override(const WCHAR* dll_name);
#endif
+10
View File
@@ -49,6 +49,7 @@
#include "Lua Interpreter.h"
#include "connect.h"
#include "english.h"
#include "wine.h"
#include "BuildDefines.h"
#include "Intro.h"
@@ -766,7 +767,16 @@ int PASCAL HandledWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pC
HWND hPrevInstanceWindow;
UINT32 uiTimer = 0;
// Make sure the game works out of the box on Linux/macOS/Android (WINE)
if (wine_add_dll_overrides())
{
/* newly added dll overrides only work after a restart */
char exe_path[MAX_PATH] = { 0 };
GetModuleFileNameA(NULL, exe_path, _countof(exe_path));
ShellExecuteA(NULL, "open", exe_path, pCommandLine, NULL, sCommandShow);
return 0;
}
vfs::Log::setSharedString( getGameID() );
//if(!vfs::Aspects::getMutexFactory())