减小字体
增大字体
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; }
|