summaryrefslogtreecommitdiff
path: root/plugins/Libs/PsAPI.pas
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Libs/PsAPI.pas')
-rw-r--r--plugins/Libs/PsAPI.pas399
1 files changed, 399 insertions, 0 deletions
diff --git a/plugins/Libs/PsAPI.pas b/plugins/Libs/PsAPI.pas
new file mode 100644
index 0000000000..1f637cf3d9
--- /dev/null
+++ b/plugins/Libs/PsAPI.pas
@@ -0,0 +1,399 @@
+{*******************************************************}
+{ }
+{ CodeGear Delphi Runtime Library }
+{ }
+{ Copyright (c) 1985-1999, Microsoft Corporation }
+{ }
+{ Translator: Borland Software Corporation }
+{ }
+{*******************************************************}
+
+{*******************************************************}
+{ WinNT process API Interface Unit }
+{*******************************************************}
+
+unit PsAPI;
+
+interface
+
+uses Windows;
+
+type
+ PPointer = ^Pointer;
+ PHMODULE = ^HMODULE;
+{$IFNDEF FPC}
+ size_t = integer;
+{$ENDIF}
+
+ TEnumProcesses = function (lpidProcess: LPDWORD; cb: DWORD; var cbNeeded: DWORD): BOOL stdcall;
+ TEnumProcessModules = function (hProcess: THandle; lphModule: PHMODULE; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL stdcall;
+ TGetModuleBaseNameA = function (hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PAnsiChar; nSize: DWORD): DWORD stdcall;
+ TGetModuleBaseNameW = function (hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PWideChar; nSize: DWORD): DWORD stdcall;
+ TGetModuleBaseName = TGetModuleBaseNameW;
+ TGetModuleFileNameExA = function (hProcess: THandle; hModule: HMODULE;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD stdcall;
+ TGetModuleFileNameExW = function (hProcess: THandle; hModule: HMODULE;
+ lpFilename: PWideChar; nSize: DWORD): DWORD stdcall;
+ TGetModuleFileNameEx = TGetModuleFileNameExW;
+
+ _MODULEINFO = packed record
+ lpBaseOfDll: Pointer;
+ SizeOfImage: DWORD;
+ EntryPoint : Pointer;
+ end;
+ MODULEINFO = _MODULEINFO;
+ LPMODULEINFO = ^_MODULEINFO;
+ TModuleInfo = _MODULEINFO;
+ PModuleInfo = LPMODULEINFO;
+
+ TGetModuleInformation = function (hProcess: THandle; hModule: HMODULE;
+ lpmodinfo: LPMODULEINFO; cb: DWORD): BOOL stdcall;
+ TEmptyWorkingSet = function (hProcess: THandle): BOOL stdcall;
+ TQueryWorkingSet = function (hProcess: THandle; pv: Pointer; cb: DWORD): BOOL stdcall;
+ TInitializeProcessForWsWatch = function (hProcess: THandle): BOOL stdcall;
+
+ _PSAPI_WS_WATCH_INFORMATION = packed record
+ FaultingPc: Pointer;
+ FaultingVa: Pointer;
+ end;
+ PSAPI_WS_WATCH_INFORMATION = _PSAPI_WS_WATCH_INFORMATION;
+ PPSAPI_WS_WATCH_INFORMATION = ^_PSAPI_WS_WATCH_INFORMATION;
+ TPSAPIWsWatchInformation = _PSAPI_WS_WATCH_INFORMATION;
+ PPSAPIWsWatchInformation = PPSAPI_WS_WATCH_INFORMATION;
+
+ TGetWsChanges = function (hProcess: THandle; lpWatchInfo: PPSAPI_WS_WATCH_INFORMATION;
+ cb: DWORD): BOOL stdcall;
+
+ TGetMappedFileNameA = function (hProcess: THandle; lpv: Pointer;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD stdcall;
+ TGetMappedFileNameW = function (hProcess: THandle; lpv: Pointer;
+ lpFilename: PWideChar; nSize: DWORD): DWORD stdcall;
+ TGetMappedFileName = TGetMappedFileNameW;
+ TGetDeviceDriverBaseNameA = function (ImageBase: Pointer; lpBaseName: PAnsiChar;
+ nSize: DWORD): DWORD stdcall;
+ TGetDeviceDriverBaseNameW = function (ImageBase: Pointer; lpBaseName: PWideChar;
+ nSize: DWORD): DWORD stdcall;
+ TGetDeviceDriverBaseName = TGetDeviceDriverBaseNameW;
+ TGetDeviceDriverFileNameA = function (ImageBase: Pointer; lpFileName: PAnsiChar;
+ nSize: DWORD): DWORD stdcall;
+ TGetDeviceDriverFileNameW = function (ImageBase: Pointer; lpFileName: PWideChar;
+ nSize: DWORD): DWORD stdcall;
+ TGetDeviceDriverFileName = TGetDeviceDriverFileNameW;
+
+ TEnumDeviceDrivers = function (lpImageBase: PPointer; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL stdcall;
+
+ _PROCESS_MEMORY_COUNTERS = packed record
+ cb : DWORD;
+ PageFaultCount : DWORD;
+ PeakWorkingSetSize : size_t;
+ WorkingSetSize : size_t;
+ QuotaPeakPagedPoolUsage : size_t;
+ QuotaPagedPoolUsage : size_t;
+ QuotaPeakNonPagedPoolUsage: size_t;
+ QuotaNonPagedPoolUsage : size_t;
+ PagefileUsage : size_t;
+ PeakPagefileUsage : size_t;
+ end;
+ PROCESS_MEMORY_COUNTERS = _PROCESS_MEMORY_COUNTERS;
+ PPROCESS_MEMORY_COUNTERS = ^_PROCESS_MEMORY_COUNTERS;
+ TProcessMemoryCounters = _PROCESS_MEMORY_COUNTERS;
+ PProcessMemoryCounters = ^_PROCESS_MEMORY_COUNTERS;
+
+ TGetProcessMemoryInfo = function (Process: THandle;
+ ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL stdcall;
+
+function EnumProcesses(lpidProcess: LPDWORD; cb: DWORD; var cbNeeded: DWORD): BOOL;
+function EnumProcessModules(hProcess: THandle; lphModule:PHMODULE ; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL;
+function GetModuleBaseName(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PWideChar; nSize: DWORD): DWORD;
+function GetModuleBaseNameA(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PAnsiChar; nSize: DWORD): DWORD;
+function GetModuleBaseNameW(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PWideChar; nSize: DWORD): DWORD;
+function GetModuleFileNameEx(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+function GetModuleFileNameExA(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD;
+function GetModuleFileNameExW(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+function GetModuleInformation(hProcess: THandle; hModule: HMODULE;
+ lpmodinfo: LPMODULEINFO; cb: DWORD): BOOL;
+function EmptyWorkingSet(hProcess: THandle): BOOL;
+function QueryWorkingSet(hProcess: THandle; pv: Pointer; cb: DWORD): BOOL;
+function InitializeProcessForWsWatch(hProcess: THandle): BOOL;
+function GetMappedFileName(hProcess: THandle; lpv: Pointer;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+function GetMappedFileNameA(hProcess: THandle; lpv: Pointer;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD;
+function GetMappedFileNameW(hProcess: THandle; lpv: Pointer;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+function GetDeviceDriverBaseName(ImageBase: Pointer; lpBaseName: PWideChar;
+ nSize: DWORD): DWORD;
+function GetDeviceDriverBaseNameA(ImageBase: Pointer; lpBaseName: PAnsiChar;
+ nSize: DWORD): DWORD;
+function GetDeviceDriverBaseNameW(ImageBase: Pointer; lpBaseName: PWideChar;
+ nSize: DWORD): DWORD;
+function GetDeviceDriverFileName(ImageBase: Pointer; lpFileName: PWideChar;
+ nSize: DWORD): DWORD;
+function GetDeviceDriverFileNameA(ImageBase: Pointer; lpFileName: PAnsiChar;
+ nSize: DWORD): DWORD;
+function GetDeviceDriverFileNameW(ImageBase: Pointer; lpFileName: PWideChar;
+ nSize: DWORD): DWORD;
+function EnumDeviceDrivers(lpImageBase: PPointer; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL;
+function GetProcessMemoryInfo(Process: THandle;
+ ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL;
+
+implementation
+
+var
+ hPSAPI: THandle;
+var
+ _EnumProcesses : TEnumProcesses;
+ _EnumProcessModules : TEnumProcessModules;
+ _GetModuleBaseName : TGetModuleBaseNameW;
+ _GetModuleFileNameEx : TGetModuleFileNameExW;
+ _GetModuleBaseNameA : TGetModuleBaseNameA;
+ _GetModuleFileNameExA : TGetModuleFileNameExA;
+ _GetModuleBaseNameW : TGetModuleBaseNameW;
+ _GetModuleFileNameExW : TGetModuleFileNameExW;
+ _GetModuleInformation : TGetModuleInformation;
+ _EmptyWorkingSet : TEmptyWorkingSet;
+ _QueryWorkingSet : TQueryWorkingSet;
+ _InitializeProcessForWsWatch: TInitializeProcessForWsWatch;
+ _GetMappedFileName : TGetMappedFileNameW;
+ _GetDeviceDriverBaseName : TGetDeviceDriverBaseNameW;
+ _GetDeviceDriverFileName : TGetDeviceDriverFileNameW;
+ _GetMappedFileNameA : TGetMappedFileNameA;
+ _GetDeviceDriverBaseNameA : TGetDeviceDriverBaseNameA;
+ _GetDeviceDriverFileNameA : TGetDeviceDriverFileNameA;
+ _GetMappedFileNameW : TGetMappedFileNameW;
+ _GetDeviceDriverBaseNameW : TGetDeviceDriverBaseNameW;
+ _GetDeviceDriverFileNameW : TGetDeviceDriverFileNameW;
+ _EnumDeviceDrivers : TEnumDeviceDrivers;
+ _GetProcessMemoryInfo : TGetProcessMemoryInfo;
+
+function CheckPSAPILoaded: Boolean;
+begin
+ if hPSAPI = 0 then
+ begin
+ hPSAPI := LoadLibrary('PSAPI.dll');
+ if hPSAPI < 32 then
+ begin
+ hPSAPI := 0;
+ Result := False;
+ Exit;
+ end;
+ @_EnumProcesses := GetProcAddress(hPSAPI, PAnsiChar('EnumProcesses'));
+ @_EnumProcessModules := GetProcAddress(hPSAPI, PAnsiChar('EnumProcessModules'));
+ @_GetModuleBaseName := GetProcAddress(hPSAPI, PAnsiChar('GetModuleBaseNameW'));
+ @_GetModuleFileNameEx := GetProcAddress(hPSAPI, PAnsiChar('GetModuleFileNameExW'));
+ @_GetModuleBaseNameA := GetProcAddress(hPSAPI, PAnsiChar('GetModuleBaseNameA'));
+ @_GetModuleFileNameExA := GetProcAddress(hPSAPI, PAnsiChar('GetModuleFileNameExA'));
+ @_GetModuleBaseNameW := GetProcAddress(hPSAPI, PAnsiChar('GetModuleBaseNameW'));
+ @_GetModuleFileNameExW := GetProcAddress(hPSAPI, PAnsiChar('GetModuleFileNameExW'));
+ @_GetModuleInformation := GetProcAddress(hPSAPI, PAnsiChar('GetModuleInformation'));
+ @_EmptyWorkingSet := GetProcAddress(hPSAPI, PAnsiChar('EmptyWorkingSet'));
+ @_QueryWorkingSet := GetProcAddress(hPSAPI, PAnsiChar('QueryWorkingSet'));
+ @_InitializeProcessForWsWatch := GetProcAddress(hPSAPI, PAnsiChar('InitializeProcessForWsWatch'));
+ @_GetMappedFileName := GetProcAddress(hPSAPI, PAnsiChar('GetMappedFileNameW'));
+ @_GetDeviceDriverBaseName := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverBaseNameW'));
+ @_GetDeviceDriverFileName := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverFileNameW'));
+ @_GetMappedFileNameA := GetProcAddress(hPSAPI, PAnsiChar('GetMappedFileNameA'));
+ @_GetDeviceDriverBaseNameA := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverBaseNameA'));
+ @_GetDeviceDriverFileNameA := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverFileNameA'));
+ @_GetMappedFileNameW := GetProcAddress(hPSAPI, PAnsiChar('GetMappedFileNameW'));
+ @_GetDeviceDriverBaseNameW := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverBaseNameW'));
+ @_GetDeviceDriverFileNameW := GetProcAddress(hPSAPI, PAnsiChar('GetDeviceDriverFileNameW'));
+ @_EnumDeviceDrivers := GetProcAddress(hPSAPI, PAnsiChar('EnumDeviceDrivers'));
+ @_GetProcessMemoryInfo := GetProcAddress(hPSAPI, PAnsiChar('GetProcessMemoryInfo'));
+ end;
+ Result := True;
+end;
+
+function EnumProcesses(lpidProcess: LPDWORD; cb: DWORD; var cbNeeded: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _EnumProcesses(lpidProcess, cb, cbNeeded)
+ else Result := False;
+end;
+
+function EnumProcessModules(hProcess: THandle; lphModule: PHMODULE; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _EnumProcessModules(hProcess, lphModule, cb, lpcbNeeded)
+ else Result := False;
+end;
+
+function GetModuleBaseName(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleBaseName(hProcess, hModule, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleBaseNameA(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PAnsiChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleBaseNameA(hProcess, hModule, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleBaseNameW(hProcess: THandle; hModule: HMODULE;
+ lpBaseName: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleBaseNameW(hProcess, hModule, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleFileNameEx(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleFileNameEx(hProcess, hModule, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleFileNameExA(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleFileNameExA(hProcess, hModule, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleFileNameExW(hProcess: THandle; hModule: HMODULE;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleFileNameExW(hProcess, hModule, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetModuleInformation(hProcess: THandle; hModule: HMODULE;
+ lpmodinfo: LPMODULEINFO; cb: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetModuleInformation(hProcess, hModule, lpmodinfo, cb)
+ else Result := False;
+end;
+
+function EmptyWorkingSet(hProcess: THandle): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _EmptyWorkingSet(hProcess)
+ else Result := False;
+end;
+
+function QueryWorkingSet(hProcess: THandle; pv: Pointer; cb: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _QueryWorkingSet(hProcess, pv, cb)
+ else Result := False;
+end;
+
+function InitializeProcessForWsWatch(hProcess: THandle): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _InitializeProcessForWsWatch(hProcess)
+ else Result := False;
+end;
+
+function GetMappedFileName(hProcess: THandle; lpv: Pointer;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetMappedFileName(hProcess, lpv, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetMappedFileNameA(hProcess: THandle; lpv: Pointer;
+ lpFilename: PAnsiChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetMappedFileNameA(hProcess, lpv, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetMappedFileNameW(hProcess: THandle; lpv: Pointer;
+ lpFilename: PWideChar; nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetMappedFileNameW(hProcess, lpv, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverBaseName(ImageBase: Pointer; lpBaseName: PWideChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverBasename(ImageBase, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverBaseNameA(ImageBase: Pointer; lpBaseName: PAnsiChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverBasenameA(ImageBase, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverBaseNameW(ImageBase: Pointer; lpBaseName: PWideChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverBasenameW(ImageBase, lpBaseName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverFileName(ImageBase: Pointer; lpFileName: PWideChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverFileName(ImageBase, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverFileNameA(ImageBase: Pointer; lpFileName: PAnsiChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverFileNameA(ImageBase, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function GetDeviceDriverFileNameW(ImageBase: Pointer; lpFileName: PWideChar;
+ nSize: DWORD): DWORD;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetDeviceDriverFileNameW(ImageBase, lpFileName, nSize)
+ else Result := 0;
+end;
+
+function EnumDeviceDrivers(lpImageBase: PPointer; cb: DWORD;
+ var lpcbNeeded: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _EnumDeviceDrivers(lpImageBase, cb, lpcbNeeded)
+ else Result := False;
+end;
+
+function GetProcessMemoryInfo(Process: THandle;
+ ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL;
+begin
+ if CheckPSAPILoaded then
+ Result := _GetProcessMemoryInfo(Process, ppsmemCounters, cb)
+ else Result := False;
+end;
+
+end.