00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GAUDI_SYSTEM_WIN32PSAPI_H
00016 #define GAUDI_SYSTEM_WIN32PSAPI_H
00017 #ifdef _WIN32
00018 typedef struct _MODULEINFO {
00019 LPVOID lpBaseOfDll;
00020 DWORD SizeOfImage;
00021 LPVOID EntryPoint;
00022 } MODULEINFO, *LPMODULEINFO;
00023 typedef struct _PSAPI_WS_WATCH_INFORMATION {
00024 LPVOID FaultingPc;
00025 LPVOID FaultingVa;
00026 } PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;
00027 typedef struct _PROCESS_MEMORY_COUNTERS {
00028 DWORD cb;
00029 DWORD PageFaultCount;
00030 DWORD PeakWorkingSetSize;
00031 DWORD WorkingSetSize;
00032 DWORD QuotaPeakPagedPoolUsage;
00033 DWORD QuotaPagedPoolUsage;
00034 DWORD QuotaPeakNonPagedPoolUsage;
00035 DWORD QuotaNonPagedPoolUsage;
00036 DWORD PagefileUsage;
00037 DWORD PeakPagefileUsage;
00038 } PROCESS_MEMORY_COUNTERS;
00039 typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
00040
00041 class PsApiFunctions {
00042 public:
00043 bool m_isValid;
00044 BOOL (WINAPI *EnumProcesses) (DWORD* lpidProcess, DWORD cb, DWORD * cbNeeded);
00045 BOOL (WINAPI *EnumProcessModules) (HANDLE hProcess, HINSTANCE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
00046 DWORD (WINAPI *GetModuleBaseNameA) (HANDLE hProcess, HINSTANCE hModule, LPSTR lpBaseName, DWORD nSize );
00047 DWORD (WINAPI *GetModuleFileNameExA) (HANDLE hProcess, HINSTANCE hModule, LPSTR lpFilename, DWORD nSize);
00048 BOOL (WINAPI *GetModuleInformation) (HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb );
00049 BOOL (WINAPI *EmptyWorkingSet) (HANDLE hProcess);
00050 BOOL (WINAPI *QueryWorkingSet) (HANDLE hProcess, PVOID pv, DWORD cb );
00051 BOOL (WINAPI *InitializeProcessForWsWatch)(HANDLE hProcess);
00052 BOOL (WINAPI *GetWsChanges) (HANDLE hProcess, PPSAPI_WS_WATCH_INFORMATION lpWatchInfo, DWORD cb);
00053 DWORD (WINAPI *GetMappedFileNameA) (HANDLE hProcess, LPVOID lpv, LPSTR lpFilename, DWORD nSize );
00054 BOOL (WINAPI *EnumDeviceDrivers) (LPVOID *lpImageBase, DWORD cb, LPDWORD lpcbNeeded );
00055 DWORD (WINAPI *GetDeviceDriverBaseNameA)(LPVOID ImageBase, LPSTR lpBaseName, DWORD nSize );
00056 DWORD (WINAPI *GetDeviceDriverFileNameA)(LPVOID ImageBase, LPSTR lpFilename, DWORD nSize );
00057 BOOL (WINAPI *GetProcessMemoryInfo) (HANDLE Process, PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb );
00058 void load(HINSTANCE handle, const char* name, void** pFunction) {
00059 *pFunction = (void*)::GetProcAddress(handle, name);
00060 if ( 0 == *pFunction ) m_isValid = false;
00061 }
00062 bool isValid() const {
00063 return m_isValid;
00064 }
00065 PsApiFunctions() {
00066 m_isValid = true;
00067 HINSTANCE mh = ::LoadLibrary("PSAPI.DLL");
00068 if ( 0 == mh ) {
00069 m_isValid = false;
00070 }
00071 else {
00072 load( mh, "EnumProcesses", (void**)&EnumProcesses );
00073 load( mh, "EnumProcessModules", (void**)&EnumProcessModules );
00074 load( mh, "GetModuleBaseNameA", (void**)&GetModuleBaseNameA );
00075 load( mh, "GetModuleFileNameExA", (void**)&GetModuleFileNameExA );
00076 load( mh, "GetModuleInformation", (void**)&GetModuleInformation );
00077 load( mh, "EmptyWorkingSet", (void**)&EmptyWorkingSet );
00078 load( mh, "QueryWorkingSet", (void**)&QueryWorkingSet );
00079 load( mh, "InitializeProcessForWsWatch", (void**)&InitializeProcessForWsWatch );
00080 load( mh, "GetWsChanges", (void**)&GetWsChanges );
00081 load( mh, "GetMappedFileNameA", (void**)&GetMappedFileNameA );
00082 load( mh, "EnumDeviceDrivers", (void**)&EnumDeviceDrivers );
00083 load( mh, "GetDeviceDriverBaseNameA", (void**)&GetDeviceDriverBaseNameA );
00084 load( mh, "GetDeviceDriverFileNameA", (void**)&GetDeviceDriverFileNameA );
00085 load( mh, "GetProcessMemoryInfo", (void**)&GetProcessMemoryInfo );
00086 }
00087 }
00088 };
00089 #endif
00090
00091 #endif // GAUDI_SYSTEM_WIN32PSAPI_H