QQ1321.CN 努力为您提供一个时尚的QQ空间代码交流平台!
一生愛妳QQ空间站
您当前的位置:QQ空间代码|QQ空间模块|QQ图标|QQ空间互踩|QQ免费资源 >> QQ空间代码 >> 文章内容 ╰☆╮文字广告位 ☏非主流同城缘分 ☜网友自由发布空间模块平台☞
创建SvcHost.exe 调用的服务原理与实践(7)
作者:郁郁小蝎 来源:中国站长学院(QQ1321)原创Www.QQ1321.Cn 收藏到QQ书签 【添加到百度搜藏】  推荐好友
int InstallService(char *name)
{
// Open a handle to the SC Manager database.
int rc = 0;
HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 0;
SC_HANDLE hscm = NULL, schService = NULL;

 try{
char buff[500];
char *svcname = DEFAULT_SERVICE;
if(name && name[0]) svcname = name;

 //query svchost setting
char *ptr, *pSvchost = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost";
rc = RegOpenKeyEx(hkRoot, pSvchost, 0, KEY_QUERY_value, &hkRoot);
if(ERROR_SUCCESS != rc)
{
OutputString("RegOpenKeyEx(%s) KEY_QUERY_value error %d.", pSvchost, rc);
throw "";
}

 DWORD type, size = sizeof buff;
rc = RegQueryvalueEx(hkRoot, "netsvcs", 0, &type, (unsigned char*)buff, &size);
RegCloseKey(hkRoot);
SetLastError(rc);
if(ERROR_SUCCESS != rc)
throw "RegQueryvalueEx(Svchost\\netsvcs)";

 for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
if(stricmp(ptr, svcname) == 0) break;

 if(*ptr == 0)
{
OutputString("you specify service name not in Svchost\\netsvcs, must be one of following:");
for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
OutputString(" - %s", ptr);
throw "";
}

 //install service
hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hscm == NULL)
throw "OpenSCManager()";

char *bin = "%SystemRoot%\\System32\\svchost.exe -k netsvcs";

 schService = CreateService(
hscm,// SCManager database
svcname,// name of service
NULL, // service name to display
SERVICE_ALL_ACCESS,// desired access
SERVICE_WIN32_SHARE_PROCESS, // service type
SERVICE_AUTO_START,// start type
SERVICE_ERROR_NORMAL,// error control type
bin,// service's binary
NULL,// no load ordering group
NULL,// no tag identifier
NULL,// no dependencies
NULL,// LocalSystem account
NULL); // no password

 if (schService == NULL)
{
OutputString("CreateService(%s) error %d", svcname, rc = GetLastError());
throw "";
}
OutputString("CreateService(%s) SUCCESS. Config it", svcname);

 CloseServiceHandle(schService);
CloseServiceHandle(hscm);

 //config service
hkRoot = HKEY_LOCAL_MACHINE;
strncpy(buff, "SYSTEM\\CurrentControlSet\\Services\\", sizeof buff);
strncat(buff, svcname, 100);
rc = RegOpenKeyEx(hkRoot, buff, 0, KEY_ALL_ACCESS, &hkRoot);
if(ERROR_SUCCESS != rc)
{
OutputString("RegOpenKeyEx(%s) KEY_SET_value error %d.", svcname, rc);
throw "";
}

 rc = RegCreateKey(hkRoot, "Parameters", &hkParam);
SetLastError(rc);
if(ERROR_SUCCESS != rc)
throw "RegCreateKey(Parameters)";

 if(!GetModuleFileName(HMODULE(hDll), buff, sizeof buff))
throw "GetModuleFileName() get dll path";

 rc = RegSetvalueEx(hkParam, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)buff, strlen(buff)+1);
SetLastError(rc);
if(ERROR_SUCCESS != rc)
throw "RegSetvalueEx(ServiceDll)";

 OutputString("Config service %s ok.", svcname);
}catch(char *str)
{
if(str && str[0])
{
rc = GetLastError();
OutputString("%s error %d", str, rc);
}
}

 RegCloseKey(hkRoot);
RegCloseKey(hkParam);
CloseServiceHandle(schService);
CloseServiceHandle(hscm);

 return rc;
}

上篇内容:文章:创建SvcHost.exe 调用的服务原理与实践(8)
下篇内容:文章:创建SvcHost.exe 调用的服务原理与实践(6)
将本文收藏到QQ书签中,以便日后查看或与好友分享
代码阅读排行
· 入侵检测及网络安全发展技术探讨(3)...
· 在Windows XP中如何取得文件或文件夹...
· Win2003“安全事件ID”分析(2)
· Win2003“安全事件ID”分析(3)
· 清除Security列表中的未知用户
· 电脑高手常用的五个按钮
站长精彩推荐
精彩推荐内容
· 何谓HTTP 500内部服务器错误


版权所有:一生愛妳┆QQ空间代码酷站 最佳分辨率 IE6.0 1024×768 备案中 站长(信仰自由)QQ:271443991
未经本站授权严禁建立镜像.本站部分资源来源于网络,版权归原作者所有 欢迎任何建议、批评和鼓励
Copyright © 2007-2008 信仰自由 All Rights Reserved .
收藏此页 - 推荐好友 - 友情连接 - - 信仰自由 - 联系我们 - 网站地图 - 关于我们