13 typedef struct _MODULEINFO {
17 } MODULEINFO, *LPMODULEINFO;
18 typedef struct _PSAPI_WS_WATCH_INFORMATION {
21 } PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;
22 typedef struct _PROCESS_MEMORY_COUNTERS {
25 DWORD PeakWorkingSetSize;
27 DWORD QuotaPeakPagedPoolUsage;
28 DWORD QuotaPagedPoolUsage;
29 DWORD QuotaPeakNonPagedPoolUsage;
30 DWORD QuotaNonPagedPoolUsage;
32 DWORD PeakPagefileUsage;
33 } PROCESS_MEMORY_COUNTERS;
34 typedef PROCESS_MEMORY_COUNTERS* PPROCESS_MEMORY_COUNTERS;
36 class PsApiFunctions {
39 BOOL( WINAPI* EnumProcesses )( DWORD* lpidProcess, DWORD cb, DWORD* cbNeeded );
40 BOOL( WINAPI* EnumProcessModules )( HANDLE hProcess, HINSTANCE* lphModule, DWORD cb, LPDWORD lpcbNeeded );
41 DWORD( WINAPI* GetModuleBaseNameA )( HANDLE hProcess, HINSTANCE hModule, LPSTR lpBaseName, DWORD nSize );
42 DWORD( WINAPI* GetModuleFileNameExA )( HANDLE hProcess, HINSTANCE hModule, LPSTR lpFilename, DWORD nSize );
43 BOOL( WINAPI* GetModuleInformation )( HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb );
44 BOOL( WINAPI* EmptyWorkingSet )( HANDLE hProcess );
45 BOOL( WINAPI* QueryWorkingSet )( HANDLE hProcess, PVOID pv, DWORD cb );
46 BOOL( WINAPI* InitializeProcessForWsWatch )( HANDLE hProcess );
47 BOOL( WINAPI* GetWsChanges )( HANDLE hProcess, PPSAPI_WS_WATCH_INFORMATION lpWatchInfo, DWORD cb );
48 DWORD( WINAPI* GetMappedFileNameA )( HANDLE hProcess, LPVOID lpv, LPSTR lpFilename, DWORD nSize );
49 BOOL( WINAPI* EnumDeviceDrivers )( LPVOID* lpImageBase, DWORD cb, LPDWORD lpcbNeeded );
50 DWORD( WINAPI* GetDeviceDriverBaseNameA )( LPVOID ImageBase, LPSTR lpBaseName, DWORD nSize );
51 DWORD( WINAPI* GetDeviceDriverFileNameA )( LPVOID ImageBase, LPSTR lpFilename, DWORD nSize );
52 BOOL( WINAPI* GetProcessMemoryInfo )( HANDLE Process, PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb );
53 void load( HINSTANCE handle,
const char*
name,
void** pFunction ) {
54 *pFunction = (
void*)::GetProcAddress( handle,
name );
55 if ( 0 == *pFunction ) m_isValid =
false;
57 bool isValid()
const {
return m_isValid; }
60 HINSTANCE mh = ::LoadLibrary(
"PSAPI.DLL" );
64 load( mh,
"EnumProcesses", (
void**)&EnumProcesses );
65 load( mh,
"EnumProcessModules", (
void**)&EnumProcessModules );
66 load( mh,
"GetModuleBaseNameA", (
void**)&GetModuleBaseNameA );
67 load( mh,
"GetModuleFileNameExA", (
void**)&GetModuleFileNameExA );
68 load( mh,
"GetModuleInformation", (
void**)&GetModuleInformation );
69 load( mh,
"EmptyWorkingSet", (
void**)&EmptyWorkingSet );
70 load( mh,
"QueryWorkingSet", (
void**)&QueryWorkingSet );
71 load( mh,
"InitializeProcessForWsWatch", (
void**)&InitializeProcessForWsWatch );
72 load( mh,
"GetWsChanges", (
void**)&GetWsChanges );
73 load( mh,
"GetMappedFileNameA", (
void**)&GetMappedFileNameA );
74 load( mh,
"EnumDeviceDrivers", (
void**)&EnumDeviceDrivers );
75 load( mh,
"GetDeviceDriverBaseNameA", (
void**)&GetDeviceDriverBaseNameA );
76 load( mh,
"GetDeviceDriverFileNameA", (
void**)&GetDeviceDriverFileNameA );
77 load( mh,
"GetProcessMemoryInfo", (
void**)&GetProcessMemoryInfo );