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:
program DriverEnum; {$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.
Espero que sea de utilidad.
Saludos.