[Memory] List all partitions supporting non-FromApp memory mapping functions

This commit is contained in:
Triang3l 2021-05-04 23:27:57 +03:00
parent 40ca4abc0b
commit b099d74f78
2 changed files with 24 additions and 15 deletions

View File

@ -18,6 +18,11 @@
#include "xenia/base/memory.h" #include "xenia/base/memory.h"
#include "xenia/base/platform_win.h" #include "xenia/base/platform_win.h"
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | \
WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)
#define XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
#endif
namespace xe { namespace xe {
class Win32MappedMemory : public MappedMemory { class Win32MappedMemory : public MappedMemory {
@ -70,7 +75,7 @@ class Win32MappedMemory : public MappedMemory {
size_t aligned_length = length + (offset - aligned_offset); size_t aligned_length = length + (offset - aligned_offset);
UnmapViewOfFile(data_); UnmapViewOfFile(data_);
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
data_ = MapViewOfFile(mapping_handle, view_access_, aligned_offset >> 32, data_ = MapViewOfFile(mapping_handle, view_access_, aligned_offset >> 32,
aligned_offset & 0xFFFFFFFF, aligned_length); aligned_offset & 0xFFFFFFFF, aligned_length);
#else #else
@ -139,7 +144,7 @@ std::unique_ptr<MappedMemory> MappedMemory::Open(
return nullptr; return nullptr;
} }
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
mm->mapping_handle = CreateFileMapping( mm->mapping_handle = CreateFileMapping(
mm->file_handle, nullptr, mapping_protect, DWORD(aligned_length >> 32), mm->file_handle, nullptr, mapping_protect, DWORD(aligned_length >> 32),
DWORD(aligned_length), nullptr); DWORD(aligned_length), nullptr);
@ -152,7 +157,7 @@ std::unique_ptr<MappedMemory> MappedMemory::Open(
return nullptr; return nullptr;
} }
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
mm->data_ = reinterpret_cast<uint8_t*>(MapViewOfFile( mm->data_ = reinterpret_cast<uint8_t*>(MapViewOfFile(
mm->mapping_handle, view_access, DWORD(aligned_offset >> 32), mm->mapping_handle, view_access, DWORD(aligned_offset >> 32),
DWORD(aligned_offset), aligned_length)); DWORD(aligned_offset), aligned_length));
@ -257,7 +262,7 @@ class Win32ChunkedMappedMemoryWriter : public ChunkedMappedMemoryWriter {
return false; return false;
} }
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
mapping_handle_ = mapping_handle_ =
CreateFileMapping(file_handle_, nullptr, mapping_protect, CreateFileMapping(file_handle_, nullptr, mapping_protect,
DWORD(capacity_ >> 32), DWORD(capacity_), nullptr); DWORD(capacity_ >> 32), DWORD(capacity_), nullptr);
@ -275,11 +280,11 @@ class Win32ChunkedMappedMemoryWriter : public ChunkedMappedMemoryWriter {
if (low_address_space) { if (low_address_space) {
bool successful = false; bool successful = false;
data_ = reinterpret_cast<uint8_t*>(0x10000000); data_ = reinterpret_cast<uint8_t*>(0x10000000);
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifndef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
HANDLE process = GetCurrentProcess(); HANDLE process = GetCurrentProcess();
#endif #endif
for (int i = 0; i < 1000; ++i) { for (int i = 0; i < 1000; ++i) {
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
if (MapViewOfFileEx(mapping_handle_, view_access, 0, 0, capacity_, if (MapViewOfFileEx(mapping_handle_, view_access, 0, 0, capacity_,
data_)) { data_)) {
successful = true; successful = true;
@ -311,7 +316,7 @@ class Win32ChunkedMappedMemoryWriter : public ChunkedMappedMemoryWriter {
} }
} }
} else { } else {
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
data_ = reinterpret_cast<uint8_t*>( data_ = reinterpret_cast<uint8_t*>(
MapViewOfFile(mapping_handle_, view_access, 0, 0, capacity_)); MapViewOfFile(mapping_handle_, view_access, 0, 0, capacity_));
#else #else

View File

@ -11,6 +11,11 @@
#include "xenia/base/platform_win.h" #include "xenia/base/platform_win.h"
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | \
WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)
#define XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
#endif
namespace xe { namespace xe {
namespace memory { namespace memory {
@ -75,12 +80,11 @@ PageAccess ToXeniaProtectFlags(DWORD access) {
} }
bool IsWritableExecutableMemorySupported() { bool IsWritableExecutableMemorySupported() {
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
return true; return true;
#else #else
// To test FromApp functions on desktop, replace // To test FromApp functions on desktop, undefine
// WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) with 0 in the #ifs and // XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS and link to WindowsApp.lib.
// link to WindowsApp.lib.
return false; return false;
#endif #endif
} }
@ -103,7 +107,7 @@ void* AllocFixed(void* base_address, size_t length,
break; break;
} }
DWORD protect = ToWin32ProtectFlags(access); DWORD protect = ToWin32ProtectFlags(access);
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
return VirtualAlloc(base_address, length, alloc_type, protect); return VirtualAlloc(base_address, length, alloc_type, protect);
#else #else
return VirtualAllocFromApp(base_address, length, ULONG(alloc_type), return VirtualAllocFromApp(base_address, length, ULONG(alloc_type),
@ -135,7 +139,7 @@ bool Protect(void* base_address, size_t length, PageAccess access,
*out_old_access = PageAccess::kNoAccess; *out_old_access = PageAccess::kNoAccess;
} }
DWORD new_protect = ToWin32ProtectFlags(access); DWORD new_protect = ToWin32ProtectFlags(access);
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
DWORD old_protect = 0; DWORD old_protect = 0;
BOOL result = VirtualProtect(base_address, length, new_protect, &old_protect); BOOL result = VirtualProtect(base_address, length, new_protect, &old_protect);
#else #else
@ -174,7 +178,7 @@ FileMappingHandle CreateFileMappingHandle(const std::filesystem::path& path,
DWORD protect = DWORD protect =
ToWin32ProtectFlags(access) | (commit ? SEC_COMMIT : SEC_RESERVE); ToWin32ProtectFlags(access) | (commit ? SEC_COMMIT : SEC_RESERVE);
auto full_path = "Local" / path; auto full_path = "Local" / path;
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
return CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, protect, return CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, protect,
static_cast<DWORD>(length >> 32), static_cast<DWORD>(length >> 32),
static_cast<DWORD>(length), full_path.c_str()); static_cast<DWORD>(length), full_path.c_str());
@ -191,7 +195,7 @@ void CloseFileMappingHandle(FileMappingHandle handle,
void* MapFileView(FileMappingHandle handle, void* base_address, size_t length, void* MapFileView(FileMappingHandle handle, void* base_address, size_t length,
PageAccess access, size_t file_offset) { PageAccess access, size_t file_offset) {
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS
DWORD target_address_low = static_cast<DWORD>(file_offset); DWORD target_address_low = static_cast<DWORD>(file_offset);
DWORD target_address_high = static_cast<DWORD>(file_offset >> 32); DWORD target_address_high = static_cast<DWORD>(file_offset >> 32);
DWORD file_access = 0; DWORD file_access = 0;