Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Dienste und PID? (https://www.delphipraxis.net/186073-dienste-und-pid.html)

HolgerX 1. Aug 2015 13:12

AW: Dienste und PID?
 
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.

Mattze 1. Aug 2015 13:55

AW: Dienste und PID?
 
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

Luckie 1. Aug 2015 13:59

AW: Dienste und PID?
 
Wozu brauchst du die PID denn?

Zacherl 1. Aug 2015 17:40

AW: Dienste und PID?
 
Zitat:

Zitat von Mattze (Beitrag 1310601)
Ich habe gerade im Taskmanager nachgesehen. Tatsächlich!!! Viele Dienste haben auch da keine PID.

Das sind die Dienste, die zur Zeit nicht laufen :D 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.

Mattze 1. Aug 2015 18:06

AW: Dienste und PID?
 
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

Zacherl 1. Aug 2015 18:16

AW: Dienste und PID?
 
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

Luckie 1. Aug 2015 18:25

AW: Dienste und PID?
 
Sys Dateien sind ja auch eigentlich Treiber und keine Dienste.

Mattze 1. Aug 2015 18:33

AW: Dienste und PID?
 
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

Mattze 3. Aug 2015 08:29

AW: Dienste und PID?
 
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

Zacherl 3. Aug 2015 17:41

AW: Dienste und PID?
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 2 von 3     12 3      

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