1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 //! FFI bindings to psapi.
7 use shared
::basetsd
::{SIZE_T, ULONG_PTR}
;
8 use shared
::minwindef
::{BOOL, DWORD, HMODULE, LPDWORD, LPVOID, PDWORD}
;
9 use um
::winnt
::{HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PVOID}
;
10 pub const LIST_MODULES_DEFAULT
: DWORD
= 0x0;
11 pub const LIST_MODULES_32BIT
: DWORD
= 0x01;
12 pub const LIST_MODULES_64BIT
: DWORD
= 0x02;
13 pub const LIST_MODULES_ALL
: DWORD
= LIST_MODULES_32BIT
| LIST_MODULES_64BIT
;
15 pub fn K32EnumProcesses(
16 lpidProcess
: *mut DWORD
,
20 pub fn K32EnumProcessModules(
22 lphModule
: *mut HMODULE
,
26 pub fn K32EnumProcessModulesEx(
28 lphModule
: *mut HMODULE
,
33 pub fn K32GetModuleBaseNameA(
39 pub fn K32GetModuleBaseNameW(
45 pub fn K32GetModuleFileNameExA(
51 pub fn K32GetModuleFileNameExW(
57 pub fn K32EmptyWorkingSet(
60 pub fn K32QueryWorkingSet(
65 pub fn K32QueryWorkingSetEx(
70 pub fn K32InitializeProcessForWsWatch(
73 pub fn K32GetWsChanges(
75 lpWatchInfo
: PPSAPI_WS_WATCH_INFORMATION
,
78 pub fn K32GetWsChangesEx(
80 lpWatchInfoEx
: PPSAPI_WS_WATCH_INFORMATION_EX
,
83 pub fn K32GetMappedFileNameW(
89 pub fn K32GetMappedFileNameA(
95 pub fn K32EnumDeviceDrivers(
96 lpImageBase
: *mut LPVOID
,
100 pub fn K32GetDeviceDriverBaseNameA(
105 pub fn K32GetDeviceDriverBaseNameW(
110 pub fn K32GetDeviceDriverFileNameA(
115 pub fn K32GetDeviceDriverFileNameW(
120 pub fn K32GetPerformanceInfo(
121 pPerformanceInformation
: PPERFORMANCE_INFORMATION
,
124 pub fn K32EnumPageFilesW(
125 pCallBackRoutine
: PENUM_PAGE_FILE_CALLBACKW
,
128 pub fn K32EnumPageFilesA(
129 pCallBackRoutine
: PENUM_PAGE_FILE_CALLBACKA
,
132 pub fn K32GetProcessImageFileNameA(
134 lpImageFileName
: LPSTR
,
137 pub fn K32GetProcessImageFileNameW(
139 lpImageFileName
: LPWSTR
,
142 pub fn EnumProcesses(
143 lpidProcess
: *mut DWORD
,
147 pub fn K32GetProcessMemoryInfo(
149 ppsmemCounters
: PPROCESS_MEMORY_COUNTERS
,
152 pub fn K32GetModuleInformation(
155 lpmodinfo
: LPMODULEINFO
,
159 pub type LPMODULEINFO
= *mut MODULEINFO
;
160 pub type PPSAPI_WORKING_SET_INFORMATION
= *mut PSAPI_WORKING_SET_INFORMATION
;
161 pub type PPSAPI_WORKING_SET_EX_INFORMATION
= *mut PSAPI_WORKING_SET_EX_INFORMATION
;
162 pub type PPSAPI_WS_WATCH_INFORMATION
= *mut PSAPI_WS_WATCH_INFORMATION
;
163 pub type PPSAPI_WS_WATCH_INFORMATION_EX
= *mut PSAPI_WS_WATCH_INFORMATION_EX
;
164 pub type PENUM_PAGE_FILE_INFORMATION
= *mut ENUM_PAGE_FILE_INFORMATION
;
165 pub type PPERFORMANCE_INFORMATION
= *mut PERFORMANCE_INFORMATION
;
166 pub type PPROCESS_MEMORY_COUNTERS
= *mut PROCESS_MEMORY_COUNTERS
;
167 pub type PPROCESS_MEMORY_COUNTERS_EX
= *mut PROCESS_MEMORY_COUNTERS_EX
;
168 FN
!{stdcall
PENUM_PAGE_FILE_CALLBACKA(
170 pPageFileInfo
: PENUM_PAGE_FILE_INFORMATION
,
173 FN
!{stdcall
PENUM_PAGE_FILE_CALLBACKW(
175 pPageFileInfo
: PENUM_PAGE_FILE_INFORMATION
,
178 STRUCT
!{struct MODULEINFO
{
183 STRUCT
!{struct ENUM_PAGE_FILE_INFORMATION
{
190 STRUCT
!{struct PERFORMANCE_INFORMATION
{
195 PhysicalTotal
: SIZE_T
,
196 PhysicalAvailable
: SIZE_T
,
200 KernelNonpaged
: SIZE_T
,
206 STRUCT
!{struct PROCESS_MEMORY_COUNTERS
{
208 PageFaultCount
: DWORD
,
209 PeakWorkingSetSize
: SIZE_T
,
210 WorkingSetSize
: SIZE_T
,
211 QuotaPeakPagedPoolUsage
: SIZE_T
,
212 QuotaPagedPoolUsage
: SIZE_T
,
213 QuotaPeakNonPagedPoolUsage
: SIZE_T
,
214 QuotaNonPagedPoolUsage
: SIZE_T
,
215 PagefileUsage
: SIZE_T
,
216 PeakPagefileUsage
: SIZE_T
,
218 STRUCT
!{struct PROCESS_MEMORY_COUNTERS_EX
{
220 PageFaultCount
: DWORD
,
221 PeakWorkingSetSize
: SIZE_T
,
222 WorkingSetSize
: SIZE_T
,
223 QuotaPeakPagedPoolUsage
: SIZE_T
,
224 QuotaPagedPoolUsage
: SIZE_T
,
225 QuotaPeakNonPagedPoolUsage
: SIZE_T
,
226 QuotaNonPagedPoolUsage
: SIZE_T
,
227 PagefileUsage
: SIZE_T
,
228 PeakPagefileUsage
: SIZE_T
,
229 PrivateUsage
: SIZE_T
,
231 STRUCT
!{struct PSAPI_WORKING_SET_BLOCK
{
234 BITFIELD
!{PSAPI_WORKING_SET_BLOCK Flags
: ULONG_PTR
[
235 Protection set_Protection
[0..5],
236 ShareCount set_ShareCount
[5..8],
237 Shared set_Shared
[8..9],
238 Reserved set_Reserved
[9..12],
239 VirtualPage set_VirtualPage
[12..32],
241 pub type PPSAPI_WORKING_SET_BLOCK
= *mut PSAPI_WORKING_SET_BLOCK
;
242 STRUCT
!{struct PSAPI_WORKING_SET_EX_BLOCK
{
245 #[cfg(not(target_arch="x86_64"))]
246 BITFIELD
!{PSAPI_WORKING_SET_EX_BLOCK Flags
: ULONG_PTR
[
247 Valid set_Valid
[0..1],
248 ShareCount set_ShareCount
[1..4],
249 Win32Protection set_Win32Protection
[4..15],
250 Shared set_Shared
[15..16],
251 Node set_Node
[16..22],
252 Locked set_Locked
[22..23],
253 LargePage set_LargePage
[23..24],
254 Reserved set_Reserved
[24..31],
257 #[cfg(target_arch="x86_64")]
258 BITFIELD
!{PSAPI_WORKING_SET_EX_BLOCK Flags
: ULONG_PTR
[
259 Valid set_Valid
[0..1],
260 ShareCount set_ShareCount
[1..4],
261 Win32Protection set_Win32Protection
[4..15],
262 Shared set_Shared
[15..16],
263 Node set_Node
[16..22],
264 Locked set_Locked
[22..23],
265 LargePage set_LargePage
[23..24],
266 Reserved set_Reserved
[24..31],
268 ReservedUlong set_ReservedULong
[32..64],
270 pub type PPSAPI_WORKING_SET_EX_BLOCK
= *mut PSAPI_WORKING_SET_EX_BLOCK
;
271 STRUCT
!{struct PSAPI_WORKING_SET_INFORMATION
{
272 NumberOfEntries
: ULONG_PTR
,
273 WorkingSetInfo
: [PSAPI_WORKING_SET_BLOCK
; 1],
275 STRUCT
!{struct PSAPI_WORKING_SET_EX_INFORMATION
{
276 VirtualAddress
: PVOID
,
277 VirtualAttributes
: PSAPI_WORKING_SET_EX_BLOCK
,
279 STRUCT
!{struct PSAPI_WS_WATCH_INFORMATION
{
283 STRUCT
!{struct PSAPI_WS_WATCH_INFORMATION_EX
{
284 BasicInfo
: PSAPI_WS_WATCH_INFORMATION
,
285 FaultingThreadId
: ULONG_PTR
,
289 pub fn EmptyWorkingSet(
292 pub fn EnumDeviceDrivers(
293 lpImageBase
: *mut LPVOID
,
297 pub fn EnumPageFilesA(
298 pCallBackRoutine
: PENUM_PAGE_FILE_CALLBACKA
,
301 pub fn EnumPageFilesW(
302 pCallBackRoutine
: PENUM_PAGE_FILE_CALLBACKW
,
305 pub fn EnumProcessModules(
307 lphModule
: *mut HMODULE
,
311 pub fn EnumProcessModulesEx(
313 lphModule
: *mut HMODULE
,
318 pub fn GetDeviceDriverBaseNameA(
323 pub fn GetDeviceDriverBaseNameW(
328 pub fn GetDeviceDriverFileNameA(
333 pub fn GetDeviceDriverFileNameW(
338 pub fn GetMappedFileNameA(
344 pub fn GetMappedFileNameW(
350 pub fn GetModuleBaseNameA(
356 pub fn GetModuleBaseNameW(
362 pub fn GetModuleFileNameExA(
368 pub fn GetModuleFileNameExW(
374 pub fn GetModuleInformation(
377 lpmodinfo
: LPMODULEINFO
,
380 pub fn GetPerformanceInfo(
381 pPerformanceInformation
: PPERFORMANCE_INFORMATION
,
384 pub fn GetProcessImageFileNameA(
386 lpImageFileName
: LPSTR
,
389 pub fn GetProcessImageFileNameW(
391 lpImageFileName
: LPWSTR
,
394 pub fn GetProcessMemoryInfo(
396 ppsmemCounters
: PPROCESS_MEMORY_COUNTERS
,
401 lpWatchInfo
: PPSAPI_WS_WATCH_INFORMATION
,
404 pub fn GetWsChangesEx(
406 lpWatchInfoEx
: PPSAPI_WS_WATCH_INFORMATION_EX
,
409 pub fn InitializeProcessForWsWatch(
412 pub fn QueryWorkingSet(
417 pub fn QueryWorkingSetEx(