4 * Copyright 1998 Patrik Stridvall
5 * Copyright 2003 Eric Pouech
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "wine/server.h"
28 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(psapi
);
34 /***********************************************************************
35 * EmptyWorkingSet (PSAPI.@)
37 BOOL WINAPI
EmptyWorkingSet(HANDLE hProcess
)
39 return SetProcessWorkingSetSize(hProcess
, 0xFFFFFFFF, 0xFFFFFFFF);
42 /***********************************************************************
43 * EnumDeviceDrivers (PSAPI.@)
45 BOOL WINAPI
EnumDeviceDrivers(LPVOID
*lpImageBase
, DWORD cb
, LPDWORD lpcbNeeded
)
47 FIXME("(%p, %ld, %p): stub\n", lpImageBase
, cb
, lpcbNeeded
);
56 /***********************************************************************
57 * EnumProcesses (PSAPI.@)
59 BOOL WINAPI
EnumProcesses(DWORD
*lpidProcess
, DWORD cb
, DWORD
*lpcbNeeded
)
67 TRACE("(%p, %ld, %p)\n", lpidProcess
,cb
, lpcbNeeded
);
69 if ( lpidProcess
== NULL
)
71 if ( lpcbNeeded
!= NULL
)
74 SERVER_START_REQ( create_snapshot
)
76 req
->flags
= SNAP_PROCESS
;
79 wine_server_call_err( req
);
80 hSnapshot
= reply
->handle
;
86 FIXME("cannot create snapshot\n");
90 countMax
= cb
/ sizeof(DWORD
);
93 SERVER_START_REQ( next_process
)
95 req
->handle
= hSnapshot
;
96 req
->reset
= (count
== 0);
97 if ((ret
= !wine_server_call_err( req
)))
102 TRACE("process 0x%08lx\n", pid
);
103 if ( count
< countMax
)
104 lpidProcess
[count
] = pid
;
107 CloseHandle( hSnapshot
);
109 if ( lpcbNeeded
!= NULL
)
110 *lpcbNeeded
= sizeof(DWORD
) * count
;
112 TRACE("return %lu processes\n", count
);
117 /***********************************************************************
118 * EnumProcessModules (PSAPI.@)
120 BOOL WINAPI
EnumProcessModules(HANDLE hProcess
, HMODULE
*lphModule
,
121 DWORD cb
, LPDWORD lpcbNeeded
)
130 TRACE("(hProcess=%p, %p, %ld, %p)\n",
131 hProcess
, lphModule
, cb
, lpcbNeeded
);
133 if ( lphModule
== NULL
)
135 if ( lpcbNeeded
!= NULL
)
138 SERVER_START_REQ( get_process_info
)
140 req
->handle
= hProcess
;
141 if ( !wine_server_call_err( req
) )
142 pid
= (DWORD
)reply
->pid
;
150 FIXME("no pid for hProcess %p\n" ,hProcess
);
154 SERVER_START_REQ( create_snapshot
)
156 req
->flags
= SNAP_MODULE
;
157 req
->inherit
= FALSE
;
159 wine_server_call_err( req
);
160 hSnapshot
= reply
->handle
;
163 if ( hSnapshot
== 0 )
165 FIXME("cannot create snapshot\n");
169 countMax
= cb
/ sizeof(HMODULE
);
172 SERVER_START_REQ( next_module
)
174 req
->handle
= hSnapshot
;
175 req
->reset
= (count
== 0);
176 if ((ret
= !wine_server_call_err( req
)))
178 hModule
= (HMODULE
)reply
->base
;
183 TRACE("module 0x%p\n", hModule
);
184 if ( count
< countMax
)
185 lphModule
[count
] = hModule
;
188 CloseHandle( hSnapshot
);
190 if ( lpcbNeeded
!= NULL
)
191 *lpcbNeeded
= sizeof(HMODULE
) * count
;
193 TRACE("return %lu modules\n", count
);
198 /***********************************************************************
199 * GetDeviceDriverBaseNameA (PSAPI.@)
201 DWORD WINAPI
GetDeviceDriverBaseNameA(LPVOID ImageBase
, LPSTR lpBaseName
,
204 FIXME("(%p, %s, %ld): stub\n",
205 ImageBase
, debugstr_a(lpBaseName
), nSize
);
207 if (lpBaseName
&& nSize
)
208 lpBaseName
[0] = '\0';
213 /***********************************************************************
214 * GetDeviceDriverBaseNameW (PSAPI.@)
216 DWORD WINAPI
GetDeviceDriverBaseNameW(LPVOID ImageBase
, LPWSTR lpBaseName
,
219 FIXME("(%p, %s, %ld): stub\n",
220 ImageBase
, debugstr_w(lpBaseName
), nSize
);
222 if (lpBaseName
&& nSize
)
223 lpBaseName
[0] = '\0';
228 /***********************************************************************
229 * GetDeviceDriverFileNameA (PSAPI.@)
231 DWORD WINAPI
GetDeviceDriverFileNameA(LPVOID ImageBase
, LPSTR lpFilename
,
234 FIXME("(%p, %s, %ld): stub\n",
235 ImageBase
, debugstr_a(lpFilename
), nSize
);
237 if (lpFilename
&& nSize
)
238 lpFilename
[0] = '\0';
243 /***********************************************************************
244 * GetDeviceDriverFileNameW (PSAPI.@)
246 DWORD WINAPI
GetDeviceDriverFileNameW(LPVOID ImageBase
, LPWSTR lpFilename
,
249 FIXME("(%p, %s, %ld): stub\n",
250 ImageBase
, debugstr_w(lpFilename
), nSize
);
252 if (lpFilename
&& nSize
)
253 lpFilename
[0] = '\0';
258 /***********************************************************************
259 * GetMappedFileNameA (PSAPI.@)
261 DWORD WINAPI
GetMappedFileNameA(HANDLE hProcess
, LPVOID lpv
, LPSTR lpFilename
,
264 FIXME("(hProcess=%p, %p, %s, %ld): stub\n",
265 hProcess
, lpv
, debugstr_a(lpFilename
), nSize
);
267 if (lpFilename
&& nSize
)
268 lpFilename
[0] = '\0';
273 /***********************************************************************
274 * GetMappedFileNameW (PSAPI.@)
276 DWORD WINAPI
GetMappedFileNameW(HANDLE hProcess
, LPVOID lpv
, LPWSTR lpFilename
,
279 FIXME("(hProcess=%p, %p, %s, %ld): stub\n",
280 hProcess
, lpv
, debugstr_w(lpFilename
), nSize
);
282 if (lpFilename
&& nSize
)
283 lpFilename
[0] = '\0';
288 /***********************************************************************
289 * GetModuleBaseNameA (PSAPI.@)
291 DWORD WINAPI
GetModuleBaseNameA(HANDLE hProcess
, HMODULE hModule
,
292 LPSTR lpBaseName
, DWORD nSize
)
297 if (!GetModuleFileNameExA(hProcess
, hModule
, tmp
, sizeof(tmp
)))
299 if ((ptr
= strrchr(tmp
, '\\')) != NULL
) ptr
++; else ptr
= tmp
;
300 strncpy(lpBaseName
, ptr
, nSize
);
301 lpBaseName
[nSize
- 1] = '\0';
302 return strlen(lpBaseName
);
305 /***********************************************************************
306 * GetModuleBaseNameW (PSAPI.@)
308 DWORD WINAPI
GetModuleBaseNameW(HANDLE hProcess
, HMODULE hModule
,
309 LPWSTR lpBaseName
, DWORD nSize
)
314 TRACE("(hProcess=%p, hModule=%p, %p, %ld)\n",
315 hProcess
, hModule
, lpBaseName
, nSize
);
317 if (!lpBaseName
|| !nSize
) return 0;
319 ptr
= HeapAlloc(GetProcessHeap(), 0, nSize
/ 2);
322 len
= GetModuleBaseNameA(hProcess
, hModule
, ptr
, nSize
/ 2);
325 lpBaseName
[0] = '\0';
329 if (!MultiByteToWideChar( CP_ACP
, 0, ptr
, -1, lpBaseName
, nSize
/ 2 ))
330 lpBaseName
[nSize
/ 2 - 1] = 0;
333 HeapFree(GetProcessHeap(), 0, ptr
);
337 /***********************************************************************
338 * GetModuleFileNameExA (PSAPI.@)
340 DWORD WINAPI
GetModuleFileNameExA(HANDLE hProcess
, HMODULE hModule
,
341 LPSTR lpFileName
, DWORD nSize
)
345 TRACE("(hProcess=%p, hModule=%p, %p, %ld)\n",
346 hProcess
, hModule
, lpFileName
, nSize
);
348 if (!lpFileName
|| !nSize
) return 0;
350 if ( hProcess
== GetCurrentProcess() )
351 return GetModuleFileNameA( hModule
, lpFileName
, nSize
);
353 if (!(ptr
= HeapAlloc(GetProcessHeap(), 0, nSize
* sizeof(WCHAR
)))) return 0;
355 if (!GetModuleFileNameExW(hProcess
, hModule
, ptr
, nSize
))
357 lpFileName
[0] = '\0';
361 if (!WideCharToMultiByte( CP_ACP
, 0, ptr
, -1, lpFileName
, nSize
, NULL
, NULL
))
362 lpFileName
[nSize
- 1] = 0;
365 HeapFree(GetProcessHeap(), 0, ptr
);
366 return strlen(lpFileName
);
369 /***********************************************************************
370 * GetModuleFileNameExW (PSAPI.@)
372 DWORD WINAPI
GetModuleFileNameExW(HANDLE hProcess
, HMODULE hModule
,
373 LPWSTR lpFileName
, DWORD nSize
)
377 TRACE("(hProcess=%p, hModule=%p, %p, %ld)\n",
378 hProcess
, hModule
, lpFileName
, nSize
);
380 if (!lpFileName
|| !nSize
) return 0;
382 if ( hProcess
== GetCurrentProcess() )
383 return GetModuleFileNameW( hModule
, lpFileName
, nSize
);
387 SERVER_START_REQ( get_dll_info
)
389 req
->handle
= hProcess
;
390 req
->base_address
= hModule
;
391 wine_server_set_reply( req
, lpFileName
, (nSize
- 1) * sizeof(WCHAR
) );
392 if (!wine_server_call_err( req
))
394 len
= wine_server_reply_size(reply
) / sizeof(WCHAR
);
400 TRACE("return %s (%lu)\n", debugstr_w(lpFileName
), len
);
405 /***********************************************************************
406 * GetModuleInformation (PSAPI.@)
408 BOOL WINAPI
GetModuleInformation(HANDLE hProcess
, HMODULE hModule
,
409 LPMODULEINFO lpmodinfo
, DWORD cb
)
413 TRACE("(hProcess=%p, hModule=%p, %p, %ld)\n",
414 hProcess
, hModule
, lpmodinfo
, cb
);
416 if (cb
< sizeof(MODULEINFO
)) return FALSE
;
418 SERVER_START_REQ( get_dll_info
)
420 req
->handle
= hProcess
;
421 req
->base_address
= (void*)hModule
;
422 if (!wine_server_call_err( req
))
425 lpmodinfo
->lpBaseOfDll
= (void*)hModule
;
426 lpmodinfo
->SizeOfImage
= reply
->size
;
427 lpmodinfo
->EntryPoint
= reply
->entry_point
;
435 /***********************************************************************
436 * GetProcessMemoryInfo (PSAPI.@)
438 BOOL WINAPI
GetProcessMemoryInfo(HANDLE Process
,
439 PPROCESS_MEMORY_COUNTERS ppsmemCounters
, DWORD cb
)
441 FIXME("(hProcess=%p, %p, %ld): stub\n",
442 Process
, ppsmemCounters
, cb
);
444 memset(ppsmemCounters
, 0, cb
);
449 /***********************************************************************
450 * GetWsChanges (PSAPI.@)
452 BOOL WINAPI
GetWsChanges(HANDLE hProcess
,
453 PPSAPI_WS_WATCH_INFORMATION lpWatchInfo
, DWORD cb
)
455 FIXME("(hProcess=%p, %p, %ld): stub\n",
456 hProcess
, lpWatchInfo
, cb
);
458 memset(lpWatchInfo
, 0, cb
);
463 /***********************************************************************
464 * InitializeProcessForWsWatch (PSAPI.@)
466 BOOL WINAPI
InitializeProcessForWsWatch(HANDLE hProcess
)
468 FIXME("(hProcess=%p): stub\n", hProcess
);
473 /***********************************************************************
474 * QueryWorkingSet (PSAPI.@)
476 BOOL WINAPI
QueryWorkingSet(HANDLE hProcess
, LPVOID pv
, DWORD cb
)
478 FIXME("(hProcess=%p, %p, %ld)\n", hProcess
, pv
, cb
);
481 ((DWORD
*) pv
)[0] = 0; /* Empty WorkingSet */