Skip to content

Commit f1dd805

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 f1dd805

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
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

+32-30
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,22 @@ 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_NT_HEADERS64, 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,
2827
};
28+
use windows_sys::Win32::System::SystemServices::{
29+
IMAGE_DOS_HEADER, IMAGE_DOS_SIGNATURE, IMAGE_NT_SIGNATURE,
30+
};
31+
use windows_sys::Win32::System::Threading::GetCurrentProcess;
2932

3033
// This is 'RSDS'.
3134
const CV_SIGNATURE: u32 = 0x5344_5352;
@@ -65,7 +68,7 @@ impl<'a> SegmentTrait for Segment<'a> {
6568

6669
#[inline]
6770
fn len(&self) -> usize {
68-
*unsafe { self.section.Misc.VirtualSize() } as usize
71+
unsafe { self.section.Misc.VirtualSize as usize }
6972
}
7073
}
7174

@@ -140,9 +143,9 @@ impl<'a> SharedLibrary<'a> {
140143
}
141144
}
142145

143-
fn nt_headers(&self) -> Option<&IMAGE_NT_HEADERS> {
146+
fn nt_headers(&self) -> Option<&IMAGE_NT_HEADERS64> {
144147
self.dos_header().and_then(|dos_header| {
145-
let nt_headers: &IMAGE_NT_HEADERS =
148+
let nt_headers: &IMAGE_NT_HEADERS64 =
146149
unsafe { &*(self.module_base().offset(dos_header.e_lfanew as isize) as *const _) };
147150
if nt_headers.Signature == IMAGE_NT_SIGNATURE {
148151
Some(nt_headers)
@@ -154,7 +157,7 @@ impl<'a> SharedLibrary<'a> {
154157

155158
fn debug_directories(&self) -> &[IMAGE_DEBUG_DIRECTORY] {
156159
self.nt_headers().map_or(&[], |nt_headers| {
157-
if nt_headers.OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_DEBUG as u32 {
160+
if nt_headers.OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_DEBUG {
158161
return &[];
159162
}
160163
let data_dir =
@@ -236,7 +239,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
236239
fn segments(&self) -> Self::SegmentIter {
237240
let sections = self.nt_headers().map(|nt_headers| unsafe {
238241
let base =
239-
(nt_headers as *const _ as *const u8).add(mem::size_of::<IMAGE_NT_HEADERS>());
242+
(nt_headers as *const _ as *const u8).add(mem::size_of::<IMAGE_NT_HEADERS64>());
240243
slice::from_raw_parts(
241244
base as *const IMAGE_SECTION_HEADER,
242245
nt_headers.FileHeader.NumberOfSections as usize,
@@ -260,36 +263,35 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
260263
let proc = unsafe { GetCurrentProcess() };
261264
let mut modules_size = 0;
262265
unsafe {
263-
if EnumProcessModules(proc, ptr::null_mut(), 0, &mut modules_size) == 0 {
266+
if K32EnumProcessModules(proc, ptr::null_mut(), 0, &mut modules_size) == 0 {
264267
return;
265268
}
266269
}
267-
let module_count = modules_size / mem::size_of::<HMODULE>() as u32;
270+
let module_count = modules_size / mem::size_of::<HINSTANCE>() as u32;
268271
let mut modules = vec![unsafe { mem::zeroed() }; module_count as usize];
269272
unsafe {
270-
if EnumProcessModules(proc, modules.as_mut_ptr(), modules_size, &mut modules_size) == 0
273+
if K32EnumProcessModules(proc, modules.as_mut_ptr(), modules_size, &mut modules_size)
274+
== 0
271275
{
272276
return;
273277
}
274278
}
275279

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

278282
for module in modules {
279283
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;
284+
// Cast: `MAX_PATH` fits in a u16, on Windows it'll always fit in a usize
285+
let mut module_path = vec![0u16; MAX_PATH as usize + 1];
286+
let module_path_len =
287+
K32GetModuleFileNameExW(proc, module, module_path.as_mut_ptr(), MAX_PATH + 1)
288+
as usize;
287289
if module_path_len == 0 {
288290
continue;
289291
}
290292

291293
let mut module_info = mem::zeroed();
292-
if GetModuleInformation(
294+
if K32GetModuleInformation(
293295
proc,
294296
module,
295297
&mut module_info,
@@ -305,7 +307,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
305307
// loaded before.
306308
let handle_lock = LoadLibraryExW(
307309
module_path.as_ptr(),
308-
ptr::null_mut(),
310+
Default::default(),
309311
LOAD_LIBRARY_AS_DATAFILE,
310312
);
311313

0 commit comments

Comments
 (0)