winapi_ui_automation/um/
psapi.rs

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.
7use shared::basetsd::{SIZE_T, ULONG_PTR};
8use shared::minwindef::{BOOL, DWORD, HMODULE, LPDWORD, LPVOID, PDWORD};
9use um::winnt::{HANDLE, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PVOID};
10pub const LIST_MODULES_DEFAULT: DWORD = 0x0;
11pub const LIST_MODULES_32BIT: DWORD = 0x01;
12pub const LIST_MODULES_64BIT: DWORD = 0x02;
13pub const LIST_MODULES_ALL: DWORD = LIST_MODULES_32BIT | LIST_MODULES_64BIT;
14extern "system" {
15    pub fn K32EnumProcesses(
16        lpidProcess: *mut DWORD,
17        cb: DWORD,
18        lpcbNeeded: LPDWORD,
19    ) -> BOOL;
20    pub fn K32EnumProcessModules(
21        hProcess: HANDLE,
22        lphModule: *mut HMODULE,
23        cb: DWORD,
24        lpcbNeeded: LPDWORD,
25    ) -> BOOL;
26    pub fn K32EnumProcessModulesEx(
27        hProcess: HANDLE,
28        lphModule: *mut HMODULE,
29        cb: DWORD,
30        lpcbNeeded: LPDWORD,
31        dwFilterFlag: DWORD,
32    ) -> BOOL;
33    pub fn K32GetModuleBaseNameA(
34        hProcess: HANDLE,
35        hModule: HMODULE,
36        lpBaseName: LPSTR,
37        nSize: DWORD,
38    ) -> DWORD;
39    pub fn K32GetModuleBaseNameW(
40        hProcess: HANDLE,
41        hModule: HMODULE,
42        lpBaseName: LPWSTR,
43        nSize: DWORD,
44    ) -> DWORD;
45    pub fn K32GetModuleFileNameExA(
46        hProcess: HANDLE,
47        hModule: HMODULE,
48        lpFilename: LPSTR,
49        nSize: DWORD,
50    ) -> DWORD;
51    pub fn K32GetModuleFileNameExW(
52        hProcess: HANDLE,
53        hModule: HMODULE,
54        lpFilename: LPWSTR,
55        nSize: DWORD,
56    ) -> DWORD;
57    pub fn K32EmptyWorkingSet(
58        hProcess: HANDLE,
59    ) -> BOOL;
60    pub fn K32QueryWorkingSet(
61        hProcess: HANDLE,
62        pv: PVOID,
63        cb: DWORD,
64    ) -> BOOL;
65    pub fn K32QueryWorkingSetEx(
66        hProcess: HANDLE,
67        pv: PVOID,
68        cb: DWORD,
69    ) -> BOOL;
70    pub fn K32InitializeProcessForWsWatch(
71        hProcess: HANDLE,
72    ) -> BOOL;
73    pub fn K32GetWsChanges(
74        hProcess: HANDLE,
75        lpWatchInfo: PPSAPI_WS_WATCH_INFORMATION,
76        cb: DWORD,
77    ) -> BOOL;
78    pub fn K32GetWsChangesEx(
79        hProcess: HANDLE,
80        lpWatchInfoEx: PPSAPI_WS_WATCH_INFORMATION_EX,
81        cb: PDWORD,
82    ) -> BOOL;
83    pub fn K32GetMappedFileNameW(
84        hProcess: HANDLE,
85        lpv: LPVOID,
86        lpFilename: LPWSTR,
87        nSize: DWORD,
88    ) -> DWORD;
89    pub fn K32GetMappedFileNameA(
90        hProcess: HANDLE,
91        lpv: LPVOID,
92        lpFilename: LPSTR,
93        nSize: DWORD,
94    ) -> DWORD;
95    pub fn K32EnumDeviceDrivers(
96        lpImageBase: *mut LPVOID,
97        cb: DWORD,
98        lpcbNeeded: LPDWORD,
99    ) -> BOOL;
100    pub fn K32GetDeviceDriverBaseNameA(
101        ImageBase: LPVOID,
102        lpFilename: LPSTR,
103        nSize: DWORD,
104    ) -> DWORD;
105    pub fn K32GetDeviceDriverBaseNameW(
106        ImageBase: LPVOID,
107        lpFilename: LPWSTR,
108        nSize: DWORD,
109    ) -> DWORD;
110    pub fn K32GetDeviceDriverFileNameA(
111        ImageBase: LPVOID,
112        lpFilename: LPSTR,
113        nSize: DWORD,
114    ) -> DWORD;
115    pub fn K32GetDeviceDriverFileNameW(
116        ImageBase: LPVOID,
117        lpFilename: LPWSTR,
118        nSize: DWORD,
119    ) -> DWORD;
120    pub fn K32GetPerformanceInfo(
121        pPerformanceInformation: PPERFORMANCE_INFORMATION,
122        cb: DWORD,
123    ) -> BOOL;
124    pub fn K32EnumPageFilesW(
125        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKW,
126        pContext: LPVOID,
127    ) -> BOOL;
128    pub fn K32EnumPageFilesA(
129        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKA,
130        pContext: LPVOID,
131    ) -> BOOL;
132    pub fn K32GetProcessImageFileNameA(
133        hProcess: HANDLE,
134        lpImageFileName: LPSTR,
135        nSize: DWORD,
136    ) -> DWORD;
137    pub fn K32GetProcessImageFileNameW(
138        hProcess: HANDLE,
139        lpImageFileName: LPWSTR,
140        nSize: DWORD,
141    ) -> DWORD;
142    pub fn EnumProcesses(
143        lpidProcess: *mut DWORD,
144        cb: DWORD,
145        lpcbNeeded: LPDWORD,
146    ) -> BOOL;
147    pub fn K32GetProcessMemoryInfo(
148        Process: HANDLE,
149        ppsmemCounters: PPROCESS_MEMORY_COUNTERS,
150        cb: DWORD,
151    ) -> BOOL;
152    pub fn K32GetModuleInformation(
153        hProcess: HANDLE,
154        hModule: HMODULE,
155        lpmodinfo: LPMODULEINFO,
156        cb: DWORD,
157    ) -> BOOL;
158}
159pub type LPMODULEINFO = *mut MODULEINFO;
160pub type PPSAPI_WORKING_SET_INFORMATION = *mut PSAPI_WORKING_SET_INFORMATION;
161pub type PPSAPI_WORKING_SET_EX_INFORMATION = *mut PSAPI_WORKING_SET_EX_INFORMATION;
162pub type PPSAPI_WS_WATCH_INFORMATION = *mut PSAPI_WS_WATCH_INFORMATION;
163pub type PPSAPI_WS_WATCH_INFORMATION_EX = *mut PSAPI_WS_WATCH_INFORMATION_EX;
164pub type PENUM_PAGE_FILE_INFORMATION = *mut ENUM_PAGE_FILE_INFORMATION;
165pub type PPERFORMANCE_INFORMATION = *mut PERFORMANCE_INFORMATION;
166pub type PPROCESS_MEMORY_COUNTERS = *mut PROCESS_MEMORY_COUNTERS;
167pub type PPROCESS_MEMORY_COUNTERS_EX = *mut PROCESS_MEMORY_COUNTERS_EX;
168FN!{stdcall PENUM_PAGE_FILE_CALLBACKA(
169    pContext: LPVOID,
170    pPageFileInfo: PENUM_PAGE_FILE_INFORMATION,
171    lpFilename: LPCSTR,
172) -> BOOL}
173FN!{stdcall PENUM_PAGE_FILE_CALLBACKW(
174    pContext: LPVOID,
175    pPageFileInfo: PENUM_PAGE_FILE_INFORMATION,
176    lpFilename: LPCWSTR,
177) -> BOOL}
178STRUCT!{struct MODULEINFO {
179    lpBaseOfDll: LPVOID,
180    SizeOfImage: DWORD,
181    EntryPoint: LPVOID,
182}}
183STRUCT!{struct ENUM_PAGE_FILE_INFORMATION {
184    cb: DWORD,
185    Reserved: DWORD,
186    TotalSize: SIZE_T,
187    TotalInUse: SIZE_T,
188    PeakUsage: SIZE_T,
189}}
190STRUCT!{struct PERFORMANCE_INFORMATION {
191    cb: DWORD,
192    CommitTotal: SIZE_T,
193    CommitLimit: SIZE_T,
194    CommitPeak: SIZE_T,
195    PhysicalTotal: SIZE_T,
196    PhysicalAvailable: SIZE_T,
197    SystemCache: SIZE_T,
198    KernelTotal: SIZE_T,
199    KernelPaged: SIZE_T,
200    KernelNonpaged: SIZE_T,
201    PageSize: SIZE_T,
202    HandleCount: DWORD,
203    ProcessCount: DWORD,
204    ThreadCount: DWORD,
205}}
206STRUCT!{struct PROCESS_MEMORY_COUNTERS {
207    cb: DWORD,
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,
217}}
218STRUCT!{struct PROCESS_MEMORY_COUNTERS_EX {
219    cb: DWORD,
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,
230}}
231STRUCT!{struct PSAPI_WORKING_SET_BLOCK {
232    Flags: ULONG_PTR,
233}}
234BITFIELD!{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],
240]}
241pub type PPSAPI_WORKING_SET_BLOCK = *mut PSAPI_WORKING_SET_BLOCK;
242STRUCT!{struct PSAPI_WORKING_SET_EX_BLOCK {
243    Flags: ULONG_PTR,
244}}
245#[cfg(not(target_arch="x86_64"))]
246BITFIELD!{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],
255    Bad set_Bad[31..32],
256]}
257#[cfg(target_arch="x86_64")]
258BITFIELD!{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],
267    Bad set_Bad[31..32],
268    ReservedUlong set_ReservedULong[32..64],
269]}
270pub type PPSAPI_WORKING_SET_EX_BLOCK = *mut PSAPI_WORKING_SET_EX_BLOCK;
271STRUCT!{struct PSAPI_WORKING_SET_INFORMATION {
272    NumberOfEntries: ULONG_PTR,
273    WorkingSetInfo: [PSAPI_WORKING_SET_BLOCK; 1],
274}}
275STRUCT!{struct PSAPI_WORKING_SET_EX_INFORMATION {
276    VirtualAddress: PVOID,
277    VirtualAttributes: PSAPI_WORKING_SET_EX_BLOCK,
278}}
279STRUCT!{struct PSAPI_WS_WATCH_INFORMATION {
280    FaultingPc: LPVOID,
281    FaultingVa: LPVOID,
282}}
283STRUCT!{struct PSAPI_WS_WATCH_INFORMATION_EX {
284    BasicInfo: PSAPI_WS_WATCH_INFORMATION,
285    FaultingThreadId: ULONG_PTR,
286    Flags: ULONG_PTR,
287}}
288extern "system" {
289    pub fn EmptyWorkingSet(
290        hProcess: HANDLE,
291    ) -> BOOL;
292    pub fn EnumDeviceDrivers(
293        lpImageBase: *mut LPVOID,
294        cb: DWORD,
295        lpcbNeeded: LPDWORD,
296    ) -> BOOL;
297    pub fn EnumPageFilesA(
298        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKA,
299        pContext: LPVOID,
300    ) -> BOOL;
301    pub fn EnumPageFilesW(
302        pCallBackRoutine: PENUM_PAGE_FILE_CALLBACKW,
303        pContext: LPVOID,
304    ) -> BOOL;
305    pub fn EnumProcessModules(
306        hProcess: HANDLE,
307        lphModule: *mut HMODULE,
308        cb: DWORD,
309        lpcbNeeded: LPDWORD,
310    ) -> BOOL;
311    pub fn EnumProcessModulesEx(
312        hProcess: HANDLE,
313        lphModule: *mut HMODULE,
314        cb: DWORD,
315        lpcbNeeded: LPDWORD,
316        dwFilterFlag: DWORD,
317    ) -> BOOL;
318    pub fn GetDeviceDriverBaseNameA(
319        ImageBase: LPVOID,
320        lpFilename: LPSTR,
321        nSize: DWORD,
322    ) -> DWORD;
323    pub fn GetDeviceDriverBaseNameW(
324        ImageBase: LPVOID,
325        lpFilename: LPWSTR,
326        nSize: DWORD,
327    ) -> DWORD;
328    pub fn GetDeviceDriverFileNameA(
329        ImageBase: LPVOID,
330        lpFilename: LPSTR,
331        nSize: DWORD,
332    ) -> DWORD;
333    pub fn GetDeviceDriverFileNameW(
334        ImageBase: LPVOID,
335        lpFilename: LPWSTR,
336        nSize: DWORD,
337    ) -> DWORD;
338    pub fn GetMappedFileNameA(
339        hProcess: HANDLE,
340        lpv: LPVOID,
341        lpFilename: LPSTR,
342        nSize: DWORD,
343    ) -> DWORD;
344    pub fn GetMappedFileNameW(
345        hProcess: HANDLE,
346        lpv: LPVOID,
347        lpFilename: LPWSTR,
348        nSize: DWORD,
349    ) -> DWORD;
350    pub fn GetModuleBaseNameA(
351        hProcess: HANDLE,
352        hModule: HMODULE,
353        lpBaseName: LPSTR,
354        nSize: DWORD,
355    ) -> DWORD;
356    pub fn GetModuleBaseNameW(
357        hProcess: HANDLE,
358        hModule: HMODULE,
359        lpBaseName: LPWSTR,
360        nSize: DWORD,
361    ) -> DWORD;
362    pub fn GetModuleFileNameExA(
363        hProcess: HANDLE,
364        hModule: HMODULE,
365        lpFilename: LPSTR,
366        nSize: DWORD,
367    ) -> DWORD;
368    pub fn GetModuleFileNameExW(
369        hProcess: HANDLE,
370        hModule: HMODULE,
371        lpFilename: LPWSTR,
372        nSize: DWORD,
373    ) -> DWORD;
374    pub fn GetModuleInformation(
375        hProcess: HANDLE,
376        hModule: HMODULE,
377        lpmodinfo: LPMODULEINFO,
378        cb: DWORD,
379    ) -> BOOL;
380    pub fn GetPerformanceInfo(
381        pPerformanceInformation: PPERFORMANCE_INFORMATION,
382        cb: DWORD,
383    ) -> BOOL;
384    pub fn GetProcessImageFileNameA(
385        hProcess: HANDLE,
386        lpImageFileName: LPSTR,
387        nSize: DWORD,
388    ) -> DWORD;
389    pub fn GetProcessImageFileNameW(
390        hProcess: HANDLE,
391        lpImageFileName: LPWSTR,
392        nSize: DWORD,
393    ) -> DWORD;
394    pub fn GetProcessMemoryInfo(
395        hProcess: HANDLE,
396        ppsmemCounters: PPROCESS_MEMORY_COUNTERS,
397        cb: DWORD,
398    ) -> BOOL;
399    pub fn GetWsChanges(
400        hProcess: HANDLE,
401        lpWatchInfo: PPSAPI_WS_WATCH_INFORMATION,
402        cb: DWORD,
403    ) -> BOOL;
404    pub fn GetWsChangesEx(
405        hProcess: HANDLE,
406        lpWatchInfoEx: PPSAPI_WS_WATCH_INFORMATION_EX,
407        cb: PDWORD,
408    ) -> BOOL;
409    pub fn InitializeProcessForWsWatch(
410        hProcess: HANDLE,
411    ) -> BOOL;
412    pub fn QueryWorkingSet(
413        hProcess: HANDLE,
414        pv: PVOID,
415        cb: DWORD,
416    ) -> BOOL;
417    pub fn QueryWorkingSetEx(
418        hProcess: HANDLE,
419        pv: PVOID,
420        cb: DWORD,
421    ) -> BOOL;
422}