mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 16:18:52 +00:00
Add Protect_Flags for virtual.protect
This commit is contained in:
@@ -16,12 +16,11 @@ commit :: proc(data: rawptr, size: uint) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
reserve_and_commit :: proc(size: uint) -> (data: []byte, err: Allocator_Error) {
|
reserve_and_commit :: proc(size: uint) -> (data: []byte, err: Allocator_Error) {
|
||||||
data = _reserve(size) or_return
|
data = reserve(size) or_return
|
||||||
commit(raw_data(data), size)
|
commit(raw_data(data), size)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
decommit :: proc(data: rawptr, size: uint) {
|
decommit :: proc(data: rawptr, size: uint) {
|
||||||
_decommit(data, size)
|
_decommit(data, size)
|
||||||
}
|
}
|
||||||
@@ -30,9 +29,18 @@ release :: proc(data: rawptr, size: uint) {
|
|||||||
_release(data, size)
|
_release(data, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
protect :: proc(data: rawptr, size: uint) -> bool {
|
Protect_Flag :: enum u32 {
|
||||||
return _protect(data, size)
|
Read,
|
||||||
|
Write,
|
||||||
|
Execute,
|
||||||
}
|
}
|
||||||
|
Protect_Flags :: distinct bit_set[Protect_Flag; u32]
|
||||||
|
Protect_No_Access :: Protect_Flags{}
|
||||||
|
|
||||||
|
protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool {
|
||||||
|
return _protect(data, size, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -73,7 +81,7 @@ memory_alloc :: proc(size: int) -> (block: ^Memory_Block, err: Allocator_Error)
|
|||||||
assert(pmblock.block.prev == nil)
|
assert(pmblock.block.prev == nil)
|
||||||
|
|
||||||
if (do_protection) {
|
if (do_protection) {
|
||||||
protect(rawptr(uintptr(pmblock) + protect_offset), page_size)
|
protect(rawptr(uintptr(pmblock) + protect_offset), page_size, Protect_No_Access)
|
||||||
}
|
}
|
||||||
|
|
||||||
pmblock.block.size = size
|
pmblock.block.size = size
|
||||||
|
|||||||
@@ -86,8 +86,13 @@ _decommit :: proc(data: rawptr, size: uint) {
|
|||||||
_release :: proc(data: rawptr, size: uint) {
|
_release :: proc(data: rawptr, size: uint) {
|
||||||
munmap(data, size)
|
munmap(data, size)
|
||||||
}
|
}
|
||||||
_protect :: proc(data: rawptr, size: uint) -> bool {
|
_protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool {
|
||||||
err := mprotect(data, size, PROT_NONE)
|
pflags: c.int
|
||||||
|
pflags = PROT_NONE
|
||||||
|
if .Read in flags { pflags |= PROT_READ }
|
||||||
|
if .Write in flags { pflags |= PROT_WRITE }
|
||||||
|
if .Execute in flags { pflags |= PROT_EXEC }
|
||||||
|
err := mprotect(data, size, pflags)
|
||||||
return err != 0
|
return err != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,9 +77,25 @@ _decommit :: proc(data: rawptr, size: uint) {
|
|||||||
_release :: proc(data: rawptr, size: uint) {
|
_release :: proc(data: rawptr, size: uint) {
|
||||||
VirtualFree(data, 0, MEM_RELEASE)
|
VirtualFree(data, 0, MEM_RELEASE)
|
||||||
}
|
}
|
||||||
_protect :: proc(data: rawptr, size: uint) -> bool {
|
_protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool {
|
||||||
|
pflags: u32
|
||||||
|
pflags = PAGE_NOACCESS
|
||||||
|
switch flags {
|
||||||
|
case {}: pflags = PAGE_NOACCESS
|
||||||
|
case {.Read}: pflags = PAGE_READONLY
|
||||||
|
case {.Read, .Write}: pflags = PAGE_READWRITE
|
||||||
|
case {.Write}: pflags = PAGE_WRITECOPY
|
||||||
|
case {.Execute}: pflags = PAGE_EXECUTE
|
||||||
|
case {.Execute, .Read}: pflags = PAGE_EXECUTE_READ
|
||||||
|
case {.Execute, .Read, .Write}: pflags = PAGE_EXECUTE_READWRITE
|
||||||
|
case {.Execute, .Write}: pflags = PAGE_EXECUTE_WRITECOPY
|
||||||
|
case:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
old_protect: u32
|
old_protect: u32
|
||||||
ok := VirtualProtect(data, size, PAGE_NOACCESS, &old_protect)
|
ok := VirtualProtect(data, size, pflags, &old_protect)
|
||||||
return bool(ok)
|
return bool(ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user