@@ -4,7 +4,7 @@ use crate::Segment as SegmentTrait;
4
4
use crate :: SharedLibrary as SharedLibraryTrait ;
5
5
use crate :: { Bias , IterationControl , SharedLibraryId , Svma } ;
6
6
7
- use std:: ffi:: { CStr , OsStr , OsString } ;
7
+ use std:: ffi:: { c_char , CStr , OsStr , OsString } ;
8
8
use std:: fmt;
9
9
use std:: marker:: PhantomData ;
10
10
use std:: mem;
@@ -13,19 +13,29 @@ use std::ptr;
13
13
use std:: slice;
14
14
use std:: usize;
15
15
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 :: {
25
18
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 ,
28
30
} ;
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 ;
29
39
30
40
// This is 'RSDS'.
31
41
const CV_SIGNATURE : u32 = 0x5344_5352 ;
@@ -65,7 +75,7 @@ impl<'a> SegmentTrait for Segment<'a> {
65
75
66
76
#[ inline]
67
77
fn len ( & self ) -> usize {
68
- * unsafe { self . section . Misc . VirtualSize ( ) } as usize
78
+ unsafe { self . section . Misc . VirtualSize as usize }
69
79
}
70
80
}
71
81
@@ -154,7 +164,7 @@ impl<'a> SharedLibrary<'a> {
154
164
155
165
fn debug_directories ( & self ) -> & [ IMAGE_DEBUG_DIRECTORY ] {
156
166
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 {
158
168
return & [ ] ;
159
169
}
160
170
let data_dir =
@@ -260,36 +270,35 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
260
270
let proc = unsafe { GetCurrentProcess ( ) } ;
261
271
let mut modules_size = 0 ;
262
272
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 {
264
274
return ;
265
275
}
266
276
}
267
- let module_count = modules_size / mem:: size_of :: < HMODULE > ( ) as u32 ;
277
+ let module_count = modules_size / mem:: size_of :: < HINSTANCE > ( ) as u32 ;
268
278
let mut modules = vec ! [ unsafe { mem:: zeroed( ) } ; module_count as usize ] ;
269
279
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
271
282
{
272
283
return ;
273
284
}
274
285
}
275
286
276
- modules. truncate ( modules_size as usize / mem:: size_of :: < HMODULE > ( ) ) ;
287
+ modules. truncate ( modules_size as usize / mem:: size_of :: < HINSTANCE > ( ) ) ;
277
288
278
289
for module in modules {
279
290
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 ;
287
296
if module_path_len == 0 {
288
297
continue ;
289
298
}
290
299
291
300
let mut module_info = mem:: zeroed ( ) ;
292
- if GetModuleInformation (
301
+ if K32GetModuleInformation (
293
302
proc,
294
303
module,
295
304
& mut module_info,
@@ -305,7 +314,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
305
314
// loaded before.
306
315
let handle_lock = LoadLibraryExW (
307
316
module_path. as_ptr ( ) ,
308
- ptr :: null_mut ( ) ,
317
+ Default :: default ( ) ,
309
318
LOAD_LIBRARY_AS_DATAFILE ,
310
319
) ;
311
320
0 commit comments