AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dienste und PID?

Ein Thema von Mattze · begonnen am 31. Jul 2015 · letzter Beitrag vom 4. Aug 2015
Antwort Antwort
Seite 2 von 3     12 3   
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#11

AW: Dienste und PID?

  Alt 1. Aug 2015, 14:12
Hallo..

Viele Dienste, gerade Systemdienste werden als Sub-Dienst mit svchost gestartet. Diese Dienste können in deiner Enum zwar einzeln aufgelistet sein, haben aber keine PID, weil nur der Main-Dienst (svchost) eine bekommt.

Somit müsstest Du wohl nach einem anderen Weg suchen, um weitere Infos zu bekommen.

Vielleicht gibs ja eine API hierfür, den Tools wie der ProzessExplorer zeigen ja auch mehr Infos.
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#12

AW: Dienste und PID?

  Alt 1. Aug 2015, 14:55
Hallo,

der process explorer macht das nur für Prozesse. Da ist das "kein Problem". Das kriege ich auch, vielleicht sogar noch mehr - soweit man mit 32Bit im 64er System rumwerkeln kann.

Wie gesagt, das Problem sind die Dienste...

Ich habe gerade im Taskmanager nachgesehen. Tatsächlich!!! Viele Dienste haben auch da keine PID.
Die Dienste, die da eine haben, haben auch bei mir eine.

Also, wenn MS selber da nicht mehr liefert...
Nun ja, schaun mer mal, was man da noch so machen kann...

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

AW: Dienste und PID?

  Alt 1. Aug 2015, 14:59
Wozu brauchst du die PID denn?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: Dienste und PID?

  Alt 1. Aug 2015, 18:40
Ich habe gerade im Taskmanager nachgesehen. Tatsächlich!!! Viele Dienste haben auch da keine PID.
Das sind die Dienste, die zur Zeit nicht laufen EnumServicesEx gibt dir auch eine Liste aller Services. Darunter auch die inaktiven oder deaktivierten. Das musst du filtern, wenn du nur die Laufenden haben willst.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#15

AW: Dienste und PID?

  Alt 1. Aug 2015, 19:06
Hallo,

wozu die PID?
Das ist genau das "Wozu" meiner Anfangsfrage.
Ich möchten rauskriegen, ob der Dienst nun 32- oder 64-Bit-breit ist.
Bei Prozessen nehme mich dazu IsWow64Process. Dazu muss man zuerst mal
OpenProcess machen und dazu braucht man die PID.
Ich wollte nun probieren, ob das bei Diensten vielleicht genauso funktioniert.

Übrigens habe ich eben noch ein Problem gesehen.
Über EnumServicesStatusEx und GetServiceExecutablePath kriegt man den Pfad der Dienste-Datei.
Wie üblich ist der oft %Systemroot%\System32\drivers\[Dienstdatei]. (Z. Bsp. c:\Windows\system32\drivers\cdrom.sys) Unter XP mag das auch noch gestimmt haben.
Unter Win 7 pro stimmt das nicht mehr! (Immer???)
(Z. Bsp.: Die Cdrom.sys liegt in:
C:\Windows\System32\DriverStore\FileRepository\cdr om.inf_amd64_neutral_0b3d0d1942ab684b\cdrom.sys
und
C:\Windows\winsxs\amd64_cdrom.inf_31bf3856ad364e35 _6.1.7601.17514_none_bdcf6151ba66f48b\cdrom.sys)
Also, man kann nicht mal so einfach die Dienste-Datei untersuchen nach 32 oder 64Bit.

Also, ich bin nun erst mal am Ende meiner Ideen angekommen.
Wie kriege ich denn nun die richtige Datei?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Dienste und PID?

  Alt 1. Aug 2015, 19:16
IsWow64Process funktioniert definitiv auch bei Services. Dass du für bestimmte Services keine PID bekommst, liegt wie gesagt daran, dass der entsprechende Service momentan nicht ausgeführt wird.

Musst du denn auch für inaktive Services ermitteln können, ob es sich um einen 32 oder 64 Bit Prozess handelt? Bzw. was genau ist das Problem mit GetServiceExecutablePath? Konnte dir da nicht ganz folgen.

Für laufende Prozesse kannst du den Pfad hiermit bestimmen:
http://www.delphipraxis.net/160046-d...ermitteln.html
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

AW: Dienste und PID?

  Alt 1. Aug 2015, 19:25
Sys Dateien sind ja auch eigentlich Treiber und keine Dienste.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#18

AW: Dienste und PID?

  Alt 1. Aug 2015, 19:33
Hallo,

vielen Dank für die schnelle Antwort. Das mit dem 64Bit-Pfad werde ich probieren.

Müssen muss ich das eigentlich alles nicht, aber wissen möchte ich es doch gern.
Ich möchte soviele Infos wie möglich zu Prozessen und Diensten bekommen.
Einfach aus dem Interesse heraus, was denn alles machbar ist.
Und man kriegt auch ein bisschen Gefühl dafür, wie man mit den API-Funktionen, speziell, wenn man sie selber einbauen muss, umzugehen hat.
Und da das bei Prozessen geht und Du schreibst, dass das IsWow64Process auch bei Diensten klappt, möchte ich das gerne machen...

Wie gesagt, selbst bei beendeten Diensten, die Windows ja noch in der Liste der Dienste angibt, bin ich der Meinung, dass Windows durchaus weiß, ob 32- oder 64Bit.

Ich probiere weiter...

Nun, das mit den sys-Dateien ist schon klar. Nur, das Windows eben wie beschrieben den (falschen) Ort der Cdrom.sys in der Diensteliste angibt zum Dienst Cdrom.
Als Typ sagt Windows sogar: Gerätetreiber. Trotzdem: Diensteliste!!! (EnumSERVICESStatusEx)

Gruß und schönen Abend
Mattze
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#19

AW: Dienste und PID?

  Alt 3. Aug 2015, 09:29
Hallo Zacherl,

im Grunde gießt Du Wasser auf meine Rumreitermühlen.
Du betonst zwar "laufende Prozesse", aber...
Da Windows die Dienste ja auch mal startet, muss es doch auch ohne PID wissen, wo die wirklich sind.
(Bei Prozessen muss Windows ja auch vor dem Start - also auch ohne PID - wissen, wo er sie herholen soll.)
Und, z. Bsp., das will ich eben auch wissen.
Ob das undokumentiert ist?

Übrigens WMI mit W32_SystemServices gibt (im 64er System?) auch den "falschen" Pfad aus!
Für cdrom.sys als auch C:\Windows\system32\drivers.

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#20

AW: Dienste und PID?

  Alt 3. Aug 2015, 18:41
Ja klar, die Prozesspfade hat das System selbstverständlich. Ich werde das gleich selbst mal testen. Bei mir zumindest liegt die cdrom.sys allerdings an genau der genannten Stelle (C:\Windows\system32\drivers\cdrom.sys).

Mein nicht optimierter, auf die Schnelle zusammengeschusterter Testcode:
Delphi-Quellcode:
procedure PrintServicePaths(IncludeDrivers, IncludeInactive: Boolean);
type
  ENUM_SERVICE_STATUSW = record
    lpServiceName: LPWSTR;
    lpDisplayName: LPWSTR;
    ServiceStatus: SERVICE_STATUS_PROCESS;
  end;
  PENUM_SERVICE_STATUSW = ^ENUM_SERVICE_STATUSW;
var
  SvcMgr,
  Svc: SC_HANDLE;
  SvcType,
  SvcState,
  SizeNeeded,
  ServiceCount: DWord;
  Services,
  Service: PENUM_SERVICE_STATUSW;
  I: Integer;
  Config: PQueryServiceConfigW;
begin
  SvcMgr :=
    OpenSCManager(nil, nil, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE);
  if (SvcMgr <> 0) then
  try
    SvcType := SERVICE_WIN32;
    if (IncludeDrivers) then
    begin
      SvcType := SERVICE_WIN32 or SERVICE_DRIVER;
    end;
    SvcState := SERVICE_ACTIVE;
    if (IncludeInactive) then
    begin
      SvcState := SERVICE_STATE_ALL;
    end;
    if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType,
      SvcState, nil, 0, @SizeNeeded, @ServiceCount, nil, nil) then
    begin
      if (GetLastError <> ERROR_MORE_DATA) then
      begin
        RaiseLastOsError;
      end;
    end;
    GetMem(Services, SizeNeeded);
    try
      if not EnumServicesStatusExW(SvcMgr, SC_ENUM_PROCESS_INFO, SvcType,
        SvcState, PByte(Services), SizeNeeded, @SizeNeeded, @ServiceCount,
        nil, nil) then
      begin
        RaiseLastOsError;
      end;
      Service := Services;
      for I := 0 to ServiceCount - 1 do
      begin
        WriteLn(Format('[%4d] %s', [Service^.ServiceStatus.dwProcessId,
          Service^.lpServiceName]));
        Svc :=
          OpenService(SvcMgr, Service^.lpServiceName, SERVICE_QUERY_CONFIG);
        if (Svc <> 0) then
        try
          if not QueryServiceConfig(Svc, nil, 0, SizeNeeded) then
          begin
            if (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
            begin
              RaiseLastOsError;
            end;
          end;
          GetMem(Config, SizeNeeded);
          try
            if not QueryServiceConfig(Svc, Config, SizeNeeded, SizeNeeded) then
            begin
              RaiseLastOsError;
            end;
            WriteLn(' Path: ' + Config^.lpBinaryPathName);
          finally
            FreeMem(Config);
          end;
        finally
          CloseServiceHandle(Svc);
        end else RaiseLastOsError;
        Inc(Service);
      end;
    finally
      FreeMem(Services);
    end;
  finally
    CloseServiceHandle(SvcMgr);
  end else RaiseLastOsError;
end;
Erhalte für laufende Prozess wie erwartet eine PID, für Treiber und inaktive Prozesse 0. Die Pfade habe ich stichprobenartig überprüft und die stimmen auch soweit.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 3. Aug 2015 um 19:25 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz