Skip to content

Commit bec9758

Browse files
committed
Now uses windows-rs instead of winapi
1 parent ff417d7 commit bec9758

2 files changed

Lines changed: 93 additions & 130 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,7 @@ nix = "0.23"
3434
libc = "0.2"
3535

3636
[target.'cfg(windows)'.dependencies]
37-
winapi = { version = "0.3", features = [
38-
"ntdef",
39-
"winerror",
40-
"errhandlingapi",
41-
"handleapi",
42-
"memoryapi",
43-
"winbase",
44-
"winnt",
45-
] }
37+
win-sys = "0"
4638

4739
[dev-dependencies]
4840
raw_sync = "0.1"

src/windows.rs

Lines changed: 92 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,14 @@
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;
231
use std::fs::{File, OpenOptions};
242
use 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};
284
use std::path::PathBuf;
295
use std::ptr::null_mut;
306

7+
use log::*;
8+
use win_sys::*;
9+
10+
use crate::ShmemError;
11+
3112
pub 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

Comments
 (0)