Update map_nt_to_emulator_protection to support PAGE_GUARD flag

This commit is contained in:
3fault
2025-07-01 18:28:54 -04:00
parent a8ae617e50
commit 7d8daf7c68
2 changed files with 33 additions and 18 deletions

View File

@@ -2,7 +2,7 @@
#include <vector>
#include <functional>
#include "memory_permission.hpp"
#include "windows-emulator/memory_permission_ext.hpp"
using mmio_read_callback = std::function<void(uint64_t addr, void* data, size_t size)>;
using mmio_write_callback = std::function<void(uint64_t addr, const void* data, size_t size)>;

View File

@@ -19,28 +19,43 @@ inline std::string get_permission_string(const memory_permission permission)
return res;
}
inline memory_permission map_nt_to_emulator_protection(uint32_t nt_protection)
inline nt_memory_permission map_nt_to_emulator_protection(uint32_t nt_protection)
{
nt_protection &= ~static_cast<uint32_t>(PAGE_GUARD); // TODO: Implement that
memory_permission_ext ext = memory_permission_ext::none;
// TODO: Check for invalid combinations
if (nt_protection & PAGE_GUARD)
{
// Unset the guard flag so the following switch statement will still work
nt_protection &= ~static_cast<uint32_t>(PAGE_GUARD);
ext = memory_permission_ext::guard;
}
memory_permission common = memory_permission::none;
switch (nt_protection)
{
case PAGE_NOACCESS:
return memory_permission::none;
case PAGE_READONLY:
return memory_permission::read;
case PAGE_READWRITE:
case PAGE_WRITECOPY:
return memory_permission::read | memory_permission::write;
case PAGE_EXECUTE:
case PAGE_EXECUTE_READ:
return memory_permission::read | memory_permission::exec;
case PAGE_EXECUTE_READWRITE:
return memory_permission::all;
case PAGE_EXECUTE_WRITECOPY:
default:
throw std::runtime_error("Failed to map protection");
case PAGE_NOACCESS:
common = memory_permission::none;
break;
case PAGE_READONLY:
common = memory_permission::read;
break;
case PAGE_READWRITE:
case PAGE_WRITECOPY:
common = memory_permission::read | memory_permission::write;
break;
case PAGE_EXECUTE:
case PAGE_EXECUTE_READ:
common = memory_permission::read | memory_permission::exec;
break;
case PAGE_EXECUTE_READWRITE:
common = memory_permission::all;
break;
case PAGE_EXECUTE_WRITECOPY:
default:
throw std::runtime_error("Failed to map protection");
}
return nt_memory_permission { common, ext };
}
inline uint32_t map_emulator_to_nt_protection(const memory_permission permission)