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