diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 136c2d45..85f09574 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -156,3 +156,33 @@ dmn_rsp_from_thread(DMN_Handle thread) scratch_end(scratch); return result; } + +//////////////////////////////// +//~ Memory Helpers + +internal String8 +dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List block_list = {0}; + + for(U64 cursor = addr, stride = 256; ; cursor += stride) + { + U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); + U64 read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block); + String8 block = str8_cstring_capped(raw_block, raw_block + read_size); + + str8_list_push(scratch.arena, &block_list, block); + + if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) + { + break; + } + } + + String8 result = str8_list_join(arena, &block_list, 0); + + scratch_end(scratch); + return result; +} diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 923ea825..32ef28a0 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -226,6 +226,7 @@ internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); #define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr); //- rjf: threads internal Arch dmn_arch_from_thread(DMN_Handle handle);