From 6e497ae372b6d7b39f38f42cbafce3b1b06040d3 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 18 May 2021 13:31:46 +0300 Subject: [PATCH] vm: disable sparse files on win7 --- rpcs3/util/vm_native.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/rpcs3/util/vm_native.cpp b/rpcs3/util/vm_native.cpp index eed9fbea62..00323d73be 100644 --- a/rpcs3/util/vm_native.cpp +++ b/rpcs3/util/vm_native.cpp @@ -332,16 +332,35 @@ namespace utils #ifdef _WIN32 fs::file f; + auto set_sparse = [](HANDLE h) -> bool + { + // Get version + const DWORD version_major = *reinterpret_cast(__readgsqword(0x60) + 0x118); + + // Disable sparse files on Windows 7 or lower + if (version_major <= 7) + { + return true; + } + + if (DeviceIoControl(h, FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr)) + { + return true; + } + + return false; + }; + if (!storage.empty()) { ensure(f.open(storage, fs::read + fs::write + fs::create)); } - else if (!f.open(fs::get_temp_dir() + "rpcs3_vm", fs::read + fs::write + fs::create) || !DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr)) + else if (!f.open(fs::get_temp_dir() + "rpcs3_vm", fs::read + fs::write + fs::create) || !set_sparse(f.get_handle())) { ensure(f.open(fs::get_cache_dir() + "rpcs3_vm", fs::read + fs::write + fs::create)); } - if (!DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr)) + if (!set_sparse(f.get_handle())) { MessageBoxW(0, L"Failed to initialize sparse file.", L"RPCS3", MB_ICONERROR); }