static BOOL StopService(SC_HANDLE SCManager, SC_HANDLE serviceHandle) { LPENUM_SERVICE_STATUSW dependencies = NULL; DWORD buffer_size = 0; DWORD count = 0, counter; BOOL result; SC_HANDLE dependent_serviceHandle; SERVICE_STATUS_PROCESS ssp; result = EnumDependentServicesW(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count); if(!result && (GetLastError() == ERROR_MORE_DATA)) { dependencies = HeapAlloc(GetProcessHeap(), 0, buffer_size); if(EnumDependentServicesW(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count)) { for(counter = 0; counter < count; counter++) { output_string(STRING_STOP_DEP, dependencies[counter].lpDisplayName); dependent_serviceHandle = OpenServiceW(SCManager, dependencies[counter].lpServiceName, SC_MANAGER_ALL_ACCESS); if(dependent_serviceHandle) result = StopService(SCManager, dependent_serviceHandle); CloseServiceHandle(dependent_serviceHandle); if(!result) output_string(STRING_CANT_STOP, dependencies[counter].lpDisplayName); } } } if(result) result = ControlService(serviceHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp); HeapFree(GetProcessHeap(), 0, dependencies); return result; }
LPENUM_SERVICE_STATUS TV2_GetDependants(LPWSTR lpServiceName, LPDWORD lpdwCount) { SC_HANDLE hSCManager; SC_HANDLE hService; LPENUM_SERVICE_STATUSW lpDependencies = NULL; DWORD dwBytesNeeded; DWORD dwCount; /* Set the first items in each tree view */ hSCManager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { hService = OpenServiceW(hSCManager, lpServiceName, SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_QUERY_CONFIG); if (hService) { /* Does this have any dependencies? */ if (!EnumDependentServicesW(hService, SERVICE_STATE_ALL, NULL, 0, &dwBytesNeeded, &dwCount) && GetLastError() == ERROR_MORE_DATA) { lpDependencies = (LPENUM_SERVICE_STATUSW)HeapAlloc(GetProcessHeap(), 0, dwBytesNeeded); if (lpDependencies) { /* Get the list of dependents */ if (EnumDependentServicesW(hService, SERVICE_STATE_ALL, lpDependencies, dwBytesNeeded, &dwBytesNeeded, &dwCount)) { /* Set the count */ *lpdwCount = dwCount; } else { HeapFree(ProcessHeap, 0, lpDependencies); lpDependencies = NULL; } } } CloseServiceHandle(hService); } CloseServiceHandle(hSCManager); } return lpDependencies; }