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