mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 04:25:12 +00:00
Fix bug where files were always mapped as read only.
This commit is contained in:
parent
dc91317898
commit
46b28fd25b
@ -246,9 +246,18 @@ uintptr_t IOFile::GetFileMapping() {
|
|||||||
}
|
}
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
const int fd = fileno(file);
|
const int fd = fileno(file);
|
||||||
|
|
||||||
HANDLE hfile = reinterpret_cast<HANDLE>(_get_osfhandle(fd));
|
HANDLE hfile = reinterpret_cast<HANDLE>(_get_osfhandle(fd));
|
||||||
HANDLE mapping =
|
HANDLE mapping = nullptr;
|
||||||
CreateFileMapping2(hfile, NULL, FILE_MAP_READ, PAGE_READONLY, SEC_COMMIT, 0, NULL, NULL, 0);
|
|
||||||
|
if (file_access_mode == FileAccessMode::ReadWrite) {
|
||||||
|
mapping = CreateFileMapping2(hfile, NULL, FILE_MAP_WRITE, PAGE_READWRITE, SEC_COMMIT,
|
||||||
|
0, NULL, NULL, 0);
|
||||||
|
} else {
|
||||||
|
mapping = CreateFileMapping2(hfile, NULL, FILE_MAP_READ, PAGE_READONLY, SEC_COMMIT,
|
||||||
|
0, NULL, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
file_mapping = std::bit_cast<uintptr_t>(mapping);
|
file_mapping = std::bit_cast<uintptr_t>(mapping);
|
||||||
ASSERT_MSG(file_mapping, "{}", Common::GetLastErrorMsg());
|
ASSERT_MSG(file_mapping, "{}", Common::GetLastErrorMsg());
|
||||||
return file_mapping;
|
return file_mapping;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/error.h"
|
#include "common/error.h"
|
||||||
#include "core/address_space.h"
|
#include "core/address_space.h"
|
||||||
|
#include "core/memory.h"
|
||||||
#include "core/libraries/kernel/memory_management.h"
|
#include "core/libraries/kernel/memory_management.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -18,6 +19,18 @@ namespace Core {
|
|||||||
|
|
||||||
static constexpr size_t BackingSize = SCE_KERNEL_MAIN_DMEM_SIZE;
|
static constexpr size_t BackingSize = SCE_KERNEL_MAIN_DMEM_SIZE;
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr u64 ToWindowsProt(Core::MemoryProt prot) {
|
||||||
|
switch (prot) {
|
||||||
|
case Core::MemoryProt::NoAccess:
|
||||||
|
default:
|
||||||
|
return PAGE_NOACCESS;
|
||||||
|
case Core::MemoryProt::CpuRead:
|
||||||
|
return PAGE_READONLY;
|
||||||
|
case Core::MemoryProt::CpuReadWrite:
|
||||||
|
return PAGE_READWRITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
struct AddressSpace::Impl {
|
struct AddressSpace::Impl {
|
||||||
Impl() : process{GetCurrentProcess()} {
|
Impl() : process{GetCurrentProcess()} {
|
||||||
@ -325,8 +338,8 @@ void* AddressSpace::Map(VAddr virtual_addr, size_t size, u64 alignment, PAddr ph
|
|||||||
is_exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);
|
is_exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* AddressSpace::MapFile(VAddr virtual_addr, size_t size, size_t offset, uintptr_t fd) {
|
void* AddressSpace::MapFile(VAddr virtual_addr, size_t size, size_t offset, u32 prot, uintptr_t fd) {
|
||||||
return impl->Map(virtual_addr, offset, size, fd ? PAGE_READONLY : PAGE_READWRITE, fd);
|
return impl->Map(virtual_addr, offset, size, ToWindowsProt(std::bit_cast<Core::MemoryProt>(prot)), fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddressSpace::Unmap(VAddr virtual_addr, size_t size, bool has_backing) {
|
void AddressSpace::Unmap(VAddr virtual_addr, size_t size, bool has_backing) {
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
bool exec = false);
|
bool exec = false);
|
||||||
|
|
||||||
/// Memory maps a specified file descriptor.
|
/// Memory maps a specified file descriptor.
|
||||||
void* MapFile(VAddr virtual_addr, size_t size, size_t offset, uintptr_t fd);
|
void* MapFile(VAddr virtual_addr, size_t size, size_t offset, u32 prot, uintptr_t fd);
|
||||||
|
|
||||||
/// Unmaps specified virtual memory area.
|
/// Unmaps specified virtual memory area.
|
||||||
void Unmap(VAddr virtual_addr, size_t size, bool has_backing);
|
void Unmap(VAddr virtual_addr, size_t size, bool has_backing);
|
||||||
|
@ -195,7 +195,7 @@ int MemoryManager::MapFile(void** out_addr, VAddr virtual_addr, size_t size, Mem
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Map the file.
|
// Map the file.
|
||||||
impl.MapFile(mapped_addr, size, offset, fd);
|
impl.MapFile(mapped_addr, size, offset, std::bit_cast<u32>(prot), fd);
|
||||||
|
|
||||||
// Add virtual memory area
|
// Add virtual memory area
|
||||||
auto& new_vma = AddMapping(mapped_addr, size_aligned);
|
auto& new_vma = AddMapping(mapped_addr, size_aligned);
|
||||||
|
Loading…
Reference in New Issue
Block a user