Einzelnen Beitrag anzeigen

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, 17: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 18:25 Uhr)
  Mit Zitat antworten Zitat