Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с сервисами 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;
}

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог