1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef _PSAPI_H_
7 #define _PSAPI_H_
8 
9 #include <_mingw_unicode.h>
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #ifndef PSAPI_VERSION
16 #if NTDDI_VERSION >= NTDDI_WIN7
17 #define PSAPI_VERSION 2
18 #else
19 #define PSAPI_VERSION 1
20 #endif
21 #endif
22 
23 #if PSAPI_VERSION > 1
24 #define EnumProcesses               K32EnumProcesses
25 #define EnumProcessModules          K32EnumProcessModules
26 #define EnumProcessModulesEx        K32EnumProcessModulesEx
27 #define GetModuleBaseNameA          K32GetModuleBaseNameA
28 #define GetModuleBaseNameW          K32GetModuleBaseNameW
29 #define GetModuleFileNameExA        K32GetModuleFileNameExA
30 #define GetModuleFileNameExW        K32GetModuleFileNameExW
31 #define GetModuleInformation        K32GetModuleInformation
32 #define EmptyWorkingSet             K32EmptyWorkingSet
33 #define QueryWorkingSet             K32QueryWorkingSet
34 #define QueryWorkingSetEx           K32QueryWorkingSetEx
35 #define InitializeProcessForWsWatch K32InitializeProcessForWsWatch
36 #define GetWsChanges                K32GetWsChanges
37 #define GetWsChangesEx              K32GetWsChangesEx
38 #define GetMappedFileNameW          K32GetMappedFileNameW
39 #define GetMappedFileNameA          K32GetMappedFileNameA
40 #define EnumDeviceDrivers           K32EnumDeviceDrivers
41 #define GetDeviceDriverBaseNameA    K32GetDeviceDriverBaseNameA
42 #define GetDeviceDriverBaseNameW    K32GetDeviceDriverBaseNameW
43 #define GetDeviceDriverFileNameA    K32GetDeviceDriverFileNameA
44 #define GetDeviceDriverFileNameW    K32GetDeviceDriverFileNameW
45 #define GetProcessMemoryInfo        K32GetProcessMemoryInfo
46 #define GetPerformanceInfo          K32GetPerformanceInfo
47 #define EnumPageFilesW              K32EnumPageFilesW
48 #define EnumPageFilesA              K32EnumPageFilesA
49 #define GetProcessImageFileNameA    K32GetProcessImageFileNameA
50 #define GetProcessImageFileNameW    K32GetProcessImageFileNameW
51 #endif
52 
53 #define GetModuleBaseName __MINGW_NAME_AW(GetModuleBaseName)
54 #define GetModuleFileNameEx __MINGW_NAME_AW(GetModuleFileNameEx)
55 #define GetMappedFileName __MINGW_NAME_AW(GetMappedFileName)
56 #define GetDeviceDriverBaseName __MINGW_NAME_AW(GetDeviceDriverBaseName)
57 #define GetDeviceDriverFileName __MINGW_NAME_AW(GetDeviceDriverFileName)
58 #define PENUM_PAGE_FILE_CALLBACK __MINGW_NAME_AW(PENUM_PAGE_FILE_CALLBACK)
59 #define EnumPageFiles __MINGW_NAME_AW(EnumPageFiles)
60 #define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)
61 
62 #ifndef LIST_MODULES_DEFAULT
63 #define LIST_MODULES_DEFAULT 0x0
64 #endif
65 #ifndef LIST_MODULES_32BIT
66 #define LIST_MODULES_32BIT 0x01
67 #endif
68 #ifndef LIST_MODULES_64BIT
69 #define LIST_MODULES_64BIT 0x02
70 #endif
71 #ifndef LIST_MODULES_ALL
72 #define LIST_MODULES_ALL (LIST_MODULES_32BIT|LIST_MODULES_64BIT)
73 #endif
74 
75   WINBOOL WINAPI EnumProcesses(DWORD *lpidProcess,DWORD cb,DWORD *cbNeeded);
76   WINBOOL WINAPI EnumProcessModules(HANDLE hProcess,HMODULE *lphModule,DWORD cb,LPDWORD lpcbNeeded);
77   DWORD WINAPI GetModuleBaseNameA(HANDLE hProcess,HMODULE hModule,LPSTR lpBaseName,DWORD nSize);
78   DWORD WINAPI GetModuleBaseNameW(HANDLE hProcess,HMODULE hModule,LPWSTR lpBaseName,DWORD nSize);
79   DWORD WINAPI GetModuleFileNameExA(HANDLE hProcess,HMODULE hModule,LPSTR lpFilename,DWORD nSize);
80   DWORD WINAPI GetModuleFileNameExW(HANDLE hProcess,HMODULE hModule,LPWSTR lpFilename,DWORD nSize);
81 
82   typedef struct _MODULEINFO {
83     LPVOID lpBaseOfDll;
84     DWORD SizeOfImage;
85     LPVOID EntryPoint;
86   } MODULEINFO,*LPMODULEINFO;
87 
88   WINBOOL WINAPI GetModuleInformation(HANDLE hProcess,HMODULE hModule,LPMODULEINFO lpmodinfo,DWORD cb);
89   WINBOOL WINAPI EmptyWorkingSet(HANDLE hProcess);
90   WINBOOL WINAPI QueryWorkingSet(HANDLE hProcess,PVOID pv,DWORD cb);
91   WINBOOL WINAPI QueryWorkingSetEx(HANDLE hProcess,PVOID pv,DWORD cb);
92   WINBOOL WINAPI InitializeProcessForWsWatch(HANDLE hProcess);
93 
94   typedef struct _PSAPI_WS_WATCH_INFORMATION {
95     LPVOID FaultingPc;
96     LPVOID FaultingVa;
97   } PSAPI_WS_WATCH_INFORMATION,*PPSAPI_WS_WATCH_INFORMATION;
98 
99   WINBOOL WINAPI GetWsChanges(HANDLE hProcess,PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,DWORD cb);
100   DWORD WINAPI GetMappedFileNameW(HANDLE hProcess,LPVOID lpv,LPWSTR lpFilename,DWORD nSize);
101   DWORD WINAPI GetMappedFileNameA(HANDLE hProcess,LPVOID lpv,LPSTR lpFilename,DWORD nSize);
102   WINBOOL WINAPI EnumDeviceDrivers(LPVOID *lpImageBase,DWORD cb,LPDWORD lpcbNeeded);
103   DWORD WINAPI GetDeviceDriverBaseNameA(LPVOID ImageBase,LPSTR lpBaseName,DWORD nSize);
104   DWORD WINAPI GetDeviceDriverBaseNameW(LPVOID ImageBase,LPWSTR lpBaseName,DWORD nSize);
105   DWORD WINAPI GetDeviceDriverFileNameA(LPVOID ImageBase,LPSTR lpFilename,DWORD nSize);
106   DWORD WINAPI GetDeviceDriverFileNameW(LPVOID ImageBase,LPWSTR lpFilename,DWORD nSize);
107 
108   typedef struct _PROCESS_MEMORY_COUNTERS {
109     DWORD cb;
110     DWORD PageFaultCount;
111     SIZE_T PeakWorkingSetSize;
112     SIZE_T WorkingSetSize;
113     SIZE_T QuotaPeakPagedPoolUsage;
114     SIZE_T QuotaPagedPoolUsage;
115     SIZE_T QuotaPeakNonPagedPoolUsage;
116     SIZE_T QuotaNonPagedPoolUsage;
117     SIZE_T PagefileUsage;
118     SIZE_T PeakPagefileUsage;
119   } PROCESS_MEMORY_COUNTERS;
120   typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
121 
122   typedef struct _PROCESS_MEMORY_COUNTERS_EX {
123     DWORD cb;
124     DWORD PageFaultCount;
125     SIZE_T PeakWorkingSetSize;
126     SIZE_T WorkingSetSize;
127     SIZE_T QuotaPeakPagedPoolUsage;
128     SIZE_T QuotaPagedPoolUsage;
129     SIZE_T QuotaPeakNonPagedPoolUsage;
130     SIZE_T QuotaNonPagedPoolUsage;
131     SIZE_T PagefileUsage;
132     SIZE_T PeakPagefileUsage;
133     SIZE_T PrivateUsage;
134   } PROCESS_MEMORY_COUNTERS_EX;
135   typedef PROCESS_MEMORY_COUNTERS_EX *PPROCESS_MEMORY_COUNTERS_EX;
136 
137   WINBOOL WINAPI GetProcessMemoryInfo(HANDLE Process,PPROCESS_MEMORY_COUNTERS ppsmemCounters,DWORD cb);
138 
139   typedef struct _PERFORMANCE_INFORMATION {
140     DWORD cb;
141     SIZE_T CommitTotal;
142     SIZE_T CommitLimit;
143     SIZE_T CommitPeak;
144     SIZE_T PhysicalTotal;
145     SIZE_T PhysicalAvailable;
146     SIZE_T SystemCache;
147     SIZE_T KernelTotal;
148     SIZE_T KernelPaged;
149     SIZE_T KernelNonpaged;
150     SIZE_T PageSize;
151     DWORD HandleCount;
152     DWORD ProcessCount;
153     DWORD ThreadCount;
154   } PERFORMANCE_INFORMATION,*PPERFORMANCE_INFORMATION,PERFORMACE_INFORMATION,*PPERFORMACE_INFORMATION;
155 
156   WINBOOL WINAPI GetPerformanceInfo (PPERFORMACE_INFORMATION pPerformanceInformation,DWORD cb);
157 
158   typedef struct _ENUM_PAGE_FILE_INFORMATION {
159     DWORD cb;
160     DWORD Reserved;
161     SIZE_T TotalSize;
162     SIZE_T TotalInUse;
163     SIZE_T PeakUsage;
164   } ENUM_PAGE_FILE_INFORMATION,*PENUM_PAGE_FILE_INFORMATION;
165 
166   typedef WINBOOL (*PENUM_PAGE_FILE_CALLBACKW) (LPVOID pContext,PENUM_PAGE_FILE_INFORMATION pPageFileInfo,LPCWSTR lpFilename);
167   typedef WINBOOL (*PENUM_PAGE_FILE_CALLBACKA) (LPVOID pContext,PENUM_PAGE_FILE_INFORMATION pPageFileInfo,LPCSTR lpFilename);
168 
169   WINBOOL WINAPI EnumPageFilesW (PENUM_PAGE_FILE_CALLBACKW pCallBackRoutine,LPVOID pContext);
170   WINBOOL WINAPI EnumPageFilesA (PENUM_PAGE_FILE_CALLBACKA pCallBackRoutine,LPVOID pContext);
171   DWORD WINAPI GetProcessImageFileNameA(HANDLE hProcess,LPSTR lpImageFileName,DWORD nSize);
172   DWORD WINAPI GetProcessImageFileNameW(HANDLE hProcess,LPWSTR lpImageFileName,DWORD nSize);
173 
174 typedef struct _PSAPI_WS_WATCH_INFORMATION_EX {
175   PSAPI_WS_WATCH_INFORMATION BasicInfo;
176   ULONG_PTR                  FaultingThreadId;
177   ULONG_PTR                  Flags;
178 } PSAPI_WS_WATCH_INFORMATION_EX, *PPSAPI_WS_WATCH_INFORMATION_EX;
179 
180 WINBOOL WINAPI GetWsChangesEx(
181   HANDLE hProcess,
182   PPSAPI_WS_WATCH_INFORMATION_EX lpWatchInfoEx,
183   DWORD cb
184 );
185 
186 WINBOOL WINAPI EnumProcessModulesEx(
187   HANDLE hProcess,
188   HMODULE *lphModule,
189   DWORD cb,
190   LPDWORD lpcbNeeded,
191   DWORD dwFilterFlag
192 );
193 
194 typedef union _PSAPI_WORKING_SET_BLOCK {
195   ULONG_PTR Flags;
196   __C89_NAMELESS struct {
197     ULONG_PTR Protection  :5;
198     ULONG_PTR ShareCount  :3;
199     ULONG_PTR Shared  :1;
200     ULONG_PTR Reserved  :3;
201 #ifdef _WIN64
202     ULONG_PTR VirtualPage  :52;
203 #else
204     ULONG_PTR VirtualPage  :20;
205 #endif
206   } ;
207 } PSAPI_WORKING_SET_BLOCK, *PPSAPI_WORKING_SET_BLOCK;
208 
209 typedef struct _PSAPI_WORKING_SET_INFORMATION {
210   ULONG_PTR               NumberOfEntries;
211   PSAPI_WORKING_SET_BLOCK WorkingSetInfo[1];
212 } PSAPI_WORKING_SET_INFORMATION, *PPSAPI_WORKING_SET_INFORMATION;
213 
214 typedef union _PSAPI_WORKING_SET_EX_BLOCK {
215   ULONG_PTR Flags;
216   __C89_NAMELESS struct {
217     ULONG_PTR Valid  :1;
218     ULONG_PTR ShareCount  :3;
219     ULONG_PTR Win32Protection  :11;
220     ULONG_PTR Shared  :1;
221     ULONG_PTR Node  :6;
222     ULONG_PTR Locked  :1;
223     ULONG_PTR LargePage  :1;
224   } DUMMYSTRUCTNAME;
225 } PSAPI_WORKING_SET_EX_BLOCK, *PPSAPI_WORKING_SET_EX_BLOCK;
226 
227 typedef struct _PSAPI_WORKING_SET_EX_INFORMATION {
228   PVOID                      VirtualAddress;
229   PSAPI_WORKING_SET_EX_BLOCK VirtualAttributes;
230 } PSAPI_WORKING_SET_EX_INFORMATION, *PPSAPI_WORKING_SET_EX_INFORMATION;
231 
232 #ifdef __cplusplus
233 }
234 #endif
235 #endif
236