Сервисы в windows

Тема в разделе "WASM.BEGINNERS", создана пользователем theMUX, 8 мар 2009.

  1. _Sl4yer

    _Sl4yer New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2009
    Сообщения:
    55
    как-как.. сам ведь указал -- "start= system" старт в месте с системой.

    Вот нарыл как захостить свой сервис в свхост
    _http://forum.sysinternals.com/forum_posts.asp?TID=11974&PN=1
    Но блин.. как я только не извращался, у меня код не заработал. Точнее SCM пытается захостить сервис куда надо ( так что в реестре я указал все правильно ), но выдает ошибку "Служба своевременно не ответила на запрос". Вот такие пироги, а на sysinternals у автора темы все заработало.. Уважаемые форумчане, подскажите пожалуйста, как этот код заставить работать..

    Да и Semiono, я сейчас глянул что за зверь такой sc.exe, там можно сервис запустить, так что можно не ждать перезагрузки.
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. BOOL UnInstallService()
    2. {
    3.     printf("Uninstalling service...\n");
    4.     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    5.     if(!hSCManager)
    6.     {
    7.         printf("Can't open Service Control Manager\n");
    8.         return false;
    9.     }
    10.     hService = OpenService(hSCManager,ServiceName, DELETE);
    11.  
    12.     if (hService == NULL)
    13.     {
    14.         printf("Can't open service\n");
    15.         return false;
    16.     }
    17.  
    18.  
    19.     if (! DeleteService(hService) )
    20.         printf("Can't delete service\n");
    21.     else
    22.         printf("Delete Service Success\n");
    23.  
    24.     CloseServiceHandle(hService);
    25.  
    26. }
    27.  
    28.  
    29.  
    30. BOOL InstallService()
    31. {
    32.  
    33.     printf("Installing Service...\n",lpszBinaryPathName);
    34.  
    35.     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    36.     if(!hSCManager)
    37.     {
    38.         printf("Can't open Service Control Manager\n");
    39.         return false;
    40.     }
    41.     hService = CreateService(
    42.     hSCManager, // база данныйх SCManager
    43.     ServiceName, // имя сервиса
    44.     lpszDisplayName, // имя, которое будет показываться
    45.     SERVICE_ALL_ACCESS, // уровень доступа
    46.     SERVICE_WIN32_SHARE_PROCESS  , // сервис будет запускаться
    47.     // в собственном процессе
    48.     SERVICE_AUTO_START   , // будет запускаться "вручную"
    49.     SERVICE_ERROR_NORMAL, // стандартный режим
    50.     // протоколирования ошибок
    51.     lpszBinaryPathName, // путь к сервису
    52.     NULL, // сервис не принадлежит группе
    53.     NULL, // --""--
    54.     NULL, // нет зависимости
    55.     NULL, // С правами системы
    56.     NULL); // без пароля
    57.  
    58.      if(!hService)
    59.      {
    60.             printf("Can't create service\n");
    61.             CloseServiceHandle(hSCManager);
    62.             return false;
    63.      }
    64.      CloseServiceHandle(hService);
    65.      CloseServiceHandle(hSCManager);
    66.      return true;
    67. }
    68. void WINAPI ServiceControl(DWORD dwControlCode)
    69. {
    70.     //анализируем код команды и выполняем ее
    71.     switch(dwControlCode)
    72.     {
    73.     //команда остановки сервиса
    74.  
    75.         case SERVICE_CONTROL_STOP:
    76.             {
    77.             //устанавливаем состояние ожидания остановки
    78.             SetSomeServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
    79.             //устанавливаем сосотояние остановки сервиса
    80.             SetSomeServiceStatus(SERVICE_STOPPED, NO_ERROR, 0);
    81.             ReleaseInterface();
    82.             break;
    83.             }
    84.         //определение текущего состояния сервиса
    85.         case SERVICE_CONTROL_INTERROGATE:
    86.             {
    87.             SetSomeServiceStatus(ss.dwCurrentState, NO_ERROR, 0);
    88.             break;
    89.             }
    90.         default:
    91.         {
    92.             SetSomeServiceStatus(ss.dwCurrentState, NO_ERROR, 0);
    93.             break;
    94.         }
    95.     }
    96. }
    97.  
    98.  
    99. void WINAPI ServiceMain(DWORD argc, LPSTR* argv)
    100. {
    101.    
    102.     ssHandle = RegisterServiceCtrlHandler(ServiceName, ServiceControl);
    103.    
    104.    if(!ssHandle)
    105.    {
    106.        MessageBox(0,"Error registering ServiceControl Function","Error",MB_OK);
    107.        return;
    108.    }
    109.    
    110.     //заполняем структуру, определяющую состояние сервиса:
    111.     //сервис выполняется как отдельный процесс
    112.     ss.dwServiceType = SERVICE_WIN32;
    113.     //устанавливаем состояние ожидания запуска сервиса
    114.     SetSomeServiceStatus(SERVICE_START_PENDING, NO_ERROR, 10);
    115.     //устанавливаем сосотояние работающего сервиса
    116.     SetSomeServiceStatus(SERVICE_RUNNING, NO_ERROR, 0);
    117.     fService=true;
    118.     FilterPackets();
    119.    
    120.     return;
    121. }
    122.  
    123.  
    124. int main(int argc, char* argv[])
    125. {
    126.    
    127.     /*service*/
    128.     SERVICE_TABLE_ENTRY DispatcherTable[] =
    129.     { { ServiceName, //имя сервиса
    130.     (LPSERVICE_MAIN_FUNCTION)ServiceMain }, //главная функция сервиса
    131.     { NULL, NULL }
    132.     };
    133.              
    134.     StartServiceCtrlDispatcher(DispatcherTable);
    135.     /*end of service*/
    136.     if (fService)
    137.     {
    138.         return 0;
    139.     }
    140.     /*MAIN PROGRAMM NEAR*/
    141.    
    142.    
    143. }
    Работает как часы... Ненадо придумывать себе проблемы))
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Запустить то можно (по документации sc), но он не хочет запускаться...
    Сам инсталятор оригинал тоже иногда ребут просит, но трудно что либо понять ибо каждый раз систему переустанавливать тяжко для чистоты эксперимента. Потом проверю при случае что я натворил :)
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Semiono
    описанный мной способ работает, запускается, инсталится, никаких перезагрузок. Всё в 1 файле. работает в нашей локалке у знакомых: xp-vista...
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    punxer, тоесть это может любой сервис запускать который работает как сервис?
    в том числе и мой ElbyCDIO ? тогда я visual studio даже поставлю чтоб сгенерить код :)
    Вообще здаётся мне могут быть какие-то "запароленные" проприетарные сервисы? Или я ошибаюсь?