reactos/base/applications/sc/depend.c

100 lines
2.6 KiB
C

/*
* PROJECT: ReactOS Services
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/sc/depend.c
* PURPOSE:
* COPYRIGHT: Copyright 2016 Eric Kohl
*
*/
#include "sc.h"
BOOL EnumDepend(LPCTSTR ServiceName)
{
SC_HANDLE hManager = NULL;
SC_HANDLE hService = NULL;
BOOL bResult = TRUE;
DWORD BufferSize = 0;
DWORD EntriesRead = 0;
LPENUM_SERVICE_STATUS pBuffer = NULL;
DWORD i;
hManager = OpenSCManager(NULL,
NULL,
SC_MANAGER_CONNECT);
if (hManager == NULL)
{
_tprintf(_T("[SC] OpenSCManager FAILED %lu:\n\n"), GetLastError());
bResult = FALSE;
goto done;
}
hService = OpenService(hManager, ServiceName, SERVICE_ENUMERATE_DEPENDENTS);
if (hService == NULL)
{
_tprintf(_T("[SC] OpenService FAILED %lu:\n\n"), GetLastError());
bResult = FALSE;
goto done;
}
if (!EnumDependentServices(hService,
SERVICE_STATE_ALL,
NULL,
0,
&BufferSize,
&EntriesRead))
{
if (BufferSize == 0)
{
_tprintf(_T("[SC] EnumDependentServices FAILED %lu:\n\n"), GetLastError());
bResult = FALSE;
goto done;
}
}
pBuffer = HeapAlloc(GetProcessHeap(), 0, BufferSize);
if (pBuffer == NULL)
{
SetLastError(ERROR_OUTOFMEMORY);
_tprintf(_T("[SC] HeapAlloc FAILED %lu:\n\n"), GetLastError());
bResult = FALSE;
goto done;
}
if (!EnumDependentServices(hService,
SERVICE_STATE_ALL,
pBuffer,
BufferSize,
&BufferSize,
&EntriesRead))
{
_tprintf(_T("[SC] EnumDependentServices FAILED %lu:\n\n"), GetLastError());
bResult = FALSE;
goto done;
}
_tprintf(_T("Enum: entriesRead = %lu\n"), EntriesRead);
for (i = 0; i < EntriesRead; i++)
{
_tprintf(_T("\n"));
_tprintf(_T("SERVICE_NAME: %s\n"), pBuffer[i].lpServiceName);
_tprintf(_T("DISPLAY_NAME: %s\n"), pBuffer[i].lpDisplayName);
PrintServiceStatus(&pBuffer[i].ServiceStatus);
}
done:
if (bResult == FALSE)
ReportLastError();
if (pBuffer != NULL)
HeapFree(GetProcessHeap(), 0, pBuffer);
if (hService)
CloseServiceHandle(hService);
if (hManager)
CloseServiceHandle(hManager);
return bResult;
}