Author: ekohl Date: Sun Apr 17 14:43:32 2011 New Revision: 51380
URL: http://svn.reactos.org/svn/reactos?rev=51380&view=rev Log: [ADVAPI32] Implement EnumServiceGroupW.
Modified: trunk/reactos/dll/win32/advapi32/service/scm.c
Modified: trunk/reactos/dll/win32/advapi32/service/scm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service/... ============================================================================== --- trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] Sun Apr 17 14:43:32 2011 @@ -862,24 +862,90 @@ /********************************************************************** * EnumServiceGroupW * - * @unimplemented - */ -BOOL -WINAPI -EnumServiceGroupW( - SC_HANDLE hSCManager, - DWORD dwServiceType, - DWORD dwServiceState, - LPENUM_SERVICE_STATUSW lpServices, - DWORD cbBufSize, - LPDWORD pcbBytesNeeded, - LPDWORD lpServicesReturned, - LPDWORD lpResumeHandle, - LPCWSTR lpGroup) -{ - FIXME("EnumServiceGroupW is unimplemented\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + * @implemented + */ +BOOL WINAPI +EnumServiceGroupW(SC_HANDLE hSCManager, + DWORD dwServiceType, + DWORD dwServiceState, + LPENUM_SERVICE_STATUSW lpServices, + DWORD cbBufSize, + LPDWORD pcbBytesNeeded, + LPDWORD lpServicesReturned, + LPDWORD lpResumeHandle, + LPCWSTR lpGroup) +{ + LPENUM_SERVICE_STATUSW lpStatusPtr; + DWORD dwError; + DWORD dwCount; + + TRACE("EnumServiceGroupW() called\n"); + + if (!hSCManager) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + RpcTryExcept + { + if (lpGroup == NULL) + { + dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager, + dwServiceType, + dwServiceState, + (LPBYTE)lpServices, + cbBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeHandle); + } + else + { + dwError = REnumServiceGroupW((SC_RPC_HANDLE)hSCManager, + dwServiceType, + dwServiceState, + (LPBYTE)lpServices, + cbBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeHandle, + lpGroup); + } + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + dwError = ScmRpcStatusToWinError(RpcExceptionCode()); + } + RpcEndExcept; + + if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA) + { + lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices; + for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) + { + if (lpStatusPtr->lpServiceName) + lpStatusPtr->lpServiceName = + (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName); + + if (lpStatusPtr->lpDisplayName) + lpStatusPtr->lpDisplayName = + (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName); + + lpStatusPtr++; + } + } + + if (dwError != ERROR_SUCCESS) + { + TRACE("REnumServiceGroupW() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + + TRACE("EnumServiceGroupW() done\n"); + + return TRUE; }