11use core:: {
2+ marker,
23 mem:: {
34 self ,
45 MaybeUninit ,
@@ -14,42 +15,88 @@ pub trait MemoryView: Send + Sync {
1415 fn read_memory ( & self , offset : u64 , buffer : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > ;
1516}
1617
17- /*
18- * Attention:
19- * This is dangarous MemoryView should only explicitly be implemented because
20- * this implementation allows to read from &0 (aka references) as 8 byte values.
21- */
22- impl < T : Copy + Send + Sync > MemoryView for T {
18+ impl MemoryView for & [ u8 ] {
2319 type Error = AccessViolation ;
2420
2521 fn read_memory ( & self , offset : u64 , buffer : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > {
26- let src_buffer = unsafe {
27- core:: slice:: from_raw_parts ( self as * const _ as * const u8 , core:: mem:: size_of_val ( self ) )
28- } ;
29-
3022 let offset = offset as usize ;
31- if offset + buffer. len ( ) > src_buffer . len ( ) {
23+ if offset + buffer. len ( ) > self . len ( ) {
3224 return Err ( AccessViolation ) ;
3325 }
3426
35- buffer. copy_from_slice ( & src_buffer [ offset..offset + buffer. len ( ) ] ) ;
27+ buffer. copy_from_slice ( & self [ offset..offset + buffer. len ( ) ] ) ;
3628 Ok ( ( ) )
3729 }
3830}
3931
32+ #[ derive( Clone ) ]
33+ pub struct CopyMemoryView < T : marker:: Copy > {
34+ inner : T ,
35+ }
36+
37+ impl < T : marker:: Copy > CopyMemoryView < T > {
38+ pub fn new ( value : T ) -> Self {
39+ Self { inner : value }
40+ }
41+ }
42+
43+ impl < T : marker:: Copy + Send + Sync > MemoryView for CopyMemoryView < T > {
44+ type Error = AccessViolation ;
45+
46+ fn read_memory ( & self , offset : u64 , buffer : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > {
47+ let src_buffer = unsafe {
48+ core:: slice:: from_raw_parts (
49+ & self . inner as * const _ as * const u8 ,
50+ core:: mem:: size_of_val ( self ) ,
51+ )
52+ } ;
53+
54+ src_buffer. read_memory ( offset, buffer)
55+ }
56+ }
57+
58+ impl < T : marker:: Copy + Send + Sync > From < T > for CopyMemoryView < T > {
59+ fn from ( value : T ) -> Self {
60+ Self :: new ( value)
61+ }
62+ }
63+
64+ impl < T : marker:: Copy > marker:: Copy for CopyMemoryView < T > { }
65+
4066pub trait FromMemoryView : Sized {
67+ /// Read an instance of this byte by byte and interpret it as this.
4168 fn read_object < E > ( view : & dyn MemoryView < Error = E > , offset : u64 ) -> Result < Self , E > ;
42- // fn read_boxed(view: &dyn MemoryView, offset: u64) -> Result<Box<Self>, Box<dyn error::ErrorType>>;
69+
70+ /// Read an instance of this byte by byte into heap memory
71+ fn read_boxed < E > ( view : & dyn MemoryView < Error = E > , offset : u64 ) -> Result < Box < Self > , E > ;
4372}
4473
4574impl < T : Copy > FromMemoryView for T {
4675 fn read_object < E > ( view : & dyn MemoryView < Error = E > , offset : u64 ) -> Result < Self , E > {
4776 let mut result = MaybeUninit :: uninit ( ) ;
4877 let size = mem:: size_of_val ( & result) ;
4978
50- let buffer = unsafe { slice:: from_raw_parts_mut ( & mut result as * mut _ as * mut u8 , size) } ;
51- view. read_memory ( offset, buffer) ?;
79+ // Safety:
80+ // As T is marker::Copy it is safe to access it's memory byte by byte
81+ let result = unsafe {
82+ let buffer = slice:: from_raw_parts_mut ( & mut result as * mut _ as * mut u8 , size) ;
83+ view. read_memory ( offset, buffer) ?;
84+ result. assume_init ( )
85+ } ;
86+ Ok ( result)
87+ }
88+
89+ fn read_boxed < E > ( view : & dyn MemoryView < Error = E > , offset : u64 ) -> Result < Box < Self > , E > {
90+ let mut result = Box :: new_uninit ( ) ;
91+ let size = mem:: size_of_val ( & result) ;
5292
53- Ok ( unsafe { result. assume_init ( ) } )
93+ // Safety:
94+ // As T is marker::Copy it is safe to access it's memory byte by byte
95+ let result = unsafe {
96+ let buffer = slice:: from_raw_parts_mut ( result. as_mut_ptr ( ) as * mut _ as * mut u8 , size) ;
97+ view. read_memory ( offset, buffer) ?;
98+ result. assume_init ( )
99+ } ;
100+ Ok ( result)
54101 }
55102}
0 commit comments