Ir al contenido



Foto

Enumerando servicios


  • Por favor identifícate para responder
1 respuesta en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.844 mensajes
  • LocationMadrid - España

Escrito 16 diciembre 2016 - 01:13

Como respuesta a una pregunta, escribí un programita en modo consola que permite enumerar todos los servicios instalados en el sistema y más concretamente los drivers cargados en el kernel de windows.
 
El parámetro SERVICE_KERNEL_DRIVER es el que permite a la API EnumServicesStatusEx filtrar los Kernel-drivers pero pueden seleccionarse cualquier tipo de servicio:
 

dwServiceType [in]
The type of services to be enumerated. This parameter can be one or more of the following values.

.......Value................................................Meaning

SERVICE_DRIVER...............................Services of type SERVICE_KERNEL_DRIVER and SERVICE_FILE_SYSTEM_DRIVER.
0x0000000B
SERVICE_FILE_SYSTEM_DRIVER..........File system driver services.
0x00000002
SERVICE_KERNEL_DRIVER..................Driver services.
0x00000001
SERVICE_WIN32...............................Services of type SERVICE_WIN32_OWN_PROCESS and SERVICE_WIN32_SHARE_PROCESS.
0x00000030
SERVICE_WIN32_OWN_PROCESS.......Services that run in their own processes.
0x00000010
SERVICE_WIN32_SHARE_PROCESS.....Services that share a process with one or more other services. For more information, see Service Programs.
0x00000020

 
Está compilado con delphi Berlin:


delphi
  1. program DriverEnum;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8. System.SysUtils,
  9. WinApi.Windows,
  10. WinApi.WinSvc;
  11.  
  12. type
  13. PENUM_SERVICE_STATUS_PROCESS = ^ENUM_SERVICE_STATUS_PROCESS;
  14. PAENUM = ^AENUM;
  15. AENUM = array [0..0] of ENUM_SERVICE_STATUS_PROCESS;
  16.  
  17.  
  18. procedure EnumerateSrvDrv;
  19. var
  20. scManager: Integer;
  21. Status: PAENUM;
  22. pcbBytesNeeded: DWORD;
  23. lpServicesReturned: DWORD;
  24. i: integer;
  25.  
  26. begin;
  27. scManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
  28. if (scManager <> 0) then
  29. begin
  30. pcbBytesNeeded:= 0;
  31. EnumServicesStatusEx(scManager, SC_ENUM_PROCESS_INFO, SERVICE_KERNEL_DRIVER, SERVICE_STATE_ALL, nil, 0, @pcbBytesNeeded, @lpServicesReturned, nil, nil);
  32. GetMem(Status, pcbBytesNeeded);
  33. EnumServicesStatusEx(scManager, SC_ENUM_PROCESS_INFO, SERVICE_KERNEL_DRIVER, SERVICE_STATE_ALL, PBYTE(Status), pcbBytesNeeded, @pcbBytesNeeded, @lpServicesReturned, nil, nil);
  34. for i:= 0 to lpServicesReturned - 1 do
  35. begin
  36. System.Writeln(Status[i].lpServiceName);
  37. System.Writeln(Status[i].lpDisplayName);
  38. case Status[i].ServiceStatus.dwCurrentState of
  39. SERVICE_CONTINUE_PENDING: System.Writeln('About to continue');
  40. SERVICE_PAUSE_PENDING: System.Writeln('Pausing');
  41. SERVICE_PAUSED: System.Writeln('Paused');
  42. SERVICE_RUNNING: System.Writeln('Runing');
  43. SERVICE_START_PENDING: System.Writeln('Starting');
  44. SERVICE_STOP_PENDING: System.Writeln('Stoping');
  45. SERVICE_STOPPED: System.Writeln('Stoped');
  46. end;
  47. System.Writeln('.....................'+#10);
  48. end;
  49. ReadLn;
  50. FreeMem(Status);
  51. CloseServiceHandle(scManager);
  52. end;
  53. end;
  54.  
  55.  
  56. begin
  57. EnumerateSrvDrv;
  58. end.

Espero que sea de utilidad.


Saludos.


  • 3

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.962 mensajes
  • LocationMéxico

Escrito 16 diciembre 2016 - 05:55

Muy interesante amigo, muchas veces queremos ver con algo mas de detalle los procesos que están ejecutandose en nuestras maquinas. (y)

 

Saludos


  • 0