SVCHOST启动服务

#include "stdafx.h"
#include <windows.h>


struct SERVERINFO
{
     CHAR ServiceName[128];
     CHAR ServiceShow[200];
     CHAR ServiceDescribe[300];
}m_ServiceInfo=
{
     "DDDDDDDDDDDDD",
     "BBBBBBBBBBAAA",
     "CCCCCCCCCCAAA"
};

BOOL MyCreateServiceFuntion(LPSTR BinPath)
{
     SC_HANDLE OHandle,CHandle;
     OHandle=OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS);
     if(OHandle == NULL)
         return FALSE;

     //该服务无法停止 暂停
     CHandle= CreateService(
         OHandle,m_ServiceInfo.ServiceName,m_ServiceInfo.ServiceShow,
         SERVICE_ALL_ACCESS|SERVICE_CHANGE_CONFIG,
         SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
         SERVICE_AUTO_START,
         SERVICE_ERROR_IGNORE,
         BinPath,NULL,NULL,NULL,NULL,NULL
         );
     if(CHandle == NULL)
         return FALSE;

     //修改服务失败启动的次数
     SERVICE_FAILURE_ACTIONS sfa;
     sfa.dwResetPeriod = 0; //重置失败次数为 0
     sfa.lpRebootMsg =NULL; //没看懂MSDN意思 悲剧啊.
     sfa.lpCommand = NULL;   //命令 就不需要了.
     sfa.cActions = 3;       //SC_ACTION 数组大小
     SC_ACTION Sc_Action[3]=
     {
         //无限重启 哈哈...
         {SC_ACTION_RESTART,100},{SC_ACTION_RESTART,100},{SC_ACTION_REBOOT,100}
     };
     sfa.lpsaActions = &Sc_Action[0];
   
     SERVICE_DESCRIPTION Service_Descrip={&m_ServiceInfo.ServiceDescribe[0]};
   
     //**** MSDN 这函数找死老子了.只列出来 ChangeServiceConfig 而没有 ChangeServiceConfig2
     ChangeServiceConfig2(CHandle,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa);
     ChangeServiceConfig2(CHandle,SERVICE_CONFIG_DESCRIPTION,&Service_Descrip);
   
     CloseServiceHandle(OHandle);
     CloseServiceHandle(CHandle);

     return TRUE;

}

BOOL AddSvchostGroup(VOID)
{
     HKEY hkey;//其实是一个句柄.
   
     if(
         RegOpenKey(HKEY_LOCAL_MACHINE,
         "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost",
         &hkey)!=ERROR_SUCCESS
         )
         return FALSE;
   
     if(
         RegSetValueEx(hkey,m_ServiceInfo.ServiceName,0,REG_MULTI_SZ,
         (BYTE *)m_ServiceInfo.ServiceName,lstrlen(m_ServiceInfo.ServiceName)) !=ERROR_SUCCESS
         )
         return FALSE;
   
     RegCloseKey(hkey);

     return TRUE;
}

//添加DLL 路径参数
BOOL AddParameters_ServiceDll(LPSTR DllPath)
{
     HKEY hkey;//其实是一个句柄.
     CHAR SubKey[255]={NULL};
     sprintf(SubKey,"SYSTEM\\ControlSet001\\Services\\%s\\Parameters",m_ServiceInfo.ServiceName);
   
     if(RegCreateKey(HKEY_LOCAL_MACHINE,SubKey,&hkey)!=ERROR_SUCCESS)
         return FALSE;

     if(RegSetValueEx(hkey,"ServiceDll",0,REG_EXPAND_SZ,(BYTE *)DllPath,lstrlen(DllPath)) !=ERROR_SUCCESS)
         return FALSE;
     RegCloseKey(hkey);

     return TRUE;
}


int main(int argc, char* argv[])
{


     CHAR BinPath[MAX_PATH]="%SystemRoot%\\System32\\svchost.exe -k ";
     strcat(BinPath,m_ServiceInfo.ServiceName);
   
     puts(BinPath);
   
     MyCreateServiceFuntion(BinPath);
   
     AddSvchostGroup();

     CHAR DllPath[]="C:\\Users\\JohnSong\\Documents\\Visual Studio 2010\\Projects\\tset\Debug\\test.dll";
     AddParameters_ServiceDll(DllPath);

     return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值