(size: usize)
| 30 | |
| 31 | #[allow(dead_code)] |
| 32 | pub unsafe fn alloc_mem(size: usize) -> Result<*mut u8, String> { |
| 33 | // Constants |
| 34 | const SECTION_ALL_ACCESS: u32 = 0xF001F; |
| 35 | const PAGE_EXECUTE_READWRITE: u32 = 0x40; |
| 36 | const SEC_COMMIT: u32 = 0x0800_0000; |
| 37 | // ViewUnmap = 2 |
| 38 | const VIEW_UNMAP: u32 = 2; |
| 39 | |
| 40 | // NtCreateSection via VEH syscall |
| 41 | let mut section_handle = HANDLE(0); |
| 42 | let mut max_size: i64 = size as i64; |
| 43 | |
| 44 | let create_status = syscall!( |
| 45 | "NtCreateSection", |
| 46 | NtCreateSection, |
| 47 | &mut section_handle as *mut HANDLE, |
| 48 | SECTION_ALL_ACCESS, |
| 49 | ptr::null_mut(), |
| 50 | &mut max_size as *mut i64, |
| 51 | PAGE_EXECUTE_READWRITE, |
| 52 | SEC_COMMIT, |
| 53 | HANDLE(0) |
| 54 | ); |
| 55 | |
| 56 | if create_status != 0 { |
| 57 | return Err(format!("NtCreateSection failed: 0x{:x}", create_status)); |
| 58 | } |
| 59 | |
| 60 | // NtMapViewOfSection via VEH syscall |
| 61 | let mut base_addr: *mut c_void = ptr::null_mut(); |
| 62 | let mut view_size: usize = size; |
| 63 | |
| 64 | let map_status = syscall!( |
| 65 | "NtMapViewOfSection", |
| 66 | NtMapViewOfSection, |
| 67 | section_handle, |
| 68 | HANDLE(-1isize as isize), // Current process pseudo-handle |
| 69 | &mut base_addr as *mut *mut c_void, |
| 70 | 0, |
| 71 | size, |
| 72 | ptr::null_mut(), |
| 73 | &mut view_size as *mut usize, |
| 74 | VIEW_UNMAP, |
| 75 | 0, |
| 76 | PAGE_EXECUTE_READWRITE |
| 77 | ); |
| 78 | |
| 79 | if map_status == 0 && !base_addr.is_null() { |
| 80 | Ok(base_addr as *mut u8) |
| 81 | } else { |
| 82 | Err(format!("NtMapViewOfSection failed: 0x{:x}", map_status)) |
| 83 | } |
| 84 | } |
nothing calls this directly
no outgoing calls
no test coverage detected