1 /* $Id: win32.c,v 1.2 2002/08/29 23:57:54 hyperion Exp $
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS system libraries
6 * FILE: reactos/lib/psapi/misc/win32.c
7 * PURPOSE: Win32 interfaces for PSAPI
8 * PROGRAMMER: KJK::Hyperion <noog@libero.it>
16 #include <ddk/ntddk.h>
17 #include <internal/psapi.h>
19 /* Memory allocators for PSAPI */
20 PVOID STDCALL
PsaMalloc(IN OUT PVOID Context
, IN ULONG Size
)
25 PVOID STDCALL
PsaRealloc(IN OUT PVOID Context
, IN PVOID Addr
, IN ULONG Size
)
27 return realloc(Addr
, Size
);
30 VOID STDCALL
PsaFree(IN OUT PVOID Context
, IN PVOID Addr
)
36 BOOL STDCALL
EmptyWorkingSet(HANDLE hProcess
)
39 QUOTA_LIMITS qlProcessQuota
;
41 /* query the working set */
42 nErrCode
= NtQueryInformationProcess
47 sizeof(qlProcessQuota
),
52 if(!NT_SUCCESS(nErrCode
))
55 /* empty the working set */
56 qlProcessQuota
.MinimumWorkingSetSize
= -1;
57 qlProcessQuota
.MaximumWorkingSetSize
= -1;
59 /* set the working set */
60 nErrCode
= NtSetInformationProcess
65 sizeof(qlProcessQuota
)
69 if(NT_SUCCESS(nErrCode
))
74 SetLastError(RtlNtStatusToDosError(nErrCode
));
78 /* EnumDeviceDrivers */
79 /* callback context */
80 typedef struct _ENUM_DEVICE_DRIVERS_CONTEXT
84 } ENUM_DEVICE_DRIVERS_CONTEXT
, *PENUM_DEVICE_DRIVERS_CONTEXT
;
86 /* callback routine */
87 NTSTATUS STDCALL EnumDeviceDriversCallback
90 IN PSYSTEM_MODULE_ENTRY CurrentModule
,
91 IN OUT PVOID CallbackContext
94 register PENUM_DEVICE_DRIVERS_CONTEXT peddcContext
=
95 (PENUM_DEVICE_DRIVERS_CONTEXT
)CallbackContext
;
97 /* no more buffer space */
98 if(peddcContext
->nCount
== 0)
99 return STATUS_INFO_LENGTH_MISMATCH
;
101 /* return current module */
102 *(peddcContext
->lpImageBase
) = CurrentModule
->BaseAddress
;
104 /* go to next array slot */
105 (peddcContext
->lpImageBase
) ++;
106 (peddcContext
->nCount
) --;
108 return STATUS_SUCCESS
;
111 /* exported interface */
112 BOOL STDCALL EnumDeviceDrivers
119 register NTSTATUS nErrCode
;
120 ENUM_DEVICE_DRIVERS_CONTEXT eddcContext
= {lpImageBase
, cb
/ sizeof(PVOID
)};
124 /* do nothing if the buffer is empty */
125 if(cb
== 0 || lpImageBase
== NULL
)
131 /* enumerate the system modules */
132 nErrCode
= PsaEnumerateSystemModules
134 &EnumDeviceDriversCallback
,
139 /* return the count of bytes returned */
140 *lpcbNeeded
= (cb
- eddcContext
.nCount
) * sizeof(PVOID
);
143 if(NT_SUCCESS(nErrCode
) || nErrCode
== STATUS_INFO_LENGTH_MISMATCH
)
148 SetLastError(RtlNtStatusToDosError(nErrCode
));
154 /* callback context */
155 typedef struct _ENUM_PROCESSES_CONTEXT
159 } ENUM_PROCESSES_CONTEXT
, *PENUM_PROCESSES_CONTEXT
;
161 /* callback routine */
162 NTSTATUS STDCALL EnumProcessesCallback
164 IN PSYSTEM_PROCESS_INFORMATION CurrentProcess
,
165 IN OUT PVOID CallbackContext
168 register PENUM_PROCESSES_CONTEXT pepcContext
=
169 (PENUM_PROCESSES_CONTEXT
)CallbackContext
;
171 /* no more buffer space */
172 if(pepcContext
->nCount
== 0)
173 return STATUS_INFO_LENGTH_MISMATCH
;
175 /* return current process */
176 *(pepcContext
->lpidProcess
) = CurrentProcess
->ProcessId
;
178 /* go to next array slot */
179 (pepcContext
->lpidProcess
) ++;
180 (pepcContext
->nCount
) --;
182 return STATUS_SUCCESS
;
185 /* exported interface */
186 BOOL STDCALL EnumProcesses
193 register NTSTATUS nErrCode
;
194 ENUM_PROCESSES_CONTEXT epcContext
= {lpidProcess
, cb
/ sizeof(DWORD
)};
198 /* do nothing if the buffer is empty */
199 if(cb
== 0 || lpidProcess
== NULL
)
205 /* enumerate the process ids */
206 nErrCode
= PsaEnumerateProcesses(&EnumProcessesCallback
, &epcContext
, NULL
);
208 *lpcbNeeded
= (cb
- epcContext
.nCount
) * sizeof(DWORD
);
211 if(NT_SUCCESS(nErrCode
) || nErrCode
== STATUS_INFO_LENGTH_MISMATCH
)
216 SetLastError(RtlNtStatusToDosError(nErrCode
));
221 /* EnumProcessModules */
222 /* callback context */
223 typedef struct _ENUM_PROCESS_MODULES_CONTEXT
227 } ENUM_PROCESS_MODULES_CONTEXT
, *PENUM_PROCESS_MODULES_CONTEXT
;
229 /* callback routine */
230 NTSTATUS STDCALL EnumProcessModulesCallback
232 IN HANDLE ProcessHandle
,
233 IN PLDR_MODULE CurrentModule
,
234 IN OUT PVOID CallbackContext
237 register PENUM_PROCESS_MODULES_CONTEXT pepmcContext
=
238 (PENUM_PROCESS_MODULES_CONTEXT
)CallbackContext
;
240 /* no more buffer space */
241 if(pepmcContext
->nCount
== 0)
242 return STATUS_INFO_LENGTH_MISMATCH
;
244 /* return current process */
245 *(pepmcContext
->lphModule
) = CurrentModule
->BaseAddress
;
247 /* go to next array slot */
248 (pepmcContext
->lphModule
) ++;
249 (pepmcContext
->nCount
) --;
251 return STATUS_SUCCESS
;
254 /* exported interface */
255 BOOL STDCALL
EnumProcessModules(
256 HANDLE hProcess
, // handle to process
257 HMODULE
*lphModule
, // array of module handles
258 DWORD cb
, // size of array
259 LPDWORD lpcbNeeded
// number of bytes required
262 register NTSTATUS nErrCode
;
263 ENUM_PROCESS_MODULES_CONTEXT epmcContext
= {lphModule
, cb
/ sizeof(HMODULE
)};
267 /* do nothing if the buffer is empty */
268 if(cb
== 0 || lphModule
== NULL
)
274 /* enumerate the process modules */
275 nErrCode
= PsaEnumerateProcessModules
278 &EnumProcessModulesCallback
,
282 *lpcbNeeded
= (cb
- epmcContext
.nCount
) * sizeof(DWORD
);
285 if(NT_SUCCESS(nErrCode
) || nErrCode
== STATUS_INFO_LENGTH_MISMATCH
)
290 SetLastError(RtlNtStatusToDosError(nErrCode
));