Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 107

Автор ДТонсон Π₯Π°Ρ€Ρ‚

lpBinaryPathName β€” имя исполняСмого Ρ„Π°ΠΉΠ»Π° слуТбы; ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .exe Π½Π΅ трСбуСтся.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для указания ΠΈΠΌΠ΅Π½ΠΈ ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи ΠΈ пароля, Π³Ρ€ΡƒΠΏΠΏ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΡ… нСсколько слуТб, Π° Ρ‚Π°ΠΊΠΆΠ΅ зависимостСй, Ссли сущСствуСт нСсколько ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… слуТб.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ слуТбы ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ChangeServiceConfig ΠΈΠ»ΠΈ, Π² случаС NT5, ChangeService-Config2. Π‘Π»ΡƒΠΆΠ±Π° идСнтифицируСтся ΠΏΠΎ своСму дСскриптору, ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ значСния. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² dwServiceType ΠΈΠ»ΠΈ dwStartType, Π½ΠΎ Π² случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° dwAccess это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Доступна Ρ‚Π°ΠΊΠΆΠ΅ функция OpenService, которая позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ дСскриптор ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ слуТбы. Для удалСния слуТбы ΠΈΠ· рССстра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция DeleteService, Π° для закрытия дСскрипторов SC_HANDLE β€” функция CloseServiceHandle.

Запуск слуТбы

Бозданная слуТба сразу Π½Π΅ выполняСтся. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ServiceMain(), ΡƒΠΊΠ°Π·Π°Π² дСскриптор, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateService, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки argc ΠΈ argv, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ слуТбы (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ диспСтчСризации). 

BOOL StartService(SC_HANDLE hService, DWORD argc, LPTSTR argv[]) 

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбой

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбой, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ SCM ΠΎ нСобходимости Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ слуТбы с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. 

BOOL ControlService(SC_HANDLE hService, DWORD dwControlCode, LPSERVICE_STATUS lpServStat) 

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ dwControlCode, Ссли доступ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

SERVICE_CONTROL_STOP

SERVICE_CONTROL_PAUSE

SERVICE_CONTROL_CONTINUE

SERVICE_CONTROL_INTERROGATE

SERVICE_CONTROL_SHUTDOWN

ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° 128–255. Π­Ρ‚ΠΈ значСния ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Ρ‚Π΅ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались вмСстС с Ρ„Π»Π°Π³ΠΎΠΌ dwControl Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ServerCtrlHandler.

lpServStat β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру SERVICE_STATUS, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС. Π­Ρ‚ΠΎ Ρ‚Π° ΠΆΠ΅ структура, которая использовалась Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetServiceStatus.

ΠžΠΏΡ€ΠΎΡ состояния слуТбы

Для получСния структурой SERVICE_STATUS Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния слуТбы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция: 

BOOL QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus) 

РСзюмС: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбой

На рис. 13.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ SCM связан со слуТбами ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ управлСния слуТбами, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 13.3, которая рассматриваСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Π’ частности, SCM Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слуТбу, ΠΈ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для слуТбы, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· SCM. 

Рис. 13.1. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбами Windows Ρ‡Π΅Ρ€Π΅Π· SCM

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:команднаяоболочкауправлСнияслуТбами

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбами часто осущСствляСтся посрСдством ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, входящих Π² Π³Ρ€ΡƒΠΏΠΏΡƒ Administrative Tools, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ открываСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Services (Π‘Π»ΡƒΠΆΠ±Ρ‹). Для управлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ слуТбами ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ServiceShell (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 13.3), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ собой Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ JobShell ΠΈΠ· Π³Π»Π°Π²Ρ‹ 6 (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.3).

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 13.3. ServiceShell: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° управлСния слуТбами

/* Π“Π»Π°Π²Π° 13. */

/* ServiceShell.с. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ управлСния слуТбами Windows.

   Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ управлСния Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 6, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ управляСт слуТбами, Π° Π½Π΅ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ. */

/* ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

   create β€” созданиС слуТбы

   delete – ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ слуТбы

   start – запуск слуТбы

   control – ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбой */

#include "EvryThng.h"


static SC_HANDLE hScm;

static BOOL Debug;


int _tmain(int argc, LPTSTR argv[]) {

 BOOL Exit = FALSE;

 TCHAR Command[MAX_COMMAND_LINE + 10], *pc;

 DWORD i, LocArgc; /* Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ argc. */

 TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];

 LPTSTR pArgs[MAX_ARG];

 /* ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ массив "argv" Π² Π²ΠΈΠ΄Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки. */

 for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];

 /* ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ диспСтчСр управлСния слуТбами Π½Π° локальной машинС. */

 hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 /* Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄. */

 _tprintf(_T("\nΠ£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слуТбами Windows Services"));

 while (!Exit) {

  _tprintf(_T ("\nSM$"));

  _fgetts(Command, MAX_COMMAND_LINE, stdin);

  β€¦ Как для JobShell …

  if (_tcscmp(argstr [0], _T("create")) == 0) {

   Create(LocArgc, pArgs, Command);

  }

  … Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для всСх ΠΊΠΎΠΌΠ°Π½Π΄ …

 }

 CloseServiceHandle(hScm);

 return 0;

}


int Create(int argc, LPTSTR argv[], LPTSTR Command) {

 /* Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ слуТбы Π² Π²ΠΈΠ΄Π΅ слуТбы, запускаСмой "ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ":

    argv[1]: имя слуТбы

    argv[2]: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя слуТбы

    argv[3]: Π½Π°Π·Π²Π°Π½ΠΈΠ΅ исполняСмого Ρ„Π°ΠΉΠ»Π° */

 SC_HANDLE hSc;

 TCHAR CurrentDir[MAX_PATH +1], Executable[MAX_PATH + 1];

 hSc = CreateService(hScm, argv[1], argv[2], SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Executable, NULL, NULL, NULL, NULL, NULL);

 return 0;

}


/* Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ слуТбы – argv [1]: имя удаляСмой слуТбы. */

int Delete(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 hSc = OpenService(hScm, argv[1], DELETE);

 DeleteService(hSc); 

 CloseServiceHandle(hSc);

 return 0;

}


/* Запуск ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ слуТбы - argv [1] : имя запускаСмой слуТбы. */

int Start(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 TCHAR WorkingDir[MAX_PATH + 1];

 LPTSTR pWorkingDir = WorkingDir;

 LPTSTR argvStart[] = {argv[1], WorkingDir};

 GetCurrentDirectory(MAX_PATH + 1, WorkingDir);

 hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);

 /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ слуТбу с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ β€” ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. */

 /* ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ имя слуТбы совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ, */

 /* связанным с дСскриптором hSc посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OpenService. */

 /* ВмСстС с Ρ‚Π΅ΠΌ, функция ServiceMain это Π½Π΅ провСряСт. */

 StartService(hSc, 2, argvStart);

 CloseServiceHandle(hSc);

 return 0;

}


/* Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ слуТбой.

   argv[1]: имя управляСмой слуТбы.

   argv[2]: ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°: stop (остановка), pause (ΠΏΠ°ΡƒΠ·Π°), resume (Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅), interrogate (опрос). */

static LPCTSTR Commands[] = {"stop," "pause," "resume," "interrogate," "user"};

static DWORD Controls[] = {

 SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,

 SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128

};


int Control(int argc, LPTSTR argv[], LPTSTR Command) {

 SC_HANDLE hSc;

 SERVICE_STATUS ServiceStatus;

 DWORD dwControl, i;

 BOOL Found = FALSE;

 for (i= 0; i < sizeof(Controls)/sizeof(DWORD) && !Found; i++) Found = (_tcscmp(Commands [i], argv[2]) == 0);

 if (!Found) {

  _tprintf(_T("\nΠΠ΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° управлСния %s"), argv[1]);

  return 1;

 }

 dwControl = Controls[i – 1];

 hSc = OpenService(hScm, argv[1], SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL | SERVICE_QUERY_STATUS);

 ControlService(hSc, dwControl, &ServiceStatus); 

 if (dwControl == SERVICE_CONTROL_INTERROGATE) {

  QueryServiceStatus (hSc, &ServiceStatus);

  printf(_T("БостояниС, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QueryServiceStatus\n"));

  printf(_T("БостояниС слуТбы\n"));

  … ВывСсти всю ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии …

 }

 if (hSc != NULL) CloseServiceHandle(hSc);

 return 0;

БовмСстноС использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ядра прилоТСниями ΠΈ слуТбами

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слуТба ΠΈ прилоТСния Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ядра. НапримСр, слуТба ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ раздСляСмой области памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с прилоТСниями. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ раздСляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ядра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС являСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°.

БущСствуСт ΠΎΠ΄Π½Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ, связанная с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ контСкст бСзопасности ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ отличаСтся ΠΎΡ‚ контСкста бСзопасности слуТб, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ систСмной ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи. Π”Π°ΠΆΠ΅ Ссли Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π΅ трСбуСтся, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ (ΠΈΠ»ΠΈ) ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ раздСляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ядра с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² бСзопасности, установлСнным Π² NULL (см. Π³Π»Π°Π²Π° 15). ВмСсто этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½ΡƒΠ»Π΅Π²ΠΎΠΉ список Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ контроля доступа (см. Π³Π»Π°Π²Ρƒ 15), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ прилоТСния ΠΈ слуТба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΡƒΡŽ структуру Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π·Π°Ρ‰ΠΈΡ‚Ρ‹. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈ этот вопрос Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π² Π³Π»Π°Π²Π΅ 15.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ссли слуТба выполняСтся ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ систСмной ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи, Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ трудности с доступом слуТбы ΠΊ Ρ‚Π°ΠΊΠΈΠΌ рСсурсам, ΠΊΠ°ΠΊ раздСляСмыС Ρ„Π°ΠΉΠ»Ρ‹, находящиСся Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ….