mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-25 20:22:30 +01:00
Run platform sanity checks after creating the log and log windows path
This commit is contained in:
parent
9db68e7d39
commit
b76fd38854
@ -60,6 +60,7 @@ target_sources(rpcs3
|
|||||||
headless_application.cpp
|
headless_application.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
main_application.cpp
|
main_application.cpp
|
||||||
|
module_verifier.cpp
|
||||||
rpcs3_version.cpp
|
rpcs3_version.cpp
|
||||||
stb_image.cpp
|
stb_image.cpp
|
||||||
stdafx.cpp
|
stdafx.cpp
|
||||||
|
@ -491,9 +491,6 @@ int main(int argc, char** argv)
|
|||||||
report_fatal_error(error);
|
report_fatal_error(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Before we proceed, run some sanity checks
|
|
||||||
run_platform_sanity_checks();
|
|
||||||
|
|
||||||
const std::string lock_name = fs::get_cache_dir() + "RPCS3.buf";
|
const std::string lock_name = fs::get_cache_dir() + "RPCS3.buf";
|
||||||
|
|
||||||
static fs::file instance_lock;
|
static fs::file instance_lock;
|
||||||
@ -546,7 +543,7 @@ int main(int argc, char** argv)
|
|||||||
const int osx_ver_minor = Darwin_Version::getNSminorVersion();
|
const int osx_ver_minor = Darwin_Version::getNSminorVersion();
|
||||||
if ((osx_ver_major == 14 && osx_ver_minor < 3) && (utils::get_cpu_brand().rfind("VirtualApple", 0) == 0))
|
if ((osx_ver_major == 14 && osx_ver_minor < 3) && (utils::get_cpu_brand().rfind("VirtualApple", 0) == 0))
|
||||||
{
|
{
|
||||||
int osx_ver_patch = Darwin_Version::getNSpatchVersion();
|
const int osx_ver_patch = Darwin_Version::getNSpatchVersion();
|
||||||
report_fatal_error(fmt::format("RPCS3 requires macOS 14.3.0 or later.\nYou're currently using macOS %i.%i.%i.\nPlease update macOS from System Settings.\n\n", osx_ver_major, osx_ver_minor, osx_ver_patch));
|
report_fatal_error(fmt::format("RPCS3 requires macOS 14.3.0 or later.\nYou're currently using macOS %i.%i.%i.\nPlease update macOS from System Settings.\n\n", osx_ver_major, osx_ver_minor, osx_ver_patch));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -612,6 +609,9 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
sys_log.notice("argc: %d, argv: %s", argc, argument_str);
|
sys_log.notice("argc: %d, argv: %s", argc, argument_str);
|
||||||
|
|
||||||
|
// Before we proceed, run some sanity checks
|
||||||
|
run_platform_sanity_checks();
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
struct ::rlimit rlim;
|
struct ::rlimit rlim;
|
||||||
rlim.rlim_cur = 4096;
|
rlim.rlim_cur = 4096;
|
||||||
|
96
rpcs3/module_verifier.cpp
Normal file
96
rpcs3/module_verifier.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "module_verifier.hpp"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include <util/types.hpp>
|
||||||
|
#include <util/logs.hpp>
|
||||||
|
#include <Utilities/StrUtil.h>
|
||||||
|
#include <Utilities/StrFmt.h>
|
||||||
|
|
||||||
|
LOG_CHANNEL(sys_log, "SYS");
|
||||||
|
|
||||||
|
[[noreturn]] void report_fatal_error(std::string_view text, bool is_html, bool include_help_text);
|
||||||
|
|
||||||
|
void WIN32_module_verifier::run_module_verification()
|
||||||
|
{
|
||||||
|
struct module_info_t
|
||||||
|
{
|
||||||
|
std::wstring_view name;
|
||||||
|
std::string_view package_name;
|
||||||
|
std::string_view dl_link;
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::vector<module_info_t> special_module_infos = {
|
||||||
|
{ L"vulkan-1.dll", "Vulkan Runtime", "https://sdk.lunarg.com/sdk/download/latest/windows/vulkan-runtime.exe" },
|
||||||
|
{ L"msvcp140.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
||||||
|
{ L"vcruntime140.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
||||||
|
{ L"msvcp140_1.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
||||||
|
{ L"vcruntime140_1.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" }
|
||||||
|
};
|
||||||
|
|
||||||
|
WCHAR windir[MAX_PATH];
|
||||||
|
if (!GetWindowsDirectory(windir, MAX_PATH))
|
||||||
|
{
|
||||||
|
report_fatal_error(fmt::format("WIN32_module_verifier: Failed to query WindowsDirectory"), false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::wstring_view windir_wsv = windir;
|
||||||
|
|
||||||
|
for (const auto& module : special_module_infos)
|
||||||
|
{
|
||||||
|
const HMODULE hModule = GetModuleHandle(module.name.data());
|
||||||
|
if (hModule == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
WCHAR wpath[MAX_PATH];
|
||||||
|
if (const auto len = GetModuleFileName(hModule, wpath, MAX_PATH))
|
||||||
|
{
|
||||||
|
const std::wstring_view path_wsv = wpath;
|
||||||
|
if (path_wsv.find(windir_wsv) != 0)
|
||||||
|
{
|
||||||
|
const std::string path = wchar_to_utf8(wpath);
|
||||||
|
const std::string win_path = wchar_to_utf8(windir);
|
||||||
|
const std::string module_name = wchar_to_utf8(module.name);
|
||||||
|
const std::string error_message = fmt::format(
|
||||||
|
"<p>"
|
||||||
|
"The module <strong>%s</strong> was incorrectly installed at<br>"
|
||||||
|
"'%s'<br>"
|
||||||
|
"<br>"
|
||||||
|
"This module is part of the <strong>%s</strong> package.<br>"
|
||||||
|
"Install this package, then delete <strong>%s</strong> from rpcs3's installation directory.<br>"
|
||||||
|
"<br>"
|
||||||
|
"You can install this package from this URL:<br>"
|
||||||
|
"<a href='%s'>%s</a>"
|
||||||
|
"</p>",
|
||||||
|
module_name,
|
||||||
|
path,
|
||||||
|
module.package_name,
|
||||||
|
module_name,
|
||||||
|
module.dl_link,
|
||||||
|
module.dl_link
|
||||||
|
);
|
||||||
|
|
||||||
|
sys_log.error("Found incorrectly installed module: '%s' (path='%s', windows='%s')", module_name, path, win_path);
|
||||||
|
|
||||||
|
report_fatal_error(error_message, true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WIN32_module_verifier::run()
|
||||||
|
{
|
||||||
|
WIN32_module_verifier verifier{};
|
||||||
|
verifier.run_module_verification();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _WIN32
|
@ -1,97 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
#ifndef WIN32_LEAN_AND_MEAN
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
#include <util/types.hpp>
|
#include <util/types.hpp>
|
||||||
#include <Utilities/StrUtil.h>
|
|
||||||
#include <Utilities/StrFmt.h>
|
|
||||||
|
|
||||||
[[noreturn]] void report_fatal_error(std::string_view text, bool is_html, bool include_help_text);
|
|
||||||
|
|
||||||
// Validates that system modules are properly installed
|
// Validates that system modules are properly installed
|
||||||
// Only relevant for WIN32
|
// Only relevant for WIN32
|
||||||
class WIN32_module_verifier
|
class WIN32_module_verifier
|
||||||
{
|
{
|
||||||
struct module_info_t
|
void run_module_verification();
|
||||||
{
|
|
||||||
std::wstring_view name;
|
|
||||||
std::string_view package_name;
|
|
||||||
std::string_view dl_link;
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::vector<module_info_t> special_module_infos = {
|
|
||||||
{ L"vulkan-1.dll", "Vulkan Runtime", "https://sdk.lunarg.com/sdk/download/latest/windows/vulkan-runtime.exe" },
|
|
||||||
{ L"msvcp140.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
|
||||||
{ L"vcruntime140.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
|
||||||
{ L"msvcp140_1.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" },
|
|
||||||
{ L"vcruntime140_1.dll", "Microsoft Visual C++ 2015-2019 Redistributable", "https://aka.ms/vs/16/release/VC_redist.x64.exe" }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Inline impl. This class is only referenced once.
|
|
||||||
void run_module_verification()
|
|
||||||
{
|
|
||||||
WCHAR windir[MAX_PATH];
|
|
||||||
if (!GetWindowsDirectory(windir, MAX_PATH))
|
|
||||||
{
|
|
||||||
report_fatal_error(fmt::format("WIN32_module_verifier: Failed to query WindowsDirectory"), false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::wstring_view windir_wsv = windir;
|
|
||||||
|
|
||||||
for (const auto& module : special_module_infos)
|
|
||||||
{
|
|
||||||
const HMODULE hModule = GetModuleHandle(module.name.data());
|
|
||||||
if (hModule == NULL)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
WCHAR wpath[MAX_PATH];
|
|
||||||
if (const auto len = GetModuleFileName(hModule, wpath, MAX_PATH))
|
|
||||||
{
|
|
||||||
const std::wstring_view path_wsv = wpath;
|
|
||||||
if (path_wsv.find(windir_wsv) != 0)
|
|
||||||
{
|
|
||||||
const std::string path = wchar_to_utf8(wpath);
|
|
||||||
const std::string module_name = wchar_to_utf8(module.name);
|
|
||||||
const std::string error_message = fmt::format(
|
|
||||||
"<p>"
|
|
||||||
"The module <strong>%s</strong> was incorrectly installed at<br>"
|
|
||||||
"'%s'<br>"
|
|
||||||
"<br>"
|
|
||||||
"This module is part of the <strong>%s</strong> package.<br>"
|
|
||||||
"Install this package, then delete <strong>%s</strong> from rpcs3's installation directory.<br>"
|
|
||||||
"<br>"
|
|
||||||
"You can install this package from this URL:<br>"
|
|
||||||
"<a href='%s'>%s</a>"
|
|
||||||
"</p>",
|
|
||||||
module_name,
|
|
||||||
path,
|
|
||||||
module.package_name,
|
|
||||||
module_name,
|
|
||||||
module.dl_link,
|
|
||||||
module.dl_link
|
|
||||||
);
|
|
||||||
report_fatal_error(error_message, true, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WIN32_module_verifier() = default;
|
WIN32_module_verifier() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static void run();
|
||||||
static void run()
|
|
||||||
{
|
|
||||||
WIN32_module_verifier verifier{};
|
|
||||||
verifier.run_module_verification();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
@ -193,6 +193,7 @@
|
|||||||
<ClCompile Include="Input\mm_joystick_handler.cpp" />
|
<ClCompile Include="Input\mm_joystick_handler.cpp" />
|
||||||
<ClCompile Include="Input\pad_thread.cpp" />
|
<ClCompile Include="Input\pad_thread.cpp" />
|
||||||
<ClCompile Include="Input\product_info.cpp" />
|
<ClCompile Include="Input\product_info.cpp" />
|
||||||
|
<ClCompile Include="module_verifier.cpp" />
|
||||||
<ClCompile Include="QTGeneratedFiles\Debug\moc_about_dialog.cpp">
|
<ClCompile Include="QTGeneratedFiles\Debug\moc_about_dialog.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -1098,6 +1098,9 @@
|
|||||||
<ClCompile Include="Input\raw_mouse_config.cpp">
|
<ClCompile Include="Input\raw_mouse_config.cpp">
|
||||||
<Filter>Io\raw</Filter>
|
<Filter>Io\raw</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="module_verifier.cpp">
|
||||||
|
<Filter>rpcs3</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Input\ds4_pad_handler.h">
|
<ClInclude Include="Input\ds4_pad_handler.h">
|
||||||
|
Loading…
Reference in New Issue
Block a user