VC++添加服务代码

第一个代码

#include "Winsvc.h"

//BOOL DisplayServices();   //查看服务
//void AddServices();       //添加服务
//void DelServices();       //删除服务
//void StopServices();      //停止服务
//void StartServices();     //启动服务

BOOL DisplayServices(char *m_ServiceName)   //查看服务
{
char RgsKey[MAX_PATH];
HKEY hNewKey=NULL;
    strcpy(RgsKey,"SYSTEM\\CurrentControlSet\\Services\\");   //系统服务位置
strcat(RgsKey,m_ServiceName);    //合并字符串
if(RegOpenKey(HKEY_LOCAL_MACHINE,RgsKey, &hNewKey)==ERROR_SUCCESS)  
   return TRUE;// MessageBox("已经存在\n");  
else
   return FALSE;// MessageBox("没有存在\n");

RegCloseKey(hNewKey);     //关闭注册表句柄
}

void AddServices(char *m_ServiceName, char *m_DisplayName, char *m_Description)   //添加服务
{    //AddServices("服务名" ,"服务描述", "服务描述");
char FilePath[MAX_PATH];
char SystemPath[MAX_PATH];
GetModuleFileName(NULL,FilePath,MAX_PATH);   //GetModuleFileName取得应用所在路径
GetSystemDirectory(SystemPath,MAX_PATH);   //取得System目录完整路径名
if (strncmp(SystemPath,FilePath,strlen(SystemPath)) != 0)
{
   char FileTitle[80];
   GetFileTitle(FilePath,FileTitle,80);
   if (strstr(FileTitle,".exe") == NULL && strstr(FileTitle,".EXE") == NULL)
    strcat(FileTitle,".exe");
   strcat(SystemPath,"\\");
   strcat(SystemPath,FileTitle);
   CopyFile(FilePath,SystemPath,FALSE);
   memset(FilePath,0,MAX_PATH);
   strcpy(FilePath,SystemPath);   //strcpy复制字符串
}
SetFileAttributes (FilePath,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); //设置文件属性

    SC_HANDLE manager=NULL;
    SC_HANDLE service=NULL;
char Desc[MAX_PATH];
HKEY key=NULL;
    manager = OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS); //SC_MANAGER_ALL_ACCESS 所有权限
    service=CreateService( manager,m_ServiceName,m_DisplayName,    //服务控制
   SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
   SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
   FilePath, 0, 0, 0, 0, 0 );

strcpy(Desc,"SYSTEM\\CurrentControlSet\\Services\\");   //系统服务位置
strcat(Desc,m_ServiceName);    //合并字符串
RegOpenKey(HKEY_LOCAL_MACHINE,Desc,&key); //打开注册表项
RegSetValueEx(key,"Description",0,REG_SZ,(CONST BYTE*)m_Description,lstrlen(m_Description));   //添加服务描述

StartService(service,0,NULL); //启动服务
RegCloseKey(key);     //关闭注册表句柄
    CloseServiceHandle(service);
    CloseServiceHandle(manager);
return;
}

void DelServices(char *ws_svcname)       //删除服务
{    //DelServices("删除的服务名");
    SC_HANDLE scm ,service;
    SERVICE_STATUS status;
scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
    service=OpenService(scm, ws_svcname,SERVICE_ALL_ACCESS|DELETE);
       //OpenService打开现有服务 scm服务句柄 modify_data.ws_svcname服务名 SERVICE_ALL_ACCESS服务访问类型 DELETE删除
    if ( status.dwCurrentState!=SERVICE_STOPPED )
    {
        ControlService(service,SERVICE_CONTROL_STOP,&status);
    }
    DeleteService(service);    //DeleteService删除服务 service取得服务
    CloseServiceHandle(service );
    CloseServiceHandle(scm);     
return;
}

void StopServices(char *ws_svcname)      //停止服务
{    //StopServices("要停止的服务名");
    SC_HANDLE scm ,service;
    SERVICE_STATUS status;

scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
    service=OpenService(scm,ws_svcname,SERVICE_ALL_ACCESS|DELETE);
    BOOL isSuccess=QueryServiceStatus(service,&status);
    if ( status.dwCurrentState!=SERVICE_STOPPED )
    {
   ControlService(service,SERVICE_CONTROL_STOP,&status);
    }
return;
}

void StartServices(char *ws_svcname)     //启动服务
{    //StartServices("要启动服务名");
    SC_HANDLE scm, service;
    SERVICE_STATUS status;

scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
    service=OpenService(scm,ws_svcname,SERVICE_ALL_ACCESS|DELETE);
    BOOL isSuccess=QueryServiceStatus(service,&status);
    if ( status.dwCurrentState==SERVICE_STOPPED )
    {
   StartService(service,0,NULL); //启动服务
    }
return;
}
第二个代码
#include "Winsvc.h"

UINT
NtServiceIsRunning(LPCTSTR ServiceName)   //检测是否运行
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    SERVICE_STATUS ssStatus;
    UINT            return_value;

    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    }
    QueryServiceStatus(schService, &ssStatus);
    if(ssStatus.dwCurrentState == SERVICE_RUNNING) return_value = 1;
                                              else return_value = 0;
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}

--------------------------------------------------------------------------------

UINT
NtServiceStart( LPCTSTR ServiceName)   //启动
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    UINT            return_value;

    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    }
    return_value = StartService(schService, 0, NULL) ? 1 : -1;
    RC = GetLastError();
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}

--------------------------------------------------------------------------------

UINT
NtServiceStop(LPCTSTR ServiceName,ULONG TimeoutSeconds)    //停止
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    UINT            return_value;
    SERVICE_STATUS SrvStatus;

    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    }
    return_value = ControlService(schService, SERVICE_CONTROL_STOP, &SrvStatus) ? 1 : -1;

    if(return_value) {
        while(QueryServiceStatus(schService, &SrvStatus)) {
            if ( SrvStatus.dwCurrentState == SERVICE_STOP_PENDING ) {
                if(!TimeoutSeconds)
                    break;
                if(TimeoutSeconds != -1)
                    TimeoutSeconds--;
                Sleep( 1000 );
            } else {
                break;
            }
        }
        if(SrvStatus.dwCurrentState == SERVICE_STOPPED) {
            return_value = 1;
        } else {
            return_value = -1;
        }
    } else {
        return_value = -2;
    }

    RC = GetLastError();
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}

--------------------------------------------------------------------------------

UINT
NtServiceInstall(LPCTSTR ServiceName,PCHAR PathToExecutable,BOOLEAN KernelDriver,ULONG StartType,PCHAR Dependencies) //安装
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    UINT            return_value = 0;
    CHAR path_name1[MAX_PATH];
    CHAR path_name[MAX_PATH];
    CHAR sys_path_name[MAX_PATH];
    CHAR drv_path_name[MAX_PATH];

    GetSystemDirectory(sys_path_name, MAX_PATH-40);
    if(KernelDriver) {
        _snprintf(path_name,     MAX_PATH-1, "%s\\drivers\\%s.sys", sys_path_name, ServiceName);
        _snprintf(path_name1,    MAX_PATH-1, "%s\\%s.sys", PathToExecutable, ServiceName);
        _snprintf(drv_path_name, MAX_PATH-1, "System32\\drivers\\%s.sys", ServiceName);
    } else {
        _snprintf(path_name,     MAX_PATH-1, "%s\\%s.exe", sys_path_name, ServiceName);
        _snprintf(path_name1,    MAX_PATH-1, "%s\\%s.exe", PathToExecutable, ServiceName);
        _snprintf(drv_path_name, MAX_PATH-1, "System32\\%s.exe", ServiceName);
    }

    return_value = CopyFile(path_name1, path_name, 0);
    if(!return_value) {
        return_value = GetLastError();
        printf("Can't copy %s to %s\nerror code %#x\n", path_name1, path_name, return_value);
        return -1;
    }

    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = CreateService(schSCManager, ServiceName, ServiceName, SERVICE_ALL_ACCESS,
                                KernelDriver ? SERVICE_KERNEL_DRIVER : SERVICE_WIN32_OWN_PROCESS,
                                StartType, SERVICE_ERROR_IGNORE,
                                drv_path_name, NULL, NULL, Dependencies, NULL, NULL);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    } else {
        return_value = 1;
    }
//    return_value = StartService(schService, 0, NULL) ? 1 : -1;
    RC = GetLastError();
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}

--------------------------------------------------------------------------------

UINT
NtServiceRemove(LPCTSTR ServiceName )    //卸载
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    UINT            return_value;
//    SERVICE_STATUS SrvStatus;

/*
    It is unsafe to do this:
   
    return_value = NtServiceStop(ServiceName);
    if(return_value != 1) {
        return return_value;
    }
*/
    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    }
    return_value = DeleteService(schService) ? 1 : -1;
    RC = GetLastError();
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}

--------------------------------------------------------------------------------

UINT
NtServiceSetStartMode( LPCTSTR ServiceName, ULONG StartMode)   //改变启动模式
{
    SC_HANDLE       schService;
    SC_HANDLE       schSCManager;
    DWORD           RC;
    UINT            return_value;

    schSCManager = OpenSCManager(
                                NULL,                   // machine (NULL == local)
                                NULL,                   // database (NULL == default)
                                SC_MANAGER_ALL_ACCESS   // access required
                               );
    if (!schSCManager) return -1;
    schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
    if (!schService) {
        RC = GetLastError();
        CloseServiceHandle(schSCManager);
        if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;
                                           else return -1;
    }
    return_value = ChangeServiceConfig(schService,
        SERVICE_NO_CHANGE,
        StartMode,
        SERVICE_NO_CHANGE,
        NULL, NULL, NULL /*tag*/,
        NULL, NULL, NULL /*pwd*/,
        NULL);
    return_value = 0;
    RC = GetLastError();
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return return_value;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值