Удаление сервиса

Тема в разделе "WASM.NT.KERNEL", создана пользователем SysProger, 5 авг 2008.

  1. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Код (Text):
    1. do
    2. {
    3.     scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    4.     sc_s = CreateService(scm, ServiceName, ServiceName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,  szDriverFile, NULL, NULL, NULL, NULL, NULL);
    5.  
    6. while (sc_s == NULL && GetLastError() == ERROR_SERVICE_EXISTS)
    7. {
    8.     CloseServiceHandle(sc_s);
    9.     CloseServiceHandle(scm);
    10.     sc_s = scm = NULL;
    11.  
    12.     scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    13.     sc_s = OpenService(scm, ServiceName, DELETE);                  
    14.     BOOL k = DeleteService(sc_s);
    15.  
    16.     CloseServiceHandle(sc_s);
    17.     CloseServiceHandle(scm);
    18.     sc_s = scm = NULL;
    19. }
    20.  
    21.     m = StartService(sc_s, NULL, NULL);
    22.  
    23. } while (!m);
    В данном коде после удаления сервиса не могу создать новый. Функция GetLastError() возвращает следующее: "Сервис уже отмечен для удаления". Кто-нибудь сталкивался с такой проблемой?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это фича и бороться с этим бессмысленно.
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Возможно сервис/драйвер ещё не остановлен.
     
  4. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Сервис ещё не удален и присутствует в бд scm.
    На самом деле, функция DeleteService ничего ниоткуда не удаляет. Она только сообщает системе, что это можно сделать, когда наступит благоприятный момент. А он наступит тогда, когда все описатели службы будут закрыты. Т.к. мы все еще держим описатель hService открытым, то удаления не происходит. Если попытаться вызвать DeleteService повторно, то он завершится неудачей, а последующий вызов функции GetLastError вернет ERROR_SERVICE_MARKED_FOR_DELETE. (выдержка из статьи Four-F)
    Скорее всего присутствует описатель не закрытый, возможно от scm (то есть служба ещё запущена). Нужно закрыть все описатели.
     
  5. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Кто-нибудь знает, существует ли возможность ожидания окончания выполнения потока сервиса-драйвера в ring 3?
     
  6. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    может сначало его остановить?
    invoke ControlService, hService, SERVICE_CONTROL_STOP, addr _ss
     
  7. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    с удалением сервиса я проблему решил, читайте выше вопрос про ожидание.
     
  8. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Попробуй получить хэндл службы и заюзать WaitForSingleObject. Не уверен что будет работать. Если не получится можно тоже самое сделать для процесса службы
     
  9. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Что Вы имеете ввиду? Служба ведь запускается как поток 0 кольца. Про какой процесс Вы говорите?
     
  10. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Нед. Есть юзермодные службы (их обычно и называют службами), а есть кернелмодные (драйверы). Для юзермодных точно можно получить хендл процесса, для других не знаю. А что через хендл службы не получается?
     
  11. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Есть ещё сервисы в виде dll, которые живут внутри процессов svchost.exe, причём в одном процессе может быть несколько служб, так что с хэндлом процесса в этом случае решение не прокатит.
     
  12. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Получается.
     
  13. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Теперь возникла проблема с остановкой сервиса.
    Функция StartService не завершается, пока сам сервис не прекратит свою работу. Поэтому останавливать сервис приходится из другого потока. Но вызов функций
    ControlService(sc_s, SERVICE_CONTROL_STOP, NULL);
    ControlService(sc_s, SERVICE_CONTROL_SHUTDOWN, NULL);
    приводит к ошибке "Отказано в доступе".
    Кто знает, как можно остановить сервис из другого потока?
     
  14. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Неправильный сервис значит: When a driver service is started, the StartService function does not return until the device driver has finished initializing. (возврат из функции после завершения инициализации).
    В любом случае, раз отказано в доступе => значит прав недостаточно => твой хэдл не имеет соответствующих прав доступа или, вероятно, ты что-то делаешь неправильно внутри службы. Тебе нужен SERVICE_STOP (смотри msdn)
     
  15. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Всё правильно. Весь код находится в DriverEntry. Пока код не выполнится, функция не завершится.
     
  16. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Неправильно это, заставлять вызывающую программу ждать. Она ведь думает что идет инициализация.. Хотя и не так важно это все