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.
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠ»ΡΠΆΠ±Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ, ΡΠΎ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΡΠ»ΡΠΆΠ±Ρ ΠΊ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π½Π° Π΄ΡΡΠ³ΠΈΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ .