CreateService и сам сервис в одном файле

Тема в разделе "WASM.WIN32", создана пользователем serega28, 3 июн 2009.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Есть у меня сервис и запускалка сервиса находятся в разных exe файла.
    Хочу с сырца сделать всё в одном exe файле.


    Делаю так:


    SERVICE_TABLE_ENTRY servicetable[]=
    {
    {L"ControlService", (LPSERVICE_MAIN_FUNCTION)StartServiceThread},
    {NULL,NULL}
    };

    StartServiceCtrlDispatcher(servicetable);

    InstallService("ControlService")
    StartService("ControlService");

    В итоге когда запускается поток в сервисе, он начинает выполнятся, и сразу выкидает в ошибку иногда сервис вообще находится в состоянии запуска.

    Помогите разобраться в чем тут проблема.
     
  2. villy

    villy New Member

    Публикаций:
    0
    Регистрация:
    3 мар 2008
    Сообщения:
    21
    там все просто, смотри в чужие срц.

    обычно делают так,
    добавляют парам, и когда есть парам стартуют как сервис, без парама стартут как инсталер, и потом через диспатчер стартуют сервис.
     
  3. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    А "не обычно" - проверяют имя программы запустившей сервис.
    Если services.exe - запуск сервиса, иначе конфигурирование.
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Забыл добавить, желательно ещё проверить местонахождение иайденого services.exe
    Если SystemRoot - однозначно запуск сервиса.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если сервис запускается под учеткой SYSTEM (как по дефолту, если не указывать явно), тогда достаточно проверить SeTcbPrivilege.
    Код (Text):
    1. #define RUNNING_IN_SERVICE  1
    2. #define RUNNING_IN_APP      0
    3. #define RUNNING_DETECT_ERROR ((UCHAR)-1)
    4.  
    5. UCHAR InServiceProcess ()
    6. {
    7.     HANDLE hToken;
    8.    
    9.     if (!OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken))
    10.     {
    11.         return RUNNING_DETECT_ERROR;
    12.     }
    13.    
    14.     PRIVILEGE_SET tp;
    15.     tp.PrivilegeCount = 1;
    16.     tp.Privilege[0].Attributes = 0;
    17.     tp.Control = 0;
    18.  
    19.     if (!LookupPrivilegeValue (NULL, SE_TCB_NAME, &tp.Privilege[0].Luid))
    20.     {
    21.         CloseHandle (hToken);
    22.         return RUNNING_DETECT_ERROR;
    23.     }
    24.  
    25.     BOOL Result;
    26.     BOOL Status;
    27.    
    28.     Status = PrivilegeCheck (hToken, &tp, &Result);
    29.     CloseHandle (hToken);
    30.  
    31.     if (!Status)
    32.         return RUNNING_DETECT_ERROR;
    33.  
    34.     return Result;
    35. }
     
  6. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Сделал всё норм работает.

    Теперь другая проблема.
    Когда в поток сервиса добавляю много кода, сам сервис вешается.
    Разве есть какие-то ограничения на время выполнения потока?
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    serega28
    В какой поток? Инициализация?
    Если да - то есть.
    http://www.rsdn.ru/article/baseserv/svcadmin-1.xml
    http://www.rsdn.ru/article/baseserv/svcadmin-2.xml