1 /* 2 * PROJECT: ReactOS Services 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/applications/sc/depend.c 5 * PURPOSE: 6 * COPYRIGHT: Copyright 2016 Eric Kohl 7 * 8 */ 9 10 #include "sc.h" 11 12 BOOL EnumDepend(LPCTSTR ServiceName) 13 { 14 SC_HANDLE hManager = NULL; 15 SC_HANDLE hService = NULL; 16 BOOL bResult = TRUE; 17 DWORD BufferSize = 0; 18 DWORD EntriesRead = 0; 19 LPENUM_SERVICE_STATUS pBuffer = NULL; 20 DWORD i; 21 22 hManager = OpenSCManager(NULL, 23 NULL, 24 SC_MANAGER_CONNECT); 25 if (hManager == NULL) 26 { 27 _tprintf(_T("[SC] OpenSCManager FAILED %lu:\n\n"), GetLastError()); 28 bResult = FALSE; 29 goto done; 30 } 31 32 hService = OpenService(hManager, ServiceName, SERVICE_ENUMERATE_DEPENDENTS); 33 if (hService == NULL) 34 { 35 _tprintf(_T("[SC] OpenService FAILED %lu:\n\n"), GetLastError()); 36 bResult = FALSE; 37 goto done; 38 } 39 40 if (!EnumDependentServices(hService, 41 SERVICE_STATE_ALL, 42 NULL, 43 0, 44 &BufferSize, 45 &EntriesRead)) 46 { 47 if (BufferSize == 0) 48 { 49 _tprintf(_T("[SC] EnumDependentServices FAILED %lu:\n\n"), GetLastError()); 50 bResult = FALSE; 51 goto done; 52 } 53 } 54 55 pBuffer = HeapAlloc(GetProcessHeap(), 0, BufferSize); 56 if (pBuffer == NULL) 57 { 58 SetLastError(ERROR_OUTOFMEMORY); 59 _tprintf(_T("[SC] HeapAlloc FAILED %lu:\n\n"), GetLastError()); 60 bResult = FALSE; 61 goto done; 62 } 63 64 if (!EnumDependentServices(hService, 65 SERVICE_STATE_ALL, 66 pBuffer, 67 BufferSize, 68 &BufferSize, 69 &EntriesRead)) 70 { 71 _tprintf(_T("[SC] EnumDependentServices FAILED %lu:\n\n"), GetLastError()); 72 bResult = FALSE; 73 goto done; 74 } 75 76 _tprintf(_T("Enum: entriesRead = %lu\n"), EntriesRead); 77 78 for (i = 0; i < EntriesRead; i++) 79 { 80 _tprintf(_T("\n")); 81 _tprintf(_T("SERVICE_NAME: %s\n"), pBuffer[i].lpServiceName); 82 _tprintf(_T("DISPLAY_NAME: %s\n"), pBuffer[i].lpDisplayName); 83 PrintServiceStatus(&pBuffer[i].ServiceStatus); 84 } 85 86 done: 87 if (bResult == FALSE) 88 ReportLastError(); 89 90 if (pBuffer != NULL) 91 HeapFree(GetProcessHeap(), 0, pBuffer); 92 93 if (hService) 94 CloseServiceHandle(hService); 95 96 if (hManager) 97 CloseServiceHandle(hManager); 98 99 return bResult; 100 } 101