Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#17
  Alt 16. Jul 2002, 14:58
Moin Mathias,

hilft das weiter?

Code:
unit MAIN;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls,winsvc;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  PENUM_SERVICE_STATUS = ^ENUM_SERVICE_STATUS;
  ENUM_SERVICE_STATUS =
    packed record
      lpServiceName : PChar;
      lpDisplayName : PChar;
      ServiceStatus : SERVICE_STATUS;
    end;

type
  TcsEnumServicesStatus = function(
    const hSCManager        : DWord;               // handle to SCM database
    const dwServiceType     : DWord;               // service type
    const dwServiceState    : DWord;               // service state
    const lpServices        : PENUM_SERVICE_STATUS; // status buffer
    const cbBufSize         : DWord;               // size of status buffer
    const pcbBytesNeeded    : PDWORD;              // buffer size needed
    const lpServicesReturned : PDWord;              // number of entries returned
    const lpResumeHandle    : PDWord               // next entry
    ) : Boolean; stdcall;

  TcsEnumDependentServices = function(
    const hService          : DWord;               // handle to service
    const dwServiceState    : DWord;               // service state
    const lpServices        : PENUM_SERVICE_STATUS; // status buffer
    const cbBufSize         : DWord;               // size of status buffer
    const pcbBytesNeeded    : PDWord;              // buffer size needed
    const lpServicesReturned : PDWord               // number of entries returned
    ) : Boolean; stdcall;

  TcsOpenSCManager = function(
    const lpMachineName  : PChar;
    const lpDatabaseName : PChar;
    const dwDesiredAccess : DWord
    ) : DWord; stdcall;

const
  SERVICE_ACCEPT_STOP                 = $00000001;
  SERVICE_ACCEPT_PAUSE_CONTINUE       = $00000002;
  SERVICE_ACCEPT_SHUTDOWN             = $00000004;
  SERVICE_ACCEPT_PARAMCHANGE          = $00000008;
  SERVICE_ACCEPT_NETBINDCHANGE        = $00000010;
  SERVICE_ACCEPT_HARDWAREPROFILECHANGE = $00000020;
  SERVICE_ACCEPT_POWEREVENT           = $00000040;
  SERVICE_ACCEPT_SESSIONCHANGE        = $00000080;

var
  EnumServicesStatus   : TcsEnumServicesStatus;
  EnumDependentServices : TcsEnumDependentServices;
  OpenSCManager        : TcsOpenSCManager;

var
  Form1: TForm1;

implementation
{$R *.DFM}

var
  hLib   : DWORD;

procedure TForm1.FormCreate(Sender: TObject);

  procedure AddDependentServices(const p_tnRoot : TTreeNode;const p_sServiceName : string;const p_hServiceDB : DWORD);

  var
    hService : DWORD;
    pStatus           : PENUM_SERVICE_STATUS;
    pWork             : PENUM_SERVICE_STATUS;
    cbBufSize         : DWord;
    pcbBytesNeeded    : DWord;
    lpServicesReturned : DWord;
    i                 : integer;
    tnWork            : TTreeNode;

  begin
    hService := OpenService(p_hServiceDB,PChar(p_sServiceName),SERVICE_ENUMERATE_DEPENDENTS);
    if hService <> 0 then
    begin
      try
        cbBufSize := 0;
        pStatus  := nil;
        EnumDependentServices(hService,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned);
        pStatus := AllocMem(pcbBytesNeeded);
        try
          cbBufSize := pcbBytesNeeded;
          EnumDependentServices(hService,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned);
          pWork := pStatus;
          for i := 1 to lpServicesReturned do
          begin
            tnWork := TreeView1.Items.AddChild(p_tnRoot,pWork.lpServiceName);
            AddDependentServices(tnWork,pWork.lpServiceName,p_hServiceDB);
            inc(pWork);
          end;
        finally
          if Assigned(pStatus) then
          begin
            FreeMem(pStatus,pcbBytesNeeded);
          end;
        end;
      finally
        CloseServiceHandle(hService);
      end;
    end;
  end;

var
  hSCDB             : DWord;
  pStatus           : PENUM_SERVICE_STATUS;
  pWork             : PENUM_SERVICE_STATUS;
  cbBufSize         : DWord;
  pcbBytesNeeded    : DWord;
  lpServicesReturned : DWord;
  lpResumeHandle    : DWord;
  i                 : integer;
  tnWork            : TTreeNode;

begin
  TreeView1.Items.Clear;
  hSCDB := OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ);
  if hSCDB <> 0 then
  begin
    try
      cbBufSize     := 0;
      pStatus       := nil;
      lpResumeHandle := 0;
      EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
      lpResumeHandle := 0;
      pStatus  := AllocMem(pcbBytesNeeded);
      try
        cbBufSize := pcbBytesNeeded;
        EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
        pWork := pStatus;
        for i := 1 to lpServicesReturned do
        begin
          tnWork := TreeView1.Items.AddChild(nil,pWork.lpServiceName);
          AddDependentServices(tnWork,pWork.lpServiceName,hSCDB);
          inc(pWork);
        end;
      finally
        if Assigned(pStatus) then
        begin
          FreeMem(pStatus,pcbBytesNeeded);
        end;
      end;
    finally
      CloseServiceHandle(hSCDB);
    end;
  end;
end;

initialization
begin
  hLib := LoadLibrary('ADVAPI32.DLL');
  if hLib <> 0 then
  begin
    @EnumServicesStatus := GetProcAddress(hLib,'EnumServicesStatusA');
    if @EnumServicesStatus = nil then raise Exception.Create('EnumServicesStatusA');
    @EnumDependentServices := GetProcAddress(hLib,'EnumDependentServicesA');
    if @EnumDependentServices = nil then raise Exception.Create('EnumDependentServicesA');
    @OpenSCManager := GetProcAddress(hLib,'OpenSCManagerA');
    if @OpenSCManager = nil then raise Exception.Create('OpenSCManagerA');
  end;
end;

finalization
begin
  if hLib <> 0 then
  begin
    FreeLibrary(hLib);
  end;
end;
end.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat