1- use :: winapi:: {
2- shared:: { ntdef:: NULL , winerror:: ERROR_ALREADY_EXISTS } ,
3- um:: {
4- errhandlingapi:: GetLastError ,
5- handleapi:: CloseHandle ,
6- memoryapi:: {
7- CreateFileMappingW , MapViewOfFile , UnmapViewOfFile , VirtualQuery , FILE_MAP_READ ,
8- FILE_MAP_WRITE ,
9- } ,
10- winbase:: FILE_FLAG_DELETE_ON_CLOSE ,
11- winnt:: {
12- DELETE , FILE_ATTRIBUTE_TEMPORARY , FILE_SHARE_DELETE , FILE_SHARE_READ , FILE_SHARE_WRITE ,
13- GENERIC_READ , GENERIC_WRITE , HANDLE , MEMORY_BASIC_INFORMATION , PAGE_READWRITE ,
14- } ,
15- } ,
16- } ;
17-
18- #[ allow( unused_imports) ]
19- use crate :: log:: * ;
20- use crate :: ShmemError ;
21-
22- use std:: ffi:: OsStr ;
231use std:: fs:: { File , OpenOptions } ;
242use std:: io:: ErrorKind ;
25- use std:: iter:: once;
26- use std:: mem:: size_of;
27- use std:: os:: windows:: { ffi:: OsStrExt , fs:: OpenOptionsExt , io:: AsRawHandle } ;
3+ use std:: os:: windows:: { fs:: OpenOptionsExt , io:: AsRawHandle } ;
284use std:: path:: PathBuf ;
295use std:: ptr:: null_mut;
306
7+ use log:: * ;
8+ use win_sys:: * ;
9+
10+ use crate :: ShmemError ;
11+
3112pub struct MapData {
3213 owner : bool ,
3314
@@ -52,19 +33,15 @@ impl Drop for MapData {
5233 ///Takes care of properly closing the SharedMem
5334 fn drop ( & mut self ) {
5435 //Unmap memory from our process
55- if self . map_ptr as * mut _ != NULL {
36+ if ! self . map_ptr . is_null ( ) {
5637 trace ! ( "UnmapViewOfFile(map_ptr:{:p})" , self . map_ptr) ;
57- unsafe {
58- UnmapViewOfFile ( self . map_ptr as * mut _ ) ;
59- }
38+ let _ = UnmapViewOfFile ( self . map_ptr as _ ) ;
6039 }
6140
6241 //Close our mapping
63- if self . map_handle as * mut _ != NULL {
64- trace ! ( "CloseHandle(map_handle:{:p})" , self . map_handle) ;
65- unsafe {
66- CloseHandle ( self . map_handle ) ;
67- }
42+ if self . map_handle . 0 != 0 {
43+ trace ! ( "CloseHandle(map_handle:0x{:X})" , self . map_handle. 0 ) ;
44+ let _ = CloseHandle ( self . map_handle ) ;
6845 }
6946
7047 // Inspired by the boost implementation at
@@ -85,9 +62,9 @@ impl Drop for MapData {
8562 debug ! ( "Setting mapping to delete after everyone has closed it" ) ;
8663 match OpenOptions :: new ( )
8764 . access_mode ( GENERIC_READ | GENERIC_WRITE | DELETE )
88- . share_mode ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE )
65+ . share_mode ( ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ) . 0 )
8966 . create ( false )
90- . attributes ( FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE )
67+ . attributes ( ( FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE ) . 0 )
9168 . open ( & file_path)
9269 {
9370 Ok ( _) => {
@@ -155,9 +132,9 @@ pub fn create_mapping(unique_id: &str, map_size: usize) -> Result<MapData, Shmem
155132 let persistent_file = match OpenOptions :: new ( )
156133 . read ( true )
157134 . write ( true )
158- . share_mode ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE )
135+ . share_mode ( ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ) . 0 )
159136 . create_new ( true )
160- . attributes ( FILE_ATTRIBUTE_TEMPORARY )
137+ . attributes ( ( FILE_ATTRIBUTE_TEMPORARY ) . 0 )
161138 . open ( & file_path)
162139 {
163140 Ok ( f) => f,
@@ -170,7 +147,7 @@ pub fn create_mapping(unique_id: &str, map_size: usize) -> Result<MapData, Shmem
170147 owner : true ,
171148 persistent_file,
172149 unique_id : String :: from ( unique_id) ,
173- map_handle : NULL ,
150+ map_handle : HANDLE ( 0 ) ,
174151 map_size,
175152 map_ptr : null_mut ( ) ,
176153 } ;
@@ -179,51 +156,60 @@ pub fn create_mapping(unique_id: &str, map_size: usize) -> Result<MapData, Shmem
179156 debug ! ( "Creating memory mapping" ) ;
180157 let high_size: u32 = ( ( map_size as u64 & 0xFFFF_FFFF_0000_0000_u64 ) >> 32 ) as u32 ;
181158 let low_size: u32 = ( map_size as u64 & 0xFFFF_FFFF_u64 ) as u32 ;
182- let unique_id: Vec < u16 > = OsStr :: new ( unique_id) . encode_wide ( ) . chain ( once ( 0 ) ) . collect ( ) ;
183- new_map. map_handle = unsafe {
184- CreateFileMappingW (
185- new_map. persistent_file . as_raw_handle ( ) as _ ,
186- null_mut ( ) ,
187- PAGE_READWRITE ,
188- high_size,
189- low_size,
190- unique_id. as_ptr ( ) ,
191- )
192- } ;
193- let last_error = unsafe { GetLastError ( ) } ;
159+ //let unique_id: Vec<u16> = OsStr::new(unique_id).encode_wide().chain(once(0)).collect();
194160 trace ! (
195- "CreateFileMappingW({:p}, NULL, {:X}, {}, {}, '{}') == {:p }" ,
161+ "CreateFileMappingW({:p}, NULL, {:X}, {}, {}, '{}') == 0x{:X }" ,
196162 new_map. persistent_file. as_raw_handle( ) ,
197- PAGE_READWRITE ,
163+ PAGE_READWRITE . 0 ,
198164 high_size,
199165 low_size,
200166 new_map. unique_id,
201- new_map. map_handle
167+ new_map. map_handle. 0
202168 ) ;
203169
204- if new_map. map_handle == NULL {
205- return Err ( ShmemError :: MapCreateFailed ( last_error) ) ;
206- } else if last_error == ERROR_ALREADY_EXISTS {
207- return Err ( ShmemError :: MappingIdExists ) ;
208- }
170+ new_map. map_handle = match CreateFileMappingW (
171+ HANDLE ( new_map. persistent_file . as_raw_handle ( ) as _ ) ,
172+ None ,
173+ PAGE_READWRITE ,
174+ high_size,
175+ low_size,
176+ unique_id,
177+ ) {
178+ Ok ( v) => v,
179+ Err ( e) => {
180+ let err_code = e. win32_error ( ) . unwrap ( ) ;
181+ return if err_code == ERROR_ALREADY_EXISTS . 0 {
182+ Err ( ShmemError :: MappingIdExists )
183+ } else {
184+ Err ( ShmemError :: MapCreateFailed ( err_code) )
185+ } ;
186+ }
187+ } ;
188+
189+ trace ! (
190+ "CreateFileMappingW({:p}, NULL, {:X}, {}, {}, '{}') == 0x{:X}" ,
191+ new_map. persistent_file. as_raw_handle( ) ,
192+ PAGE_READWRITE . 0 ,
193+ high_size,
194+ low_size,
195+ new_map. unique_id,
196+ new_map. map_handle. 0
197+ ) ;
209198
210199 //Map mapping into address space
211200 debug ! ( "Loading mapping into address space" ) ;
212201 new_map. map_ptr =
213- unsafe { MapViewOfFile ( new_map. map_handle , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 ) } as _ ;
214-
215- let last_error = unsafe { GetLastError ( ) } ;
202+ match MapViewOfFile ( new_map. map_handle , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 ) {
203+ Ok ( v) => v as _ ,
204+ Err ( e) => return Err ( ShmemError :: MapCreateFailed ( e. win32_error ( ) . unwrap ( ) ) ) ,
205+ } ;
216206 trace ! (
217- "MapViewOfFile({:p }, {:X}, 0, 0, 0) == {:p}" ,
218- new_map. map_handle,
219- FILE_MAP_READ | FILE_MAP_WRITE ,
207+ "MapViewOfFile(0x{:X }, {:X}, 0, 0, 0) == {:p}" ,
208+ new_map. map_handle. 0 ,
209+ ( FILE_MAP_READ | FILE_MAP_WRITE ) . 0 ,
220210 new_map. map_ptr
221211 ) ;
222212
223- if new_map. map_ptr . is_null ( ) {
224- return Err ( ShmemError :: MapCreateFailed ( last_error) ) ;
225- }
226-
227213 Ok ( new_map)
228214}
229215
@@ -239,9 +225,9 @@ pub fn open_mapping(unique_id: &str, map_size: usize) -> Result<MapData, ShmemEr
239225 // Open the file backing the shared memory
240226 let persistent_file = match OpenOptions :: new ( )
241227 . access_mode ( GENERIC_READ | GENERIC_WRITE )
242- . share_mode ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE )
228+ . share_mode ( ( FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ) . 0 )
243229 . create ( false )
244- . attributes ( FILE_ATTRIBUTE_TEMPORARY )
230+ . attributes ( FILE_ATTRIBUTE_TEMPORARY . 0 )
245231 . open ( & file_path)
246232 {
247233 Ok ( f) => f,
@@ -254,7 +240,7 @@ pub fn open_mapping(unique_id: &str, map_size: usize) -> Result<MapData, ShmemEr
254240 owner : false ,
255241 persistent_file,
256242 unique_id : String :: from ( unique_id) ,
257- map_handle : NULL ,
243+ map_handle : HANDLE ( 0 ) ,
258244 map_size,
259245 map_ptr : null_mut ( ) ,
260246 } ;
@@ -265,71 +251,56 @@ pub fn open_mapping(unique_id: &str, map_size: usize) -> Result<MapData, ShmemEr
265251 debug ! ( "Openning memory mapping" ) ;
266252 let high_size: u32 = ( ( map_size as u64 & 0xFFFF_FFFF_0000_0000_u64 ) >> 32 ) as u32 ;
267253 let low_size: u32 = ( map_size as u64 & 0xFFFF_FFFF_u64 ) as u32 ;
268- let unique_id: Vec < u16 > = OsStr :: new ( unique_id) . encode_wide ( ) . chain ( once ( 0 ) ) . collect ( ) ;
269- new_map. map_handle = unsafe {
270- CreateFileMappingW (
271- new_map. persistent_file . as_raw_handle ( ) as _ ,
272- null_mut ( ) ,
273- PAGE_READWRITE ,
274- high_size,
275- low_size,
276- unique_id. as_ptr ( ) ,
277- )
254+
255+ new_map. map_handle = match CreateFileMappingW (
256+ HANDLE ( new_map. persistent_file . as_raw_handle ( ) as _ ) ,
257+ None ,
258+ PAGE_READWRITE ,
259+ high_size,
260+ low_size,
261+ unique_id,
262+ ) {
263+ Ok ( v) => v,
264+ Err ( e) => {
265+ let err_code = e. win32_error ( ) . unwrap ( ) ;
266+ return if err_code == ERROR_ALREADY_EXISTS . 0 {
267+ Err ( ShmemError :: MappingIdExists )
268+ } else {
269+ Err ( ShmemError :: MapOpenFailed ( err_code) )
270+ } ;
271+ }
278272 } ;
279- let last_error = unsafe { GetLastError ( ) } ;
273+
280274 trace ! (
281- "CreateFileMappingW({:p}, NULL, {:X}, {}, {}, '{}') == {:p }" ,
275+ "CreateFileMappingW({:p}, NULL, {:X}, {}, {}, '{}') == 0x{:X }" ,
282276 new_map. persistent_file. as_raw_handle( ) ,
283- PAGE_READWRITE ,
277+ PAGE_READWRITE . 0 ,
284278 high_size,
285279 low_size,
286280 new_map. unique_id,
287- new_map. map_handle
281+ new_map. map_handle. 0
288282 ) ;
289- if new_map. map_handle == NULL {
290- return Err ( ShmemError :: MapCreateFailed ( last_error) ) ;
291- }
292283
293284 //Map mapping into address space
294285 debug ! ( "Loading mapping into address space" ) ;
295286 new_map. map_ptr =
296- unsafe { MapViewOfFile ( new_map. map_handle , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 ) } as _ ;
297- let last_error = unsafe { GetLastError ( ) } ;
287+ match MapViewOfFile ( new_map. map_handle , FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0 ) {
288+ Ok ( v) => v as _ ,
289+ Err ( e) => return Err ( ShmemError :: MapOpenFailed ( e. win32_error ( ) . unwrap ( ) ) ) ,
290+ } ;
298291 trace ! (
299- "MapViewOfFile({:p }, {:X}, 0, 0, 0) == {:p}" ,
300- new_map. map_handle,
301- FILE_MAP_READ | FILE_MAP_WRITE ,
292+ "MapViewOfFile(0x{:X }, {:X}, 0, 0, 0) == {:p}" ,
293+ new_map. map_handle. 0 ,
294+ ( FILE_MAP_READ | FILE_MAP_WRITE ) . 0 ,
302295 new_map. map_ptr
303296 ) ;
304- if new_map. map_ptr . is_null ( ) {
305- return Err ( ShmemError :: MapOpenFailed ( last_error) ) ;
306- }
307297
308298 //Get the size of our mapping
309- new_map. map_size = unsafe {
310- let mut mem_ba: MEMORY_BASIC_INFORMATION = MEMORY_BASIC_INFORMATION {
311- BaseAddress : null_mut ( ) ,
312- AllocationBase : null_mut ( ) ,
313- AllocationProtect : 0 ,
314- RegionSize : 0 ,
315- State : 0 ,
316- Protect : 0 ,
317- Type : 0 ,
318- } ;
319- let ret_val = VirtualQuery (
320- new_map. map_ptr as * const _ ,
321- & mut mem_ba as * mut _ ,
322- size_of :: < MEMORY_BASIC_INFORMATION > ( ) ,
323- ) ;
324-
325- //Couldnt get mapping size
326- if ret_val == 0 {
327- let last_error = GetLastError ( ) ;
328- return Err ( ShmemError :: UnknownOsError ( last_error) ) ;
329- }
330-
331- mem_ba. RegionSize
332- } ;
299+ let mut info = MEMORY_BASIC_INFORMATION :: default ( ) ;
300+ if let Err ( e) = VirtualQuery ( new_map. map_ptr as _ , & mut info) {
301+ return Err ( ShmemError :: UnknownOsError ( e. win32_error ( ) . unwrap ( ) ) ) ;
302+ }
303+ new_map. map_size = info. RegionSize ;
333304
334305 Ok ( new_map)
335306}
0 commit comments