1 use crate::vm::sys::DecommitBehavior; 2 use std::fs::File; 3 use std::io; 4 use std::mem::MaybeUninit; 5 use std::sync::Arc; 6 use windows_sys::Win32::System::Memory::*; 7 use windows_sys::Win32::System::SystemInformation::*; 8 9 pub unsafe fn expose_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { 10 if len == 0 { 11 return Ok(()); 12 } 13 if VirtualAlloc(ptr.cast(), len, MEM_COMMIT, PAGE_READWRITE).is_null() { 14 Err(std::io::Error::last_os_error()) 15 } else { 16 Ok(()) 17 } 18 } 19 20 pub unsafe fn hide_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { 21 erase_existing_mapping(ptr, len) 22 } 23 24 pub unsafe fn erase_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { 25 if len == 0 { 26 return Ok(()); 27 } 28 if VirtualFree(ptr.cast(), len, MEM_DECOMMIT) == 0 { 29 Err(std::io::Error::last_os_error()) 30 } else { 31 Ok(()) 32 } 33 } 34 35 #[cfg(feature = "pooling-allocator")] 36 pub unsafe fn commit_pages(addr: *mut u8, len: usize) -> io::Result<()> { 37 expose_existing_mapping(addr, len) 38 } 39 40 pub unsafe fn decommit_pages(addr: *mut u8, len: usize) -> io::Result<()> { 41 erase_existing_mapping(addr, len) 42 } 43 44 pub fn get_page_size() -> usize { 45 unsafe { 46 let mut info = MaybeUninit::uninit(); 47 GetSystemInfo(info.as_mut_ptr()); 48 info.assume_init_ref().dwPageSize as usize 49 } 50 } 51 52 pub fn decommit_behavior() -> DecommitBehavior { 53 DecommitBehavior::Zero 54 } 55 56 #[derive(PartialEq, Debug)] 57 pub enum MemoryImageSource {} 58 59 impl MemoryImageSource { 60 pub fn from_file(_file: &Arc<File>) -> Option<MemoryImageSource> { 61 None 62 } 63 64 pub fn from_data(_data: &[u8]) -> io::Result<Option<MemoryImageSource>> { 65 Ok(None) 66 } 67 68 pub unsafe fn map_at(&self, _base: *mut u8, _len: usize, _offset: u64) -> io::Result<()> { 69 match *self {} 70 } 71 72 pub unsafe fn remap_as_zeros_at(&self, _base: *mut u8, _len: usize) -> io::Result<()> { 73 match *self {} 74 } 75 } 76