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

октября 12 2009 by admin in Службы

В Windows есть еще несколько функций управления службами. Чтобы наше обсуждение было полным, я кратко их опишу.
Одна из функций определяет отображаемое имя функции по ее внутреннему имени.
Модульный компонент Services применяет эту функцию для заполнения списка установленных служб. Первый ее параметр, hSCManager, идентифицирует SCM, чьи службы будут перечисляться, второй — InfoLevel — нужно установить в SC_ENUM_INFO, это укажет функции, что вы хотите получить название и состояние каждой службы. В данный момент других значений для InfoLevel нет.
Третий параметр, dwServiceType, указывает, что будет перечислено: службы или драйверы устройств; для служб передайте в него SERVICE_WIN32. Четвертый — divServiceState — позволяет точнее настроить запрос. В него можно передавать значения SERVICE_ACTIVE, SERVICEJNACTIVE или SERVICE_STATE_ALL, что приведет к перечислению запущенных служб, остановленных или и тех и других. Последний параметр, pszGroupName, позволяет еще точнее указать набор возвращаемых служб или драйверов устройств. Если он идентифицирует группу, то будут перечислены только входящие в нее службы. Если же в него помещена пустая строка (""), будут перечислены службы, не входящие ни в одну группу. И, наконец, если pszGroupName равен NULL, будут перечислены все службы.
Связанные с каждой службой строковые данные копируются в конец буфера. Структуры ENUM_SERVICE_STATUS_ PROCESS, размер которых фиксирован, расположены друг за другом с самого начала буфера, поэтому переход от одной структуры к другой не составляет труда. По завершении работы функции переменная типа DWORD, на которую указывает pdivServicesReturned, содержит число уместившихся в буфер структур ENUM_SERVICE_STATUS_ PROCESS.
Вызывая функцию EnumSerticesStatusEx в первый раз, убедитесь, что переменная типа DWORD, на которую указывает параметрpdwResumeHandle, инициализирована нулем. Этот параметр используется, если в буфер уместились не все данные. Если буфер мал, EnwnSei-vicesSlatusEx помещает в эту переменную специальное значение, применяемое при следующем вызове функции и указывающее службу, с которой нужно продолжить перечисление. Приведенный ниже код показывает, как выделить буфер, вмещающий нужные данные и не требующий повторных вызовов EnumSeruicesStatusEx.