Ars Longa, Vita Brevis

Маленькая программа для отображения полного списка установленных сервисных процессов

Не секрет, что список сервисных процессов (служб), отображаемый Windows (например, при помощи консоли services.msc), является далеко не полным. Когда-то давно меня заинтересовало, как же можно посмотреть, какие службы/драйвера/системные процессы живут в системе.

Самое простое решение — открыть Редактор реестра (regedit) и посмотреть. Список сервисов и не только находится в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Однако по тем данным, которые представлены в реестре, трудно определить, какая из служб работает в данный момент времени, чем она является (напрмер, драйвером ядра или драйвером файловой системы) и т.п.

В Microsoft Windows Recovery Console есть команда, listsvc, позволяющая получить полный список сервисных процессов. Мне стало интересно написать что-то подобное, и вот результат:

[-]
View Code C
  1. /*-------------------------------------------------------------------------*/
  2. #include <windows.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. /*-------------------------------------------------------------------------*/
  7. const char* unknown_error = "<Unknown error!>";
  8. const char* get_error_code(DWORD dwCode)
  9. {
  10.     const char* msgbuf;
  11.     return (!FormatMessage(
  12.                 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
  13.                 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwCode,
  14.                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&msgbuf,
  15.                 0, NULL
  16.              )
  17.            ) ? unknown_error : msgbuf;
  18. }
  19. /*-------------------------------------------------------------------------*/
  20. const char* servicetypes[] = {
  21.     "File System Driver",
  22.     "Kernel Driver",
  23.     "Own Process",
  24.     "Share Process",
  25.     "Unknown"
  26. };
  27. /*-------------------------------------------------------------------------*/
  28. const char* get_service_type(DWORD dwType)
  29. {
  30.     size_t i = 4;
  31.   &