Skip to content

Commit 5aaf075

Browse files
committed
deps: Move from winapi to windows-sys
`winapi` is in maintenance mode and the new blessed way to access Windows APIs are the `windows` and `windows-sys` crates. I don't think any types of `winapi` were exposed in the public API so I used `windows-sys` since it has much faster compile times.
1 parent 83dbb5d commit 5aaf075

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

Cargo.toml

+10-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,13 @@ cc = "1.0.67"
2121
lazy_static = "1.4"
2222

2323
[target.'cfg(target_os = "windows")'.dependencies]
24-
winapi = { version = "0.3.9", features = ["psapi", "memoryapi", "libloaderapi", "processthreadsapi"] }
24+
windows-sys = { version = "0.45", features = [
25+
"Win32_Foundation",
26+
"Win32_System_Diagnostics_Debug",
27+
"Win32_System_LibraryLoader",
28+
"Win32_System_Memory",
29+
"Win32_System_ProcessStatus",
30+
"Win32_System_SystemServices",
31+
"Win32_System_Threading",
32+
"Win32_System_SystemInformation",
33+
] }

src/windows/mod.rs

+36-27
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::Segment as SegmentTrait;
44
use crate::SharedLibrary as SharedLibraryTrait;
55
use crate::{Bias, IterationControl, SharedLibraryId, Svma};
66

7-
use std::ffi::{CStr, OsStr, OsString};
7+
use std::ffi::{c_char, CStr, OsStr, OsString};
88
use std::fmt;
99
use std::marker::PhantomData;
1010
use std::mem;
@@ -13,19 +13,29 @@ use std::ptr;
1313
use std::slice;
1414
use std::usize;
1515

16-
use winapi::ctypes::c_char;
17-
use winapi::shared::minwindef::{HMODULE, MAX_PATH};
18-
use winapi::um::libloaderapi::{FreeLibrary, LoadLibraryExW, LOAD_LIBRARY_AS_DATAFILE};
19-
use winapi::um::memoryapi::VirtualQuery;
20-
use winapi::um::processthreadsapi::GetCurrentProcess;
21-
use winapi::um::psapi::{
22-
EnumProcessModules, GetModuleFileNameExW, GetModuleInformation, MODULEINFO,
23-
};
24-
use winapi::um::winnt::{
16+
use windows_sys::Win32::Foundation::{HINSTANCE, MAX_PATH};
17+
use windows_sys::Win32::System::Diagnostics::Debug::{
2518
IMAGE_DEBUG_DIRECTORY, IMAGE_DEBUG_TYPE_CODEVIEW, IMAGE_DIRECTORY_ENTRY_DEBUG,
26-
IMAGE_DOS_HEADER, IMAGE_DOS_SIGNATURE, IMAGE_NT_HEADERS, IMAGE_NT_SIGNATURE,
27-
IMAGE_SCN_CNT_CODE, IMAGE_SECTION_HEADER, MEMORY_BASIC_INFORMATION, MEM_COMMIT,
19+
IMAGE_SCN_CNT_CODE, IMAGE_SECTION_HEADER,
20+
};
21+
use windows_sys::Win32::System::LibraryLoader::{
22+
FreeLibrary, LoadLibraryExW, LOAD_LIBRARY_AS_DATAFILE,
23+
};
24+
use windows_sys::Win32::System::Memory::{VirtualQuery, MEMORY_BASIC_INFORMATION, MEM_COMMIT};
25+
use windows_sys::Win32::System::ProcessStatus::{
26+
K32EnumProcessModules, K32GetModuleFileNameExW, K32GetModuleInformation, MODULEINFO,
27+
};
28+
use windows_sys::Win32::System::SystemServices::{
29+
IMAGE_DOS_HEADER, IMAGE_DOS_SIGNATURE, IMAGE_NT_SIGNATURE,
2830
};
31+
use windows_sys::Win32::System::Threading::GetCurrentProcess;
32+
33+
#[allow(non_camel_case_types)]
34+
#[cfg(target_pointer_width = "64")]
35+
type IMAGE_NT_HEADERS = windows_sys::Win32::System::Diagnostics::Debug::IMAGE_NT_HEADERS64;
36+
#[allow(non_camel_case_types)]
37+
#[cfg(target_pointer_width = "32")]
38+
type IMAGE_NT_HEADERS = windows_sys::Win32::System::Diagnostics::Debug::IMAGE_NT_HEADERS32;
2939

3040
// This is 'RSDS'.
3141
const CV_SIGNATURE: u32 = 0x5344_5352;
@@ -65,7 +75,7 @@ impl<'a> SegmentTrait for Segment<'a> {
6575

6676
#[inline]
6777
fn len(&self) -> usize {
68-
*unsafe { self.section.Misc.VirtualSize() } as usize
78+
unsafe { self.section.Misc.VirtualSize as usize }
6979
}
7080
}
7181

@@ -154,7 +164,7 @@ impl<'a> SharedLibrary<'a> {
154164

155165
fn debug_directories(&self) -> &[IMAGE_DEBUG_DIRECTORY] {
156166
self.nt_headers().map_or(&[], |nt_headers| {
157-
if nt_headers.OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_DEBUG as u32 {
167+
if nt_headers.OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_DEBUG {
158168
return &[];
159169
}
160170
let data_dir =
@@ -260,36 +270,35 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
260270
let proc = unsafe { GetCurrentProcess() };
261271
let mut modules_size = 0;
262272
unsafe {
263-
if EnumProcessModules(proc, ptr::null_mut(), 0, &mut modules_size) == 0 {
273+
if K32EnumProcessModules(proc, ptr::null_mut(), 0, &mut modules_size) == 0 {
264274
return;
265275
}
266276
}
267-
let module_count = modules_size / mem::size_of::<HMODULE>() as u32;
277+
let module_count = modules_size / mem::size_of::<HINSTANCE>() as u32;
268278
let mut modules = vec![unsafe { mem::zeroed() }; module_count as usize];
269279
unsafe {
270-
if EnumProcessModules(proc, modules.as_mut_ptr(), modules_size, &mut modules_size) == 0
280+
if K32EnumProcessModules(proc, modules.as_mut_ptr(), modules_size, &mut modules_size)
281+
== 0
271282
{
272283
return;
273284
}
274285
}
275286

276-
modules.truncate(modules_size as usize / mem::size_of::<HMODULE>());
287+
modules.truncate(modules_size as usize / mem::size_of::<HINSTANCE>());
277288

278289
for module in modules {
279290
unsafe {
280-
let mut module_path = vec![0u16; MAX_PATH + 1];
281-
let module_path_len = GetModuleFileNameExW(
282-
proc,
283-
module,
284-
module_path.as_mut_ptr(),
285-
MAX_PATH as u32 + 1,
286-
) as usize;
291+
// Cast: `MAX_PATH` fits in a u16, on Windows it'll always fit in a usize
292+
let mut module_path = vec![0u16; MAX_PATH as usize + 1];
293+
let module_path_len =
294+
K32GetModuleFileNameExW(proc, module, module_path.as_mut_ptr(), MAX_PATH + 1)
295+
as usize;
287296
if module_path_len == 0 {
288297
continue;
289298
}
290299

291300
let mut module_info = mem::zeroed();
292-
if GetModuleInformation(
301+
if K32GetModuleInformation(
293302
proc,
294303
module,
295304
&mut module_info,
@@ -305,7 +314,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
305314
// loaded before.
306315
let handle_lock = LoadLibraryExW(
307316
module_path.as_ptr(),
308-
ptr::null_mut(),
317+
Default::default(),
309318
LOAD_LIBRARY_AS_DATAFILE,
310319
);
311320

0 commit comments

Comments
 (0)