Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Как написать сервис

 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 224 из 1083 +246 277
 
  От   : Kim Vladimir                        2:5020/400      11 Сен 02  21:31:43
 
  Кому : All                                                 11 Сен 02  22:21:24
 
  Тема : Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: Kim Vladimir <vkim@taiso.ru>
 
 
 
 Добрый день,
 
 
 
    Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
 
    сервисы под Builder и что это есть за сущность?
 
 
 
    Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
 
    пользователей, моей программы (TimeGuard), что ее желательно
 
    оформить как сервис... А вот как подобную штуку сделать, до сих пор
 
    так нигде и не нашел :(
 
 
 
    Hа Вас уповаю и заранее благодарен!
 
 
 
 С уважением, Владимир Ким (vkim@taiso.ru)
 
 http://nedrosom.taiso.ru
 
 
 
 
 
 
 
 
 
 --
 
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 
 --- ifmail v.2.15dev5
 
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 246 из 1083 -224 *277
 
  От   : Andy Malyshev                       2:5020/362.55   12 Сен 02  01:08:47
 
  Кому : Kim Vladimir                                        12 Сен 02  15:02:14
 
  Тема : Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 Привет Kim!
 
 
 
 11 Sep 02 21:31, you wrote to All:
 
 
 
  KV>    Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
 
  KV>    сервисы под Builder и что это есть за сущность?
 
 
 
  "Сервисы под Билдер" это что-то новое. Hо как я понял, речь идет об HТ/2000/XP
 
 сервисах. Тогда читать вот здесь:
 
 
 
 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/s
 
 ervices.as p
 
 
 
 
 
 WBR, Andy.
 
 Homepage: http://andy.malyshev.name, E-Mail: mail@andy.malyshev.name
 
 
 
 ---
 
  * Origin: Саид, а ты как здесь ? Стреляли.... (2:5020/362.55)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 277 из 1083 -224 +282
 
  От   : Alexey Wolchansky                   2:5020/400      13 Сен 02  19:56:37
 
  Кому : Kim Vladimir                                        13 Сен 02  20:46:40
 
  Тема : Re: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Alexey Wolchansky" <wolchans@mail.spbnit.ru>
 
 
 
 >    Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
 
 >    сервисы под Builder и что это есть за сущность?
 
 
 
 
 
 Сервисы- это вид программ под NT/W2000/XP. Hе имеют окна и простейшем виде
 
 не интерактивны, хотя можно писать ин-е сервисы. Могут стартовать на
 
 нескольких уровнях загрузки ОС.
 
 
 
 >    Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
 
 >    пользователей, моей программы (TimeGuard), что ее желательно
 
 >    оформить как сервис... А вот как подобную штуку сделать, до сих пор
 
 >    так нигде и не нашел :(
 
 
 
 Если писать на API, то структура сервиса отличается от обычного приложения.
 
 В Билдере есть готовая болванка File->New->Service Application. Сервис
 
 получается неприлично большим, зато думать не надо и быстро.
 
 
 
 С наилучшими
 
 Алексей
 
 
 
 
 
 --- ifmail v.2.15dev5
 
  * Origin: Demos online service (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 282 из 1083 -277 +336 360
 
  От   : Kim Vladimir                        2:5020/400      13 Сен 02  23:20:16
 
  Кому : Alexey Wolchansky                                   14 Сен 02  13:20:57
 
  Тема : Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: Kim Vladimir <vkim@taiso.ru>
 
 
 
 Добрый день Алексей,
 
 
 
 AW> Сервисы- это вид программ под NT/W2000/XP. Hе имеют окна и простейшем виде
 
 AW> не интерактивны, хотя можно писать ин-е сервисы. Могут стартовать на
 
 AW> нескольких уровнях загрузки ОС.
 
 
 
 Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание сервиса
 
 отличается от принципов написания обычного приложения и если да, то в
 
 каких основных аспектах или моментах?
 
 
 
 >>    Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
 
 >>    пользователей, моей программы (TimeGuard), что ее желательно
 
 >>    оформить как сервис... А вот как подобную штуку сделать, до сих пор
 
 >>    так нигде и не нашел :(
 
 
 
 AW> Если писать на API, то структура сервиса отличается от обычного приложения.
 
 AW> В Билдере есть готовая болванка File->New->Service Application. Сервис
 
 AW> получается неприлично большим, зато думать не надо и быстро.
 
 
 
 Скажите, а существуют ли вообще ресурсы, где можно было бы почерпнуть
 
 более глубокие знания о том как писать сервисы под Builder? Конечно
 
 очень желательно на русском :), но не обязательно...
 
 
 
 Еще раз спасибо!
 
 С уважением, Владимир Ким (vkim@taiso.ru)
 
 http://nedrosom.taiso.ru
 
 
 
 
 
 
 
 
 
 --
 
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 
 --- ifmail v.2.15dev5
 
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 336 из 1083 -282 +359 *360
 
  От   : Anton Batenev                       2:5020/400      16 Сен 02  10:19:34
 
  Кому : Kim Vladimir                                        16 Сен 02  13:15:02
 
  Тема : Re: Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Anton Batenev" <abbat@ngts.kuzbass.net>
 
 
 
 
 
 > Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание
 
 
 
 сервиса
 
 
 
 > отличается от принципов написания обычного приложения и если да, то
 
 
 
 в
 
 
 
 > каких основных аспектах или моментах?
 
 
 
 Hет, не сильно. Сервис - обыкновенное приложение, только с двумя
 
 рабочими потоками.
 
 
 
 > Скажите, а существуют ли вообще ресурсы, где можно было бы
 
 
 
 почерпнуть
 
 
 
 > более глубокие знания о том как писать сервисы под Builder? Конечно
 
 > очень желательно на русском :), но не обязательно...
 
 
 
 http://www.piter.com - Там ищи книгу "Программирование серверных
 
 приложений для Windows 2000"
 
 
 
 
 
 
 
 --- ifmail v.2.15dev5
 
  * Origin: NGTS, OTE (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 359 из 1083 -336
 
  От   : Kim Vladimir                        2:5020/400      16 Сен 02  21:25:47
 
  Кому : Anton Batenev                                       16 Сен 02  22:45:35
 
  Тема : Re[4]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: Kim Vladimir <vkim@taiso.ru>
 
 
 
 Добрый день(ночи) Антон,
 
 
 
 
 
 >> Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание
 
 AB> сервиса
 
 >> отличается от принципов написания обычного приложения и если да, то
 
 AB> в
 
 >> каких основных аспектах или моментах?
 
 
 
 AB> Hет, не сильно. Сервис - обыкновенное приложение, только с двумя
 
 AB> рабочими потоками.
 
 
 
 Да, действительно, немного по разбиравшись с этим вопросом методом
 
 научного тыка, оказалось действительно не очень сложно...
 
 
 
 Только вот возник у меня вопрос - нужно хранить настройки работы для
 
 программы, а вот в каком месте реестра это принято делать для сервисов
 
 даже не могу представить. Дело в том, что, как я понял, сервис
 
 загружается еще до logon системы и пользоваться
 
 HKEY_CURRENT_USER\SOFTWARE не совсем уместно... Более того, очень
 
 желательно, что-бы изменить эти настройки было невозможно (в regedit),
 
 во всяком случае пользователю без прав администратора...
 
 
 
 >> Скажите, а существуют ли вообще ресурсы, где можно было бы
 
 AB> почерпнуть
 
 >> более глубокие знания о том как писать сервисы под Builder? Конечно
 
 >> очень желательно на русском :), но не обязательно...
 
 
 
 AB> http://www.piter.com - Там ищи книгу "Программирование серверных
 
 AB> приложений для Windows 2000"
 
 
 
 Большое спасибо! Как появятся деньги обязательно приобрету!
 
 
 
 С уважением, Владимир Ким (vkim@taiso.ru)
 
 http://nedrosom.taiso.ru
 
 
 
 
 
 
 
 
 
 --
 
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 
 --- ifmail v.2.15dev5
 
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 360 из 1083 -282 +386
 
  От   : Alexey Wolchansky                   2:5020/400      17 Сен 02  00:14:39
 
  Кому : Kim Vladimir                                        17 Сен 02  15:36:55
 
  Тема : Re: Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Alexey Wolchansky" <wolchans@svs.ru>
 
 
 
 
 
 Привет!
 
 
 
 > Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание
 
 
 
 сервиса
 
 
 
 > отличается от принципов написания обычного приложения и если да, то в
 
 > каких основных аспектах или моментах?
 
 
 
 Hе будем путать глупость и незнание, ибо второе со временем проходит :)
 
 Отличается несильно, так-же бьешь по клаве руками, смотришь глазами. Или
 
 есть варианты?
 
 
 
 Повторюсь, если использовать болванку из ВСВ, то разница только в более
 
 геморройной отладке, необходимо запустить сервис и за 30 сек. успеть к нему
 
 приаттачится. Дело тренировки :)
 
 То есть сервис из под IDE кнопкой RUN запускать нельзя.
 
 Если писать с нуля на API, разница существенна. Хотя и тут есть скелеты
 
 сервисов, например в MSDN.
 
 Плюс в уменьшении размера на 450 Кб.
 
 
 
 > Скажите, а существуют ли вообще ресурсы, где можно было бы почерпнуть
 
 > более глубокие знания о том как писать сервисы под Builder? Конечно
 
 > очень желательно на русском :), но не обязательно...
 
 
 
 www.rsdn.ru - статьи Александра Федорова, Сергея Холодилова - очень
 
 рекомендую
 
 http://delphi.xonix.ru/faq - "Сервисы - общие сведения"
 
 http://delphi.mastak.ru - "Сервисы (службы) в Delphi на чистом API"
 
 Есть книга Фролова (на работе, названия точно не вспомню), там вообще
 
 разжевано, как писать на API.
 
 
 
 С наилучшими
 
 Алексей Волчанский
 
 
 
 
 
 --- ifmail v.2.15dev5
 
  * Origin: Sovintel (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 386 из 1083 -360 +481
 
  От   : Vlad Foltz                          2:5030/1015     17 Сен 02  21:10:22
 
  Кому : Wolchans@svs.Ru                                     18 Сен 02  15:34:48
 
  Тема : Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
     Пpивет, Alexey !
 
 
 
 Вт Сен 17 2002 00:14 по московскомy вpемени
 
 Alexey Wolchansky написал к Kim Vladimir:
 
 
 
  AW> Повторюсь, если использовать болванку из ВСВ, то разница только в
 
  AW> более геморройной отладке, необходимо запустить сервис и за 30 сек.
 
  AW> успеть к нему приаттачится.
 
 
 
 Хм. А что будет через 30 секунд?
 
 
 
  AW> Дело тренировки :) То есть сервис из под IDE кнопкой RUN запускать
 
  AW> нельзя.
 
 
 
 Достаточно (хотя бы для отладки) оставить возможность стартовать не как сервис.
 
 
 
  AW> Если писать с нуля на API, разница существенна.
 
 
 
 Даже страшно подумать, что же они там в эту болванку запихали? :)
 
 
 
 Hу пока, Alexey.
 
 
 
 vladislav_foltz@mail.ru
 
 --- GoldEd snapshot-2001.03.04.
 
  * Origin: ########[OO]-[OO]-[OO]-[|+|+|>######### (2:5030/1015)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 481 из 1083 -386 +515
 
  От   : Anton Batenev                       2:5020/400      19 Сен 02  07:02:56
 
  Кому : All                                                 23 Сен 02  20:09:18
 
  Тема : Re: Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Anton Batenev" <abbat@ngts.kuzbass.net>
 
 
 
 
 
 >  AW> Если писать с нуля на API, разница существенна.
 
 > Даже страшно подумать, что же они там в эту болванку запихали? :)
 
 
 
 Да ничего страшного!!!! Там все проще пареной репы!!! Кому надобно -
 
 могу выслать примерчик (только на VC++, но там без разницы), EXE
 
 которого занимает 11Kb!!! - Все написано на чистом WIN API.
 
 
 
 
 
 
 
 --- ifmail v.2.15dev5
 
  * Origin: NGTS, OTE (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 515 из 1083 -481 +533
 
  От   : Andrey Belyakov                     2:5020/400      23 Сен 02  20:45:01
 
  Кому : Anton Batenev                                       23 Сен 02  21:14:33
 
  Тема : Re: Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Andrey Belyakov" <andrejb@netmail.lv>
 
 
 
 > >  AW> Если писать с нуля на API, разница существенна.
 
 > > Даже страшно подумать, что же они там в эту болванку запихали? :)
 
 >
 
 > Да ничего страшного!!!! Там все проще пареной репы!!! Кому надобно -
 
 > могу выслать примерчик (только на VC++, но там без разницы), EXE
 
 > которого занимает 11Kb!!! - Все написано на чистом WIN API.
 
 
 
 Будет интересно поглядеть. Хммм... У тебя примера с контролем на
 
 остановку нет? Интересует запрет на остановку.
 
 
 
 Андрей.
 
 
 
 
 
 --
 
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 
 --- ifmail v.2.15dev5
 
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 
 
 - Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 
  Сооб : 533 из 1083 -515
 
  От   : Anton Batenev                       2:5020/400      24 Сен 02  05:59:33
 
  Кому : Andrey Belyakov                                     24 Сен 02  10:34:51
 
  Тема : Re: Re[2]: Как писать сервис?
 
 -------------------------------------------------------------------------------
 
 From: "Anton Batenev" <abbat@ngts.kuzbass.net>
 
 
 
 
 
 > > Да ничего страшного!!!! Там все проще пареной репы!!! Кому
 
 
 
 надобно -
 
 
 
 > > могу выслать примерчик (только на VC++, но там без разницы), EXE
 
 > > которого занимает 11Kb!!! - Все написано на чистом WIN API.
 
 > Будет интересно поглядеть. Хммм... У тебя примера с контролем на
 
 > остановку нет? Интересует запрет на остановку.
 
 
 
 Есть. Смотри код. Лишний код вырезан, однако общий смысл будет
 
 понятен.
 
 
 
 #include "stdafx.h"
 
 //--------------------------------------------------------------------
 
 -------
 
 extern "C" typedef BOOL (__stdcall* ChangeServiceConfigPtr)
 
 (
 
   SC_HANDLE hService,         // handle to service
 
   DWORD dwServiceType,        // type of service
 
   DWORD dwStartType,          // when to start service
 
   DWORD dwErrorControl,       // severity if service fails to start
 
   LPCTSTR lpBinaryPathName,   // pointer to service binary file name
 
   LPCTSTR lpLoadOrderGroup,   // pointer to load ordering group name
 
   LPDWORD lpdwTagId,          // pointer to variable to get tag
 
 identifier
 
   LPCTSTR lpDependencies,     // pointer to array of dependency names
 
   LPCTSTR lpServiceStartName, // pointer to account name of service
 
   LPCTSTR lpPassword,         // pointer to password for service
 
 account
 
   LPCTSTR lpDisplayName       // pointer to display name
 
 );
 
 //--------------------------------------------------------------------
 
 -------
 
 VOID WINAPI SNTPMain     (DWORD dwArgc, LPTSTR* lpszArgv);
 
 VOID WINAPI SNTPHandler  (DWORD fdwControl);
 
 int  WINAPI RunAsApplication (void);
 
 void WINAPI InstallService   (void);
 
 void WINAPI UnInstallService (void);
 
 bool WINAPI CheckVersion     (void);
 
 //--------------------------------------------------------------------
 
 -------
 
 SERVICE_STATUS_HANDLE hSS     = 0;
 
 CRITICAL_SECTION      SNTPCS;
 
 SERVICE_STATUS        SS;
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 void WINAPI LockServiceStatus (void)
 
 {
 
     EnterCriticalSection(&SNTPCS);
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 void WINAPI UnlockSNTPObject (void)
 
 {
 
     LeaveCriticalSection(&SNTPCS);
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 #define UnlockServiceStatus() UnlockSNTPObject()
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 char* WINAPI FindOneOf (char* p1, char* p2)
 
 {
 
     while (p1!=0 && *p1!=0)
 
     {
 
         char* p = p2;
 
         while (p!=0 && *p!=0)
 
         {
 
             if (*p1==*p)
 
                 return CharNext(p1);
 
             p = CharNext(p);
 
         }
 
         p1 = CharNext(p1);
 
     }
 
     return 0;
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 SERVICE_TABLE_ENTRY ServiceTable[] = {
 
     {"SNTP Time Service", SNTPMain},
 
     {0, 0}
 
 };
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 int APIENTRY CRTWinMain (HINSTANCE, HINSTANCE, LPSTR, int)
 
 {
 
     char* cmdline = GetCommandLine();
 
     char tokens[] = "-/";
 
     char* token = FindOneOf(cmdline, tokens);
 
 
 
     if (token!=0)
 
     {
 
         if (lstrcmpi(token, "install")==0)
 
         {
 
             InstallService();
 
             return 0;
 
         }
 
         else if (lstrcmpi(token, "remove")==0)
 
         {
 
             UnInstallService();
 
             return 0;
 
         }
 
         else if (lstrcmpi(token, "service")==0)
 
         {
 
             InitializeCriticalSection(&SNTPCS);
 
             if (CheckVersion())
 
             {
 
                 if (StartServiceCtrlDispatcher(ServiceTable)==0)
 
                 WriteLog("Failed to start service dispatcher");
 
             }
 
             DeleteCriticalSection(&SNTPCS);
 
         }
 
         else if (lstrcmpi(token, "application")==0)
 
             return RunAsApplication();
 
     }
 
     else
 
         MessageBox(0, "sntp.exe [/install | /remove | /service |
 
 /application]", "Parameters", MB_OK);
 
 
 
     return 0;
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 VOID WINAPI SNTPHandler (DWORD fdwControl)
 
 {
 
     switch (fdwControl)
 
     {
 
         case SERVICE_CONTROL_SHUTDOWN:
 
         case SERVICE_CONTROL_STOP:
 
         {
 
             LockServiceStatus();
 
             if (SS.dwCurrentState==SERVICE_RUNNING)
 
             {
 
                 SS.dwCheckPoint = 1;
 
                 SS.dwCurrentState = SERVICE_STOP_PENDING;
 
             }
 
             else if (SS.dwCurrentState!=SERVICE_STOPPED)
 
                 SS.dwCheckPoint++;
 
             SS.dwWaitHint   = 5000;
 
             SetServiceStatus(hSS, &SS);
 
             UnlockServiceStatus();
 
             break;
 
         }
 
         case SERVICE_CONTROL_INTERROGATE:
 
         {
 
             LockServiceStatus();
 
             if (SS.dwCurrentState!=SERVICE_RUNNING &&
 
 SS.dwCurrentState!=SERVICE_STOPPED)
 
                 SS.dwCheckPoint++;
 
             SS.dwWaitHint = 5000;
 
             SetServiceStatus(hSS, &SS);
 
             UnlockServiceStatus();
 
             break;
 
         }
 
     }
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 VOID WINAPI SNTPMain (DWORD dwArgc, LPTSTR* lpszArgv)
 
 {
 
     LockServiceStatus();
 
     if ((hSS=RegisterServiceCtrlHandler(ServiceTable[0].lpServiceName,
 
 SNTPHandler))==0)
 
     {
 
         UnlockServiceStatus();
 
         return;
 
     }
 
 
 
     SS.dwServiceType      = SERVICE_WIN32_OWN_PROCESS;
 
     SS.dwCurrentState     = SERVICE_START_PENDING;
 
 
 
     // устанавливаем что может сервис (стоп/пауза итд)
 
     SS.dwControlsAccepted = SERVICE_ACCEPT_STOP |
 
 SERVICE_ACCEPT_SHUTDOWN;
 
     SS.dwWin32ExitCode    = NO_ERROR;
 
     SS.dwServiceSpecificExitCode = 0;
 
     SS.dwCheckPoint       = 1;
 
     SS.dwWaitHint         = 5000;
 
     SetServiceStatus(hSS, &SS);
 
     UnlockServiceStatus();
 
 
 
     // ...
 
     // инициализируем все необходимые для работы объекты
 
     // ...
 
 
 
     LockServiceStatus();
 
     SS.dwCurrentState = SERVICE_RUNNING;
 
     SS.dwWaitHint     = 30000;
 
     SS.dwCheckPoint   = 0;
 
     UnlockServiceStatus();
 
 
 
     while (true)
 
     {
 
         LockServiceStatus();
 
         if (SS.dwCurrentState!=SERVICE_RUNNING)
 
         {
 
             SS.dwWaitHint = 10000;
 
             SS.dwCheckPoint++;
 
         }
 
         SetServiceStatus(hSS, &SS);
 
         UnlockServiceStatus();
 
 
 
         // ...
 
         // выполняем что-то (собственно рабочий цикл сервиса)
 
         // ...
 
 
 
         LockServiceStatus();
 
         if (SS.dwCurrentState==SERVICE_RUNNING)
 
         SS.dwWaitHint = 30000;
 
         SetServiceStatus(hSS, &SS);
 
         UnlockServiceStatus();
 
 
 
         Sleep(0);
 
 
 
     }
 
 
 
     LockServiceStatus();
 
     SS.dwCurrentState  = SERVICE_STOPPED;
 
     SS.dwCheckPoint    = 0;
 
     SS.dwWin32ExitCode = NO_ERROR;
 
     SetServiceStatus(hSS, &SS);
 
     UnlockServiceStatus();
 
     return;
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 int WINAPI RunAsApplication (void)
 
 {
 
     // запускаем как приложение
 
     return 0;
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 void WINAPI InstallService (void)
 
 {
 
     if (!CheckVersion())
 
         return;
 
     SC_HANDLE hSCM = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
 
     if (hSCM==0)
 
     {
 
         MessageBox(0, "Failed to open SCM", "Error", MB_OK |
 
 MB_ICONERROR);
 
         return;
 
     }
 
     char MN[MAX_PATH+20];
 
     ZeroMemory(MN, MAX_PATH+20);
 
     MN[0] = '"';
 
     GetModuleFileName(0, &MN[1], MAX_PATH);
 
     lstrcat(MN, "\" /service");
 
     SC_HANDLE hSrv = CreateService(hSCM, "SNTP Server",
 
 ServiceTable[0].lpServiceName, SERVICE_CHANGE_CONFIG,
 
 SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
 
 MN, 0, 0, 0, 0, 0);
 
     if (hSrv==0)
 
     {
 
         MessageBox(0, "Service already installed", "Information",
 
 MB_OK | MB_ICONINFORMATION);
 
         CloseServiceHandle(hSCM);
 
         return;
 
     }
 
 
 
     HINSTANCE H = LoadLibrary("advapi32.dll");
 
     if (H!=0)
 
     {
 
         ChangeServiceConfigPtr ChangeServiceConfigEx =
 
 (ChangeServiceConfigPtr)GetProcAddress(H, "ChangeServiceConfigA");
 
         if (ChangeServiceConfigEx!=0)
 
         {
 
             if ((*ChangeServiceConfigEx)(hSrv,
 
 SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
 
 MN, 0, 0, 0, 0, 0, "SNTP Server")==0)
 
                 MessageBox(0, "Failed to change server config",
 
 "Error", MB_OK | MB_ICONERROR);
 
         }
 
         else
 
             MessageBox(0, "ChangeServiceConfigA not found", "Error",
 
 MB_OK | MB_ICONERROR);
 
         FreeLibrary(H);
 
     }
 
 
 
     CloseServiceHandle(hSrv);
 
     CloseServiceHandle(hSCM);
 
     MessageBox(0, "Service installed successful", "Success", MB_OK |
 
 MB_ICONINFORMATION);
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 void WINAPI UnInstallService (void)
 
 {
 
     if (!CheckVersion())
 
         return;
 
     SC_HANDLE hSCM = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
 
     if (hSCM==0)
 
     {
 
         MessageBox(0, "Failed to open SCM", "Error", MB_OK |
 
 MB_ICONERROR);
 
         return;
 
     }
 
     SC_HANDLE hSrv = OpenService(hSCM, "SNTP Server", DELETE);
 
     if (hSrv==0)
 
     {
 
         MessageBox(0, "Service already removed", "Information", MB_OK
 
 | MB_ICONINFORMATION);
 
         CloseServiceHandle(hSCM);
 
         return;
 
     }
 
     if (DeleteService(hSrv)==0)
 
     {
 
         MessageBox(0, "Failed to delete service", "Error", MB_OK |
 
 MB_ICONERROR);
 
         CloseServiceHandle(hSrv);
 
         CloseServiceHandle(hSCM);
 
         return;
 
     }
 
 
 
     CloseServiceHandle(hSrv);
 
     CloseServiceHandle(hSCM);
 
     MessageBox(0, "Service removed successful", "Success", MB_OK |
 
 MB_ICONINFORMATION);
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 bool WINAPI CheckVersion (void)
 
 {
 
     OSVERSIONINFO OVI;
 
     OVI.dwOSVersionInfoSize = sizeof(OVI);
 
     if (GetVersionEx(&OVI)==0)
 
     {
 
         MessageBox(0, "Unknown error", "Error", MB_OK | MB_ICONERROR);
 
         return false;
 
     }
 
     if (OVI.dwPlatformId!=VER_PLATFORM_WIN32_NT)
 
     {
 
         MessageBox(0, "Windows NT 4.0 or higher required", "Error",
 
 MB_OK | MB_ICONERROR);
 
         return false;
 
     }
 
     return true;
 
 }
 
 //--------------------------------------------------------------------
 
 -------
 
 
 
 
 
 
 
 --- ifmail v.2.15dev5
 
  * Origin: NGTS, OTE (2:5020/400)
 
 
 
 


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS