/*-------------------------------------------------------------------------*/ TestService_T* CreateRandomTestService(int id) /*-------------------------------------------------------------------------*/ { char ids[128]; char serviceurl[256]; char servicetype[256]; char attributes[256]; struct utsname myname; uname(&myname); sprintf(ids,"slpperf%i",id); sprintf(serviceurl,"service:%s.x://%s:12345",ids,myname.nodename); sprintf(servicetype,"service:%s.x",ids); sprintf(attributes,"(attr1=%s-val),(attr2=%s-val),(attr3=%s-val)", ids,ids,ids); return CreateTestService(serviceurl,servicetype,attributes); }
BOOL CreateTestServices() { // Get a handle to the SCM database. SC_HANDLE hScManager = OpenSCManager( NULL, // local computer NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access rights if (hScManager == NULL) { wprintf(L"error: OpenSCManager failed (%d)\n", GetLastError()); return false; } // Create the main test service std::wstring serviceCommand = gModulePath; serviceCommand += L" \""; serviceCommand += gServiceName; serviceCommand += L"\" \""; serviceCommand += gServiceDisplayName; serviceCommand += L"\""; SC_HANDLE hService = CreateTestService( hScManager, gServiceName, gServiceDisplayName, serviceCommand.c_str(), SERVICE_DEMAND_START ); if (hService == NULL) { CloseServiceHandle(hScManager); return false; } // Create dependent services std::wstring dependencies = gServiceName; dependencies += (TCHAR)0; for (int i = 0; i < DEPENDENT_SERVICES; i++) { SC_HANDLE hDependentService = CreateTestService( hScManager, gDependentServiceNames[i].c_str(), gDependentServiceDisplayNames[i].c_str(), serviceCommand.c_str(), SERVICE_DISABLED, dependencies.c_str()); if (hDependentService == NULL) { CloseServiceHandle(hScManager); return false; } // Make each dependent service depend on all of the services before it // for the sake of testing ServiceController.DependentServices and // ServiceController.ServicesDepended on. We do this by inserting the name // of the last dependent service created into the next dependent service's // dependency list before the double null. dependencies.insert(dependencies.end() - 1, (TCHAR)0); dependencies.insert(dependencies.length() - 1, gDependentServiceNames[i]); } // Attempt to start the main test service BOOL result = StartService(hService, 0, NULL); if (!result) { int error = GetLastError(); if (error == ERROR_SERVICE_ALREADY_RUNNING) { wprintf(L"warning: Service '%s' is already running\n", gServiceName); result = true; } else { wprintf(L"error: StartService failed (%d)\n", error); } } CloseServiceHandle(hService); CloseServiceHandle(hScManager); return result; }