Skip to content
This repository was archived by the owner on Sep 22, 2019. It is now read-only.

Commit 5c22579

Browse files
committed
bootservices: add implementation for get_memory_map
1 parent 4f43146 commit 5c22579

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

src/bootservices.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use core::ptr;
22
use core::mem;
33

44
use void::{NotYetDef, CVoid};
5-
use base::{Event, Handle, Handles, MemoryType, Status};
5+
use base::{Event, Handle, Handles, MemoryType, MemoryDescriptor, Status};
66
use protocols;
77
use guid;
88
use table;
@@ -22,7 +22,7 @@ pub struct BootServices {
2222
restore_tpl: *const NotYetDef,
2323
allocate_pages: *const NotYetDef,
2424
free_pages: *const NotYetDef,
25-
get_memory_map: *const NotYetDef,
25+
get_memory_map: unsafe extern "win64" fn(memory_map_size: *mut usize, memory_map: *mut MemoryDescriptor, *mut usize, descriptor_size: *mut usize, descriptor_version: *mut u32) -> Status,
2626
allocate_pool: unsafe extern "win64" fn(pool_type: MemoryType, size: usize, out: &mut *mut CVoid) -> Status,
2727
free_pool: unsafe extern "win64" fn(*mut CVoid),
2828
create_event: *const NotYetDef,
@@ -66,6 +66,26 @@ pub struct BootServices {
6666
}
6767

6868
impl BootServices {
69+
// return (memory_map, memory_map_size, map_key, descriptor_size, descriptor_version)
70+
pub unsafe fn get_memory_map(&self, memory_map_size: &mut usize)
71+
-> Result<(&'static MemoryDescriptor, usize, usize, usize, u32), Status> {
72+
let ptr = try!(self.allocate_pool::<MemoryDescriptor>(*memory_map_size));
73+
let mut map_key: usize = 0;
74+
let mut descriptor_size: usize = 0;
75+
let mut descriptor_version: u32 = 0;
76+
77+
let status = (self.get_memory_map)(memory_map_size, ptr, &mut map_key,
78+
&mut descriptor_size, &mut descriptor_version);
79+
if status == Status::Success {
80+
let r = mem::transmute::<*mut MemoryDescriptor, &'static MemoryDescriptor>(ptr);
81+
Ok((r, map_key, *memory_map_size, descriptor_size,descriptor_version))
82+
83+
} else {
84+
self.free_pool::<MemoryDescriptor>(ptr);
85+
Err(status)
86+
}
87+
}
88+
6989
pub fn allocate_pool<T>(&self, buffer_size: usize) -> Result<*mut T, Status>{
7090
let mut ptr: *mut CVoid = 0 as *mut CVoid;
7191
let status = unsafe { (self.allocate_pool)(::get_pool_allocation_type(), buffer_size, &mut ptr) };

0 commit comments

Comments
 (0)