Делаем свой сервис для Windows NT

  Листинг 1 (создаёт в реестре NT учётную запись сервиса) setup.cpp
include <windows.h>

char infomes[512];
char servicedir[MAX_PATH];

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
lstrcpy(infomes, "Service succesful creat at path:\n");
lstrcpy(servicedir, "%SystemRoot%\\System32\\service.exe");

SC_HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
if(scm!=NULL) {
SC_HANDLE svc=CreateService(scm,
"Terra-Incognita",
"Terra-Incognita",
0,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
servicedir,
NULL,
NULL,
NULL,
NULL,
NULL);

if(svc!=NULL) {
CloseServiceHandle(svc);
strcat(infomes, servicedir);
MessageBox(NULL, infomes, "Install", NULL);
}
CloseServiceHandle(scm);
}
else {
MessageBox(NULL, "Error: Could not create Service.", "Install", NULL);
}

return 0;
}

 

  Листинг 2 (исходный код, который будет обрабатывать управляющие сообщения от NT) service.cpp
#include 
#include "service.h"

HMODULE g_module=NULL;

DWORD WINAPI EntryPoint(LPVOID lpParameter)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char svName[150];
char *svTarget="TERRA.EXE\0";
char svTargetName[150],*svFilePart;
char svComLine[2048];
char svFileName[512];

g_module=GetModuleHandle(NULL);
GetModuleFileName(g_module,svFileName,512);

GetSystemDirectory(svName,150-1);
lstrcat(svName,"\\");
lstrcpyn(svName+lstrlen(svName),svTarget,150-lstrlen(svName));
GetFullPathName(svName,150,svTargetName,&svFilePart);

lstrcpyn(svComLine,svTargetName,2048);
lstrcpyn(svComLine+lstrlen(svComLine)," ",2048-lstrlen(svComLine));
lstrcpyn(svComLine+lstrlen(svComLine),svFileName,2048-lstrlen(svComLine));

memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_FORCEOFFFEEDBACK;

//MessageBox(NULL,svComLine,"Command Line before...",MB_OK);
CreateProcess(NULL,svComLine,NULL,NULL,0,0,NULL,NULL,&si,&pi);

return 0;
}

extern "C" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow);

VOID WINAPI Handler( DWORD fdwControl )
{

}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
SERVICE_STATUS_HANDLE ssh=RegisterServiceCtrlHandler(WebPrice, &Handler);

SERVICE_STATUS ss;
ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwControlsAccepted=0;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);

EntryPoint(GetModuleHandle(NULL));

ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_STOPPED;
ss.dwControlsAccepted=0;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
SERVICE_TABLE_ENTRY DispatcherTable[]=
{
{WebPrice,
(LPSERVICE_MAIN_FUNCTION)ServiceMain },
{NULL,
NULL }
};

StartServiceCtrlDispatcher(DispatcherTable);
return 0;
}
  Листинг 3 (service.h)
#include <windows.h>

#ifndef __INC_MAIN_H
#define __INC_MAIN_H

#define WebPrice "WebPrice"
extern DWORD WINAPI EntryPoint(LPVOID lpParameter);

extern HMODULE g_module;

#endif

 

  Листинг 4 (программка удаляет из реестра NT наш сервис) uninst.cpp
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{

SC_HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL) {
SC_HANDLE svc=OpenService(scm, "Terra-Incognita", STANDARD_RIGHTS_REQUIRED);
DeleteService(svc);

if(svc!=NULL) {
CloseServiceHandle(svc);
MessageBox(NULL, "Succesful", "UnInstall", NULL);
}
CloseServiceHandle(scm);
}
else {
MessageBox(NULL, "Error: Could not uninstall Service.", "UnInstall", NULL);
}

return 0;
}
 
« Предыдущая статья   Следующая статья »