SCM и удаление сервиса

Тема в разделе "WASM.NT.KERNEL", создана пользователем Rito, 15 янв 2009.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    При попытке выгрузить сервис, он выгружается, но только после того как закроется программа.

    Код (Text):
    1.     invoke  OpenService,hSCManager, OFFSET"servicename", DELETE
    2.  
    3.     mov hService,eax
    4.        
    5.     .IF eax != 0
    6.         invoke  SendMessage, hListBox_ResultWork, LB_ADDSTRING, NULL, "Сервис успешно открыт"
    7.  
    8.             invoke  DeleteService,hService
    9.  
    10.         .IF eax != 0
    11.             invoke  SendMessage, hListBox_ResultWork, LB_ADDSTRING, NULL, OFFSET "Сервис успешно удалён"
    12.         .ENDIF
    13.  
    14.         invoke   CloseServiceHandle,hService
    15.  
    16.         invoke   CloseServiceHandle,hSCManager
    17.     .ELSE
    18.         invoke  SendMessage, hListBox_ResultWork, LB_ADDSTRING, NULL, OFFSET"Сервиса не существует"
    19.     .ENDIF
    Т.е. сервис удаляется только после того как процесс моей программы будет завершён. Это так и должно быть?
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
  3. smileyoufake

    smileyoufake New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    16
    Прошу прощения но вроде как он должен убиваться после того как будут закрыты все открытые хэндлы на него указывающие.Те delete помечает его для удаления(можно попытаться снова обратиться к нему и посмотреть GetLastError : выдаст что помечен для уничтожения) а вот после CloseHandleService(hscService) должен умирать.
    Ну он вроде как должен быть еще остановлен рпи вызове delete...хм
     
  4. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Фактом остаётся то, что он почему то удаляется только после завершения процесса. В MSDN тоже нет намёка на завершение процесса, но ...

    Я не запускал сервис, просто регистрировал и удалял.
     
  5. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Вы все абсолютно правы. Но реальность такова, что он умирает только после закрытия процесса. :-( И нам придется с этим смириться.
     
  6. smileyoufake

    smileyoufake New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    16
    Хм.под умирает вы понимаете удаление данных из реестра (../CurrentControlSet/Services/), базы данных SCM и возвращение из функций без ошибок? Если да, то фигня получается. У меня вся инфа о сервисе удаляется(в описанном выше смысле) после CloseServiceHandle().

    Может у вас SCM не имеет прав на удаление? Попробуйте влоб флаги SERVICE_ALL_ACCESS и в OpenSCManager и в OpenService.
    Может GetLastError после DeleteService и после CloseServiceHandle что полезное подскажет?