program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, WinApi.Windows, WinApi.WinSvc; type PENUM_SERVICE_STATUS_PROCESS = ^ENUM_SERVICE_STATUS_PROCESS; PAENUM = ^AENUM; AENUM = array [0..0] of ENUM_SERVICE_STATUS_PROCESS; procedure EnumerateSrvDrv; var scManager: Integer; Status: PAENUM; pcbBytesNeeded: DWORD; lpServicesReturned: DWORD; i: integer; begin; scManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE); if (scManager <> 0) then begin pcbBytesNeeded:= 0; EnumServicesStatusEx(scManager, SC_ENUM_PROCESS_INFO, SERVICE_KERNEL_DRIVER, SERVICE_STATE_ALL, nil, 0, @pcbBytesNeeded, @lpServicesReturned, nil, nil); GetMem(Status, pcbBytesNeeded); EnumServicesStatusEx(scManager, SC_ENUM_PROCESS_INFO, SERVICE_KERNEL_DRIVER, SERVICE_STATE_ALL, PBYTE(Status), pcbBytesNeeded, @pcbBytesNeeded, @lpServicesReturned, nil, nil); for i:= 0 to lpServicesReturned - 1 do begin System.Writeln(Status[i].lpServiceName); System.Writeln(Status[i].lpDisplayName); case Status[i].ServiceStatus.dwCurrentState of SERVICE_CONTINUE_PENDING: System.Writeln('About to continue'); SERVICE_PAUSE_PENDING: System.Writeln('Pausing'); SERVICE_PAUSED: System.Writeln('Paused'); SERVICE_RUNNING: System.Writeln('Runing'); SERVICE_START_PENDING: System.Writeln('Starting'); SERVICE_STOP_PENDING: System.Writeln('Stoping'); SERVICE_STOPPED: System.Writeln('Stoped'); end; System.Writeln('.....................'+#10); end; ReadLn; FreeMem(Status); CloseServiceHandle(scManager); end; end; begin EnumerateSrvDrv; end.
Ejemplo de consola realizado con Berlin.
Saludos.