@@ -2,7 +2,7 @@ use core::ptr;
22use core:: mem;
33
44use void:: { NotYetDef , CVoid } ;
5- use base:: { Event , Handle , Handles , MemoryType , Status } ;
5+ use base:: { Event , Handle , Handles , MemoryType , MemoryDescriptor , Status } ;
66use protocols;
77use guid;
88use 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
6868impl 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