@@ -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,22 @@ 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_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 ,
28
27
} ;
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 ;
29
32
30
33
// This is 'RSDS'.
31
34
const CV_SIGNATURE : u32 = 0x5344_5352 ;
@@ -65,7 +68,7 @@ impl<'a> SegmentTrait for Segment<'a> {
65
68
66
69
#[ inline]
67
70
fn len ( & self ) -> usize {
68
- * unsafe { self . section . Misc . VirtualSize ( ) } as usize
71
+ unsafe { self . section . Misc . VirtualSize as usize }
69
72
}
70
73
}
71
74
@@ -140,9 +143,9 @@ impl<'a> SharedLibrary<'a> {
140
143
}
141
144
}
142
145
143
- fn nt_headers ( & self ) -> Option < & IMAGE_NT_HEADERS > {
146
+ fn nt_headers ( & self ) -> Option < & IMAGE_NT_HEADERS64 > {
144
147
self . dos_header ( ) . and_then ( |dos_header| {
145
- let nt_headers: & IMAGE_NT_HEADERS =
148
+ let nt_headers: & IMAGE_NT_HEADERS64 =
146
149
unsafe { & * ( self . module_base ( ) . offset ( dos_header. e_lfanew as isize ) as * const _ ) } ;
147
150
if nt_headers. Signature == IMAGE_NT_SIGNATURE {
148
151
Some ( nt_headers)
@@ -154,7 +157,7 @@ impl<'a> SharedLibrary<'a> {
154
157
155
158
fn debug_directories ( & self ) -> & [ IMAGE_DEBUG_DIRECTORY ] {
156
159
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 {
158
161
return & [ ] ;
159
162
}
160
163
let data_dir =
@@ -236,7 +239,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
236
239
fn segments ( & self ) -> Self :: SegmentIter {
237
240
let sections = self . nt_headers ( ) . map ( |nt_headers| unsafe {
238
241
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 > ( ) ) ;
240
243
slice:: from_raw_parts (
241
244
base as * const IMAGE_SECTION_HEADER ,
242
245
nt_headers. FileHeader . NumberOfSections as usize ,
@@ -260,36 +263,35 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
260
263
let proc = unsafe { GetCurrentProcess ( ) } ;
261
264
let mut modules_size = 0 ;
262
265
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 {
264
267
return ;
265
268
}
266
269
}
267
- let module_count = modules_size / mem:: size_of :: < HMODULE > ( ) as u32 ;
270
+ let module_count = modules_size / mem:: size_of :: < HINSTANCE > ( ) as u32 ;
268
271
let mut modules = vec ! [ unsafe { mem:: zeroed( ) } ; module_count as usize ] ;
269
272
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
271
275
{
272
276
return ;
273
277
}
274
278
}
275
279
276
- modules. truncate ( modules_size as usize / mem:: size_of :: < HMODULE > ( ) ) ;
280
+ modules. truncate ( modules_size as usize / mem:: size_of :: < HINSTANCE > ( ) ) ;
277
281
278
282
for module in modules {
279
283
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 ;
287
289
if module_path_len == 0 {
288
290
continue ;
289
291
}
290
292
291
293
let mut module_info = mem:: zeroed ( ) ;
292
- if GetModuleInformation (
294
+ if K32GetModuleInformation (
293
295
proc,
294
296
module,
295
297
& mut module_info,
@@ -305,7 +307,7 @@ impl<'a> SharedLibraryTrait for SharedLibrary<'a> {
305
307
// loaded before.
306
308
let handle_lock = LoadLibraryExW (
307
309
module_path. as_ptr ( ) ,
308
- ptr :: null_mut ( ) ,
310
+ Default :: default ( ) ,
309
311
LOAD_LIBRARY_AS_DATAFILE ,
310
312
) ;
311
313
0 commit comments