diff --git a/src/driver/memory.cpp b/src/driver/memory.cpp index d5167a8..a1640a5 100644 --- a/src/driver/memory.cpp +++ b/src/driver/memory.cpp @@ -124,4 +124,24 @@ namespace memory throw std::runtime_error("Access violation"); } } + + bool prope_for_write(const void* address, const size_t length, const uint64_t alignment) + { + __try + { + ProbeForWrite(const_cast(address), length, static_cast(alignment)); + return true; + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + return false; + } + } + + void assert_writability(const void* address, const size_t length, const uint64_t alignment) + { + if (!prope_for_write(address, length, alignment)) { + throw std::runtime_error("Access violation"); + } + } } diff --git a/src/driver/memory.hpp b/src/driver/memory.hpp index e633afb..45661ea 100644 --- a/src/driver/memory.hpp +++ b/src/driver/memory.hpp @@ -26,6 +26,9 @@ namespace memory bool prope_for_read(const void* address, size_t length, uint64_t alignment = 1); void assert_readability(const void* address, size_t length, uint64_t alignment = 1); + bool prope_for_write(const void* address, size_t length, uint64_t alignment = 1); + void assert_writability(const void* address, size_t length, uint64_t alignment = 1); + template T* allocate_non_paged_object(Args ... args) {