Zitat von
Olli:
Das müßtest du mir nochmal erklären, wenn es geht.
Delphi-Quellcode:
function GetExecutableFromPID(dwProcessID: DWord): String;
var
FSnapshotHandle: THandle;
FModuleEntry32: TModuleEntry32;
begin
Result := '';
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
FModuleEntry32.dwSize := Sizeof(FModuleEntry32);
Module32First(FSnapshotHandle, FModuleEntry32);
if FileExists(FModuleEntry32.szExePath) = True then
Result := FModuleEntry32.szExePath
else
Result := '';
CloseHandle(FSnapshotHandle);
end;
end;
Ich wollte den Pfad zu einem Prozess ermitteln, um diesen z.B. neu starten zu können. In einem Forum (ich meine
DP, bin mir aber nicht sicher) habe ich dann den Tipp gefunden, dass man zu die geöffneten Module auslesen kann. Das erste Modul ist dann immer die Prozessdatei selbst, da diese immer als erste geöffnet werden muss, bevor weitere Module geladen werden können. Bei einem Dienst steht in dort jedoch Speichermüll. So hat man ein weiteres Indiz, ob es sich um einen Dienst handelt.
Zitat von
Olli:
Ein Thread innerhalb eines Dienstes muß nicht als SYSTEM laufen, auch wenn der Dienst als SYSTEM gestartet wurde. Ergo kann das Token falsch sein, oder schlimmer, du kannst möglicherweise garnicht die Rechte haben um auf Ressourcen zuzugreifen, die du im obigen Code ansprichst.
Zitat von
Olli:
Daß einige Prozesse einen Elternprozeß haben ist dir klar? Für Dienste gibt es normalerweise einen einzigen Elternprozeß (services.exe) unter dem dann andere laufen (svchost.exe für
DLL-Services usw.).
Wie kann ich denn diesen "Elternprozess" ermitteln? Kannst du das ein wenig ausführlicher beschreiben, da endet mein Wissen