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.