MmQueryAddressProtect.

This commit is contained in:
Ben Vanik 2013-10-22 23:34:24 -07:00
parent 2a8a19e4be
commit 447ce90b7b
3 changed files with 29 additions and 11 deletions

View File

@ -12,6 +12,9 @@
#include <gflags/gflags.h> #include <gflags/gflags.h>
#include <xenia/core/mutex.h> #include <xenia/core/mutex.h>
// TODO(benvanik): move xbox.h out
#include <xenia/kernel/xbox.h>
#if !XE_PLATFORM(WIN32) #if !XE_PLATFORM(WIN32)
#include <sys/mman.h> #include <sys/mman.h>
#endif // WIN32 #endif // WIN32
@ -377,14 +380,12 @@ int xe_memory_protect(
size_t heap_guard_size = FLAGS_heap_guard_pages * 4096; size_t heap_guard_size = FLAGS_heap_guard_pages * 4096;
p += heap_guard_size; p += heap_guard_size;
DWORD new_protect = 0; DWORD new_protect = access;
if (access & XE_MEMORY_ACCESS_WRITE) { new_protect = new_protect & (
new_protect = PAGE_READWRITE; X_PAGE_NOACCESS | X_PAGE_READONLY | X_PAGE_READWRITE |
} else if (access & XE_MEMORY_ACCESS_READ) { X_PAGE_WRITECOPY | X_PAGE_GUARD | X_PAGE_NOCACHE |
new_protect = PAGE_READONLY; X_PAGE_WRITECOMBINE);
} else {
new_protect = PAGE_NOACCESS;
}
DWORD old_protect; DWORD old_protect;
return VirtualProtect(p, size, new_protect, &old_protect) == TRUE ? 0 : 1; return VirtualProtect(p, size, new_protect, &old_protect) == TRUE ? 0 : 1;
} }
@ -572,3 +573,13 @@ uint32_t xe_memory_heap_t::Free(uint32_t address, uint32_t size) {
return (uint32_t)real_size; return (uint32_t)real_size;
} }
uint32_t xe_memory_query_protect(xe_memory_ref memory, uint32_t address) {
uint8_t* p = memory->mapping_base + address;
MEMORY_BASIC_INFORMATION info;
size_t info_size = VirtualQuery((void*)p, &info, sizeof(info));
if (!info_size) {
return 0;
}
return info.Protect;
}

View File

@ -61,5 +61,7 @@ int xe_memory_heap_free(xe_memory_ref memory, uint32_t addr, uint32_t size);
bool xe_memory_is_valid(xe_memory_ref memory, uint32_t address); bool xe_memory_is_valid(xe_memory_ref memory, uint32_t address);
int xe_memory_protect(xe_memory_ref memory, uint32_t address, uint32_t size, int xe_memory_protect(xe_memory_ref memory, uint32_t address, uint32_t size,
uint32_t access); uint32_t access);
uint32_t xe_memory_query_protect(xe_memory_ref memory, uint32_t address);
#endif // XENIA_CORE_MEMORY_H_ #endif // XENIA_CORE_MEMORY_H_

View File

@ -307,8 +307,13 @@ SHIM_CALL MmFreePhysicalMemory_shim(
uint32_t xeMmQueryAddressProtect(uint32_t base_address) { uint32_t xeMmQueryAddressProtect(uint32_t base_address) {
XELOGW("MmQueryAddressProtect faked!"); KernelState* state = shared_kernel_state_;
return 0; XEASSERTNOTNULL(state);
uint32_t access = xe_memory_query_protect(
state->memory(), base_address);
return access;
} }
@ -375,6 +380,6 @@ void xe::kernel::xboxkrnl::RegisterMemoryExports(
//SHIM_SET_MAPPING("xboxkrnl.exe", MmAllocatePhysicalMemory, state); //SHIM_SET_MAPPING("xboxkrnl.exe", MmAllocatePhysicalMemory, state);
SHIM_SET_MAPPING("xboxkrnl.exe", MmAllocatePhysicalMemoryEx, state); SHIM_SET_MAPPING("xboxkrnl.exe", MmAllocatePhysicalMemoryEx, state);
SHIM_SET_MAPPING("xboxkrnl.exe", MmFreePhysicalMemory, state); SHIM_SET_MAPPING("xboxkrnl.exe", MmFreePhysicalMemory, state);
//SHIM_SET_MAPPING("xboxkrnl.exe", MmQueryAddressProtect, state); SHIM_SET_MAPPING("xboxkrnl.exe", MmQueryAddressProtect, state);
SHIM_SET_MAPPING("xboxkrnl.exe", MmGetPhysicalAddress, state); SHIM_SET_MAPPING("xboxkrnl.exe", MmGetPhysicalAddress, state);
} }