Дилдо для антивируса Михаил «Horrific» Фленов Хакер, номер #096, стр. 096-126-3 3. Переменная типа SERVICE_STATUS, через которую мы получим последнее состояние сервиса. При остановке можно встретиться с одной серьезной проблемой. Если есть зависимые работающие сервисы, то остановить требуемый сервис будет невозможно. Необходимо определить зависимости и остановить все сервисы. Но об этом чуть ниже. Использование менеджера Теперь у тебя есть информация, необходимая, для того чтобы написать образец кода, который будет незаметно останавливать все, что мешает твоей программе. В листинге 1 ты можешь увидеть пример кода, останавливающего сервис Messenger. Единственная не рассмотренная мной функция, которая есть в этом примере, – это CloseServiceHandle (аналог CloseHandle). С ее помощью необходимо закрывать открытый нами хэндл сервиса или хэндл менеджера управления сервисами. Ах, чуть не забыл. Все функции работы с сервисами и менеджером описаны в модуле WinSvc.pas, поэтому не забудь прописать его в разделе uses, иначе пример не скомпилируется. Стартуем Обрати внимание, что при рассмотрении функции контроля ControlService я не привел флага, который отвечал бы за запуск сервиса. Нет, я не опустил его из-за ненадобности, просто за запуск отвечает совершенно другая функция - StartService. function StartService( hService: SC_HANDLE; dwNumServiceArgs: DWORD; var lpServiceArgVectors: Pchar ): BOOL; stdcall; Давай глянем на параметры этой функции. 1. Хэндл сервиса, который нужно запустить. 2. Количество передаваемых аргументов. Они передаются в виде строк в третьем параметре функции. 3. Массив из строк аргументов. Каждый элемент массива – это строка, которая заканчивается нулем. Не знаю, отчего в Microsoft запуск сервиса выделили в отдельную функцию и не смогли все реализовать в универсальной ControlService. Мне кажется, что это связано с безопасностью, но когда кажется, нужно креститься. Оставим лишнюю функцию на совести разработчиков, тем более что их совесть выдерживала и не такое :). Со стартом могут быть проблемы. Не каждый может это сделать, особенно если для корректной работы требуется запуск других сервисов. Если результат не нулевой (true), то запуск произошел успешно, а если нулевой (false), то произошла ошибка. Оснастим С помощью функций менеджера управления сервисов ты легко можешь написать собственную оснастку управления сервисами. Конечно, мы ещё не рассмотрели все функции SC-менеджера, потому что их очень много и вместить их в одну статью не реально, а растягивать на несколько - нет смысла. Поэтому, чтобы облегчить твое дальнейшее изучение этой темы, я сделаю краткий обзор функций, которые могут тебя заинтересовать. А дальше уже MSDN тебе в помощь. - QueryServiceStatus – запрашивает информацию о состоянии сервиса. У функции 2 параметра: хэндл сервиса и переменная типа SERVICE_STATUS, куда будет записан результат. - CreateService – создает сервис и добавляет его в базу данных определенного менеджера управления сервисами. Параметров у этой функции много, поэтому сэкономим место. Да и инсталлировать сервисы просто и без этой функции, достаточно только запустить исполняемый файл. |