![]() |
[gelöst] Module eines Prozzeses ermitteln
Hi,
ich versuche shcon den ganzen Vormittag irgendwie die Module eines Prozesses (Die geladenen DLLs) auszulesen. Mein eigentlichtliches Problem ist: Ich möchte gerne eine bestimmte Aktion durchführen, wenn eine DLL von keinem Prozess benutzt wird. Ich habe jetzt gegoogelt und in dieversen Foren nachgeschaut. Auch bei den Schweizern war ich schon. Ich bekomme momentan eine Liste aller Prozesse mit diversen Informationen (Filename, ProzessID, etc) nur leider nicht die von dem Prozess geladenen Module heraus. Hat da jemand eine Idee für mich? Ich habe hier einmal den Source den ich bei den Schweizern gefunden habe (ein wenig angepasst, aber genauso funktionstüchtig).
Delphi-Quellcode:
// -----------------------------------------------------------------------------
// ADsEnumerateNext // ----------------------------------------------------------------------------- function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG; var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll'; // ----------------------------------------------------------------------------- // TProcessList.DumpWMI_Process // ----------------------------------------------------------------------------- procedure TProcessList.DumpWMI_Process(Process: SWBemObject); var Enum: IEnumVARIANT; varArr: OleVariant; lNumElements: ULong; SProp: ISWbemProperty; Prop: OleVariant; oProcess: TProcess; oProcessInfo: TProcessInfo; begin oProcess := TProcess.Create; oProcess.FName := '+ WMI Path: ' + Process.Path_.Path; Enum := Process.Properties_._NewEnum as IEnumVariant; Process. while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and (lNumElements > 0) do begin if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and Assigned(SProp) then begin try oProcessInfo := TProcessInfo.Create; oProcessInfo.ProprtyName := SProp.Name; Prop := SProp.Get_Value; oProcessInfo.PropertyType := VarTypeAsText(VarType(Prop)); oProcessInfo.PropertyValue := VarToStr(Prop); oProcess.FProcessInfoList.Add(oProcessInfo); if SProp.Name = 'Caption' then sListAll := sListAll + oProcessInfo.PropertyValue + #13#10; except on E:Exception do begin end; end; end; end; Add(oProcess); end; // TProcessList.DumpWMI_Process // ----------------------------------------------------------------------------- // TProcessList.GetProcesses // ----------------------------------------------------------------------------- procedure TProcessList.GetProcesses; var Server: string; Enum: IEnumVARIANT; varArr: OleVariant; lNumElements: ULong; AName: array[0..255] of Char; ASize: DWORD; begin Clear; sListAll := ''; if (ParamCount = 0) then begin Server := ''; ASize := SizeOf(AName) - 1; if GetComputerName(@AName, ASize) then Server := AName; end else begin Server := ParamStr(1); end; Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '', '', '', '', 0, nil).ExecQuery('Select * from Win32_Process', 'WQL', wbemFlagBidirectional, nil)._NewEnum as IEnumVariant; while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and (lNumElements > 0) do begin DumpWMI_Process(IUnknown(varArr) as SWBemObject); end; end; // TProcessList.GetProcesses |
Re: Module eines Prozzeses ermitteln
Mit den Toolhelp32-Funktionen erhältst du sehr viele Informationen, unter anderem kannst du dir auch alle Module eines Prozesses auflisten lassen. Such einfach mal danach.
|
Re: Module eines Prozzeses ermitteln
Hi,
danke dir. Habe dort erst nur infos für die Prozesse gefunden. Hab das mit den Modulen nun gefunden und das funktioniert wunderbar. für andere Suchende: Diese Funktion gibt eine Liste aller Module eines Threads mit der ID cThreadID zurück.
Delphi-Quellcode:
procedure ListProcessModules(cThreadID: Cardinal; var SL: TStringList);
var Snapshot: THandle; Module: TModuleEntry32; begin Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, cThreadID); if (Snapshot <> 0) and (Snapshot <> INVALID_HANDLE_VALUE) then begin try ZeroMemory(@Module, SizeOf(TModuleEntry32)); Module.dwSize := SizeOf(TModuleEntry32); if Module32First(Snapshot, Module) then repeat SL.Add(StrPas(Module.szModule)); until not Module32Next(Snapshot, Module); finally CloseHandle(Snapshot); end; end; end; Gruß angos |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz