Работа с сервисами 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 <windows.h>

#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;

}

RuCoreNET - лучшее для вас!


Поделись статьей с друзьями


62 просмотров


0 0 vote
Рейтинг статьи
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments


Do NOT follow this link or you will be banned from the site!
0
Would love your thoughts, please comment.x
()
x

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: