| unit fMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses
WinSvc;
const
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;
SERVICE_DRIVER = (SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);
SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS);
SERVICE_INTERACTIVE_PROCESS = $00000100;
SERVICE_TYPE_ALL = (SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);
function ServiceGetList(sMachine: string;
dwServiceType, dwServiceState: DWord;
slServicesList: TStrings) : boolean;
const
cnMaxServices = 4096;
type
TSvcA = array [0..cnMaxServices] of TEnumServiceStatus;
PSvcA = ^TSvcA;
var
j: integer;
schm: SC_Handle;
nBytesNeeded,
nServices,
nResumeHandle: DWord;
ssa: PSvcA;
begin
Result := false;
schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ALL_ACCESS);
if (schm>0) then
begin
nResumeHandle := 0;
New(ssa);
EnumServicesStatus(schm, dwServiceType, dwServiceState, ssa^[0],
sizeof(ssa^), nBytesNeeded, nServices,
nResumeHandle);
for j := 0 to nServices-1 do
begin
slServicesList.Add(StrPas(ssa^[j].lpDisplayName));
end;
Result := true;
Dispose(ssa);
CloseServiceHandle(schm);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServiceGetList('', SERVICE_TYPE_ALL, SERVICE_ACTIVE, ListBox1.Items);
ServiceGetList('', SERVICE_TYPE_ALL, SERVICE_INACTIVE, ListBox2.Items);
end;
end. | |