1 /***********************************************************************\
2 *                                psapi.d                                *
3 *                                                                       *
4 *                       Windows API header module                       *
5 *                                                                       *
6 *                 Translated from MinGW Windows headers                 *
7 *                                                                       *
8 *                       Placed into public domain                       *
9 \***********************************************************************/
10 /* Comment from MinGW
11  *   Process status API (PSAPI)
12  *   http://windowssdk.msdn.microsoft.com/library/ms684884.aspx
13  */
14 
15 module win32.psapi;
16 
17 private import win32.w32api;
18 private import win32.winbase;
19 private import win32.windef;
20 
21 struct MODULEINFO {
22 	LPVOID lpBaseOfDll;
23 	DWORD SizeOfImage;
24 	LPVOID EntryPoint;
25 }
26 alias MODULEINFO* LPMODULEINFO;
27 
28 struct PSAPI_WS_WATCH_INFORMATION {
29 	LPVOID FaultingPc;
30 	LPVOID FaultingVa;
31 }
32 alias PSAPI_WS_WATCH_INFORMATION* PPSAPI_WS_WATCH_INFORMATION;
33 
34 struct PSAPI_WS_WATCH_INFORMATION_EX {
35 	PSAPI_WS_WATCH_INFORMATION BasicInfo;
36 	ULONG_PTR FaultingThreadId;
37 	ULONG_PTR Flags;
38 }
39 alias PSAPI_WS_WATCH_INFORMATION_EX* PPSAPI_WS_WATCH_INFORMATION_EX;
40 
41 struct PROCESS_MEMORY_COUNTERS {
42 	DWORD cb;
43 	DWORD PageFaultCount;
44 	DWORD PeakWorkingSetSize;
45 	DWORD WorkingSetSize;
46 	DWORD QuotaPeakPagedPoolUsage;
47 	DWORD QuotaPagedPoolUsage;
48 	DWORD QuotaPeakNonPagedPoolUsage;
49 	DWORD QuotaNonPagedPoolUsage;
50 	DWORD PagefileUsage;
51 	DWORD PeakPagefileUsage;
52 }
53 alias PROCESS_MEMORY_COUNTERS* PPROCESS_MEMORY_COUNTERS;
54 
55 struct PERFORMANCE_INFORMATION {
56 	DWORD cb;
57 	SIZE_T CommitTotal;
58 	SIZE_T CommitLimit;
59 	SIZE_T CommitPeak;
60 	SIZE_T PhysicalTotal;
61 	SIZE_T PhysicalAvailable;
62 	SIZE_T SystemCache;
63 	SIZE_T KernelTotal;
64 	SIZE_T KernelPaged;
65 	SIZE_T KernelNonpaged;
66 	SIZE_T PageSize;
67 	DWORD HandleCount;
68 	DWORD ProcessCount;
69 	DWORD ThreadCount;
70 }
71 alias PERFORMANCE_INFORMATION* PPERFORMANCE_INFORMATION;
72 
73 struct ENUM_PAGE_FILE_INFORMATION {
74 	DWORD cb;
75 	DWORD Reserved;
76 	SIZE_T TotalSize;
77 	SIZE_T TotalInUse;
78 	SIZE_T PeakUsage;
79 }
80 alias ENUM_PAGE_FILE_INFORMATION* PENUM_PAGE_FILE_INFORMATION;
81 
82 /* application-defined callback function used with the EnumPageFiles()
83  * http://windowssdk.msdn.microsoft.com/library/ms682627.aspx */
84 version (Unicode) {
85 	alias BOOL function(LPVOID, PENUM_PAGE_FILE_INFORMATION, LPCWSTR)
86 	  PENUM_PAGE_FILE_CALLBACK;
87 } else {
88 	alias BOOL function(LPVOID, PENUM_PAGE_FILE_INFORMATION, LPCSTR)
89 	  PENUM_PAGE_FILE_CALLBACK;
90 }
91 
92 // Grouped by application, not in alphabetical order.
93 extern (Windows) {
94 	/* Process Information
95 	 * http://windowssdk.msdn.microsoft.com/library/ms684870.aspx */
96 	BOOL EnumProcesses(DWORD*, DWORD, DWORD*); /* NT/2000/XP/Server2003/Vista/Longhorn */
97 	DWORD GetProcessImageFileNameA(HANDLE, LPSTR, DWORD); /* XP/Server2003/Vista/Longhorn */
98 	DWORD GetProcessImageFileNameW(HANDLE, LPWSTR, DWORD); /* XP/Server2003/Vista/Longhorn */
99 
100 	/* Module Information
101 	 * http://windowssdk.msdn.microsoft.com/library/ms684232.aspx */
102 	BOOL EnumProcessModules(HANDLE, HMODULE*, DWORD, LPDWORD);
103 	BOOL EnumProcessModulesEx(HANDLE, HMODULE*, DWORD, LPDWORD, DWORD); /* Vista/Longhorn */
104 	DWORD GetModuleBaseNameA(HANDLE, HMODULE, LPSTR, DWORD);
105 	DWORD GetModuleBaseNameW(HANDLE, HMODULE, LPWSTR, DWORD);
106 	DWORD GetModuleFileNameExA(HANDLE, HMODULE, LPSTR, DWORD);
107 	DWORD GetModuleFileNameExW(HANDLE, HMODULE, LPWSTR, DWORD);
108 	BOOL GetModuleInformation(HANDLE, HMODULE, LPMODULEINFO, DWORD);
109 
110 	/* Device Driver Information
111 	 * http://windowssdk.msdn.microsoft.com/library/ms682578.aspx */
112 	BOOL EnumDeviceDrivers(LPVOID*, DWORD, LPDWORD);
113 	DWORD GetDeviceDriverBaseNameA(LPVOID, LPSTR, DWORD);
114 	DWORD GetDeviceDriverBaseNameW(LPVOID, LPWSTR, DWORD);
115 	DWORD GetDeviceDriverFileNameA(LPVOID, LPSTR, DWORD);
116 	DWORD GetDeviceDriverFileNameW(LPVOID, LPWSTR, DWORD);
117 
118 	/* Process Memory Usage Information
119 	 * http://windowssdk.msdn.microsoft.com/library/ms684879.aspx */
120 	BOOL GetProcessMemoryInfo(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
121 
122 	/* Working Set Information
123 	 * http://windowssdk.msdn.microsoft.com/library/ms687398.aspx */
124 	BOOL EmptyWorkingSet(HANDLE);
125 	BOOL GetWsChanges(HANDLE, PPSAPI_WS_WATCH_INFORMATION, DWORD);
126 	BOOL GetWsChangesEx(HANDLE, PPSAPI_WS_WATCH_INFORMATION_EX, DWORD); /* Vista/Longhorn */
127 	BOOL InitializeProcessForWsWatch(HANDLE);
128 	BOOL QueryWorkingSet(HANDLE, PVOID, DWORD);
129 	BOOL QueryWorkingSetEx(HANDLE, PVOID, DWORD);
130 
131 	/* Memory-Mapped File Information
132 	 * http://windowssdk.msdn.microsoft.com/library/ms684212.aspx */
133 	DWORD GetMappedFileNameW(HANDLE, LPVOID, LPWSTR, DWORD);
134 	DWORD GetMappedFileNameA(HANDLE, LPVOID, LPSTR, DWORD);
135 
136 	/* Resources Information */
137 	BOOL GetPerformanceInfo(PPERFORMANCE_INFORMATION, DWORD); /* XP/Server2003/Vista/Longhorn */
138 	BOOL EnumPageFilesW(PENUM_PAGE_FILE_CALLBACK, LPVOID); /* 2000/XP/Server2003/Vista/Longhorn */
139 	BOOL EnumPageFilesA(PENUM_PAGE_FILE_CALLBACK, LPVOID); /* 2000/XP/Server2003/Vista/Longhorn */
140 }
141 
142 version (Unicode) {
143 	alias GetModuleBaseNameW GetModuleBaseName;
144 	alias GetModuleFileNameExW GetModuleFileNameEx;
145 	alias GetMappedFileNameW GetMappedFileName;
146 	alias GetDeviceDriverBaseNameW GetDeviceDriverBaseName;
147 	alias GetDeviceDriverFileNameW GetDeviceDriverFileName;
148 	alias EnumPageFilesW EnumPageFiles;
149 	alias GetProcessImageFileNameW GetProcessImageFileName;
150 } else {
151 	alias GetModuleBaseNameA GetModuleBaseName;
152 	alias GetModuleFileNameExA GetModuleFileNameEx;
153 	alias GetMappedFileNameA GetMappedFileName;
154 	alias GetDeviceDriverBaseNameA GetDeviceDriverBaseName;
155 	alias GetDeviceDriverFileNameA GetDeviceDriverFileName;
156 	alias EnumPageFilesA EnumPageFiles;
157 	alias GetProcessImageFileNameA GetProcessImageFileName;
158 }