2022-08-27 12:07:37 +00:00
|
|
|
-- Copyright (c) 2022 David Vogel
|
|
|
|
--
|
|
|
|
-- This software is released under the MIT License.
|
|
|
|
-- https://opensource.org/licenses/MIT
|
|
|
|
|
|
|
|
local ffi = require("ffi")
|
|
|
|
|
|
|
|
local Memory = {}
|
|
|
|
|
|
|
|
if ffi.abi'64bit' then
|
|
|
|
ffi.cdef([[
|
|
|
|
typedef uint64_t __uint3264;
|
|
|
|
]])
|
|
|
|
else
|
|
|
|
ffi.cdef([[
|
|
|
|
typedef uint32_t __uint3264;
|
|
|
|
]])
|
|
|
|
end
|
|
|
|
|
|
|
|
ffi.cdef([[
|
|
|
|
typedef void VOID;
|
|
|
|
typedef VOID *LPVOID;
|
|
|
|
typedef int BOOL;
|
|
|
|
typedef __uint3264 ULONG_PTR, *PULONG_PTR;
|
|
|
|
typedef ULONG_PTR SIZE_T, *PSIZE_T;
|
|
|
|
typedef unsigned long DWORD;
|
|
|
|
typedef DWORD *PDWORD;
|
|
|
|
|
|
|
|
BOOL VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
|
|
|
|
]])
|
|
|
|
|
|
|
|
Memory.PAGE_NOACCESS = 0x01
|
|
|
|
Memory.PAGE_READONLY = 0x02
|
|
|
|
Memory.PAGE_READWRITE = 0x04
|
|
|
|
Memory.PAGE_WRITECOPY = 0x08
|
|
|
|
Memory.PAGE_EXECUTE = 0x10
|
|
|
|
Memory.PAGE_EXECUTE_READ = 0x20
|
|
|
|
Memory.PAGE_EXECUTE_READWRITE = 0x40
|
|
|
|
Memory.PAGE_EXECUTE_WRITECOPY = 0x80
|
|
|
|
Memory.PAGE_GUARD = 0x100
|
|
|
|
Memory.PAGE_NOCACHE = 0x200
|
|
|
|
Memory.PAGE_WRITECOMBINE = 0x400
|
|
|
|
|
|
|
|
---Changes the protection on a region of committed pages in the virtual address space of the calling process.
|
|
|
|
---@param addr ffi.cdata*
|
|
|
|
---@param size integer
|
|
|
|
---@param newProtect integer
|
|
|
|
---@return ffi.cdata* oldProtect
|
|
|
|
function Memory.VirtualProtect(addr, size, newProtect)
|
2022-08-27 12:32:01 +00:00
|
|
|
local oldProtect = ffi.new('DWORD[1]')
|
|
|
|
if not ffi.C.VirtualProtect(addr, size, newProtect, oldProtect) then
|
2022-08-27 12:07:37 +00:00
|
|
|
error(string.format("failed to call VirtualProtect(%s, %s, %s)", addr, size, newProtect))
|
|
|
|
end
|
|
|
|
|
2022-08-27 12:32:01 +00:00
|
|
|
return oldProtect
|
2022-08-27 12:07:37 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return Memory
|