Author: ekohl Date: Sat Aug 13 20:49:55 2011 New Revision: 53214
URL: http://svn.reactos.org/svn/reactos?rev=53214&view=rev Log: [ADVAPI32] Fix and EnumDependentServices[A/W]: - If lpServices is NULL or cbBufSize is less than sizeof(ENUM_SERVICE_STATUS/W) pass a pointer to an internal status buffer to REnumDependentServicesA/W.
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] Sat Aug 13 20:49:55 2011 @@ -744,18 +744,31 @@ LPDWORD pcbBytesNeeded, LPDWORD lpServicesReturned) { + ENUM_SERVICE_STATUSA ServiceStatus; LPENUM_SERVICE_STATUSA lpStatusPtr; + DWORD dwBufferSize; DWORD dwError; DWORD dwCount;
- TRACE("EnumServicesStatusA() called\n"); + TRACE("EnumDependentServicesA() called\n"); + + if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSA)) + { + lpStatusPtr = &ServiceStatus; + dwBufferSize = sizeof(ENUM_SERVICE_STATUSA); + } + else + { + lpStatusPtr = lpServices; + dwBufferSize = cbBufSize; + }
RpcTryExcept { dwError = REnumDependentServicesA((SC_RPC_HANDLE)hService, dwServiceState, - (LPBYTE)lpServices, - cbBufSize, + (LPBYTE)lpStatusPtr, + dwBufferSize, pcbBytesNeeded, lpServicesReturned); } @@ -767,18 +780,20 @@
if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA) { - lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices; - for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) + if (*lpServicesReturned > 0) { - if (lpStatusPtr->lpServiceName) - lpStatusPtr->lpServiceName = - (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName); - - if (lpStatusPtr->lpDisplayName) - lpStatusPtr->lpDisplayName = - (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName); - - lpStatusPtr++; + for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) + { + if (lpStatusPtr->lpServiceName) + lpStatusPtr->lpServiceName = + (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName); + + if (lpStatusPtr->lpDisplayName) + lpStatusPtr->lpDisplayName = + (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName); + + lpStatusPtr++; + } } }
@@ -808,18 +823,31 @@ LPDWORD pcbBytesNeeded, LPDWORD lpServicesReturned) { + ENUM_SERVICE_STATUSW ServiceStatus; LPENUM_SERVICE_STATUSW lpStatusPtr; + DWORD dwBufferSize; DWORD dwError; DWORD dwCount;
- TRACE("EnumServicesStatusW() called\n"); + TRACE("EnumDependentServicesW() called\n"); + + if (lpServices == NULL || cbBufSize < sizeof(ENUM_SERVICE_STATUSW)) + { + lpStatusPtr = &ServiceStatus; + dwBufferSize = sizeof(ENUM_SERVICE_STATUSW); + } + else + { + lpStatusPtr = lpServices; + dwBufferSize = cbBufSize; + }
RpcTryExcept { dwError = REnumDependentServicesW((SC_RPC_HANDLE)hService, dwServiceState, - (LPBYTE)lpServices, - cbBufSize, + (LPBYTE)lpStatusPtr, + dwBufferSize, pcbBytesNeeded, lpServicesReturned); } @@ -831,18 +859,20 @@
if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA) { - lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices; - for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) + if (*lpServicesReturned > 0) { - 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++; + 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++; + } } }