Author: mjmartin Date: Tue Oct 14 12:55:44 2008 New Revision: 36751
URL: http://svn.reactos.org/svn/reactos?rev=36751&view=rev Log: - REnumServicesStatusA/REnumServicesStatusExA: Call REnumServicesStatusW/REnumServicesStatusExW to do the work eliminating duplicate code. - lpResumeIndex and lpResumeHandle are set to 0 on success.
Modified: trunk/reactos/base/system/services/rpcserver.c
Modified: trunk/reactos/base/system/services/rpcserver.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcser... ============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Tue Oct 14 12:55:44 2008 @@ -2371,7 +2371,7 @@ dwRequiredSize += dwSize; }
- if (dwError != ERROR_MORE_DATA) + if (dwError == 0) { *pcbBytesNeeded = 0; if (lpResumeHandle) *lpResumeHandle = 0; @@ -3375,208 +3375,84 @@ LPBOUNDED_DWORD_256K lpServicesReturned, LPBOUNDED_DWORD_256K lpResumeHandle) { - PMANAGER_HANDLE hManager; - PSERVICE lpService; - DWORD dwError = ERROR_SUCCESS; - PLIST_ENTRY ServiceEntry; - PSERVICE CurrentService; - DWORD dwState; - DWORD dwRequiredSize; + LPENUM_SERVICE_STATUSW lpStatusPtrW = NULL; + LPENUM_SERVICE_STATUSA lpStatusPtrA = NULL; + LPWSTR lpStringPtrW; + LPSTR lpStringPtrA; + DWORD dwError; DWORD dwServiceCount; - DWORD dwSize; - DWORD dwLastResumeCount = 0; - LPENUM_SERVICE_STATUSA lpStatusPtr; - LPSTR lpStringPtr;
DPRINT("REnumServicesStatusA() called\n");
- if (ScmShutdown) - return ERROR_SHUTDOWN_IN_PROGRESS; - - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) - { - DPRINT1("Invalid manager handle!\n"); - return ERROR_INVALID_HANDLE; - } - - *pcbBytesNeeded = 0; - *lpServicesReturned = 0; - - if ((dwServiceType!=SERVICE_DRIVER) && (dwServiceType!=SERVICE_WIN32)) - { - DPRINT1("Not a valid Service Type!\n"); - return ERROR_INVALID_PARAMETER; - } - - if ((dwServiceState<SERVICE_ACTIVE) || (dwServiceState>SERVICE_STATE_ALL)) - { - DPRINT1("Not a valid Service State!\n"); - return ERROR_INVALID_PARAMETER; - } - - /* Check access rights */ - if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess, - SC_MANAGER_ENUMERATE_SERVICE)) - { - DPRINT1("Insufficient access rights! 0x%lx\n", - hManager->Handle.DesiredAccess); - return ERROR_ACCESS_DENIED; - } - - if (lpResumeHandle) dwLastResumeCount = *lpResumeHandle; - - /* FIXME: Lock the service list shared */ - - lpService = ScmGetServiceEntryByResumeCount(dwLastResumeCount); - if (lpService == NULL) - { - dwError = ERROR_SUCCESS; - goto Done; - } - - dwRequiredSize = 0; - dwServiceCount = 0; - - for (ServiceEntry = &lpService->ServiceListEntry; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - dwSize = sizeof(ENUM_SERVICE_STATUSA) + - wcslen(CurrentService->lpServiceName) + 1 + - wcslen(CurrentService->lpDisplayName) + 1; - - if (dwRequiredSize + dwSize > dwBufSize) - { - DPRINT("Service name: %S no fit\n", CurrentService->lpServiceName); - break; - } - - DPRINT("Service name: %S fit\n", CurrentService->lpServiceName); - dwRequiredSize += dwSize; - dwServiceCount++; - dwLastResumeCount = CurrentService->dwResumeCount; - } - - DPRINT("dwRequiredSize: %lu\n", dwRequiredSize); - DPRINT("dwServiceCount: %lu\n", dwServiceCount); - - for (; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - dwRequiredSize += sizeof(ENUM_SERVICE_STATUSA) + - wcslen(CurrentService->lpServiceName) + 1 + - wcslen(CurrentService->lpDisplayName) + 1; - - dwError = ERROR_MORE_DATA; - } - - DPRINT("*pcbBytesNeeded: %lu\n", dwRequiredSize); - - if (lpResumeHandle) *lpResumeHandle = dwLastResumeCount; - *lpServicesReturned = dwServiceCount; - *pcbBytesNeeded = dwRequiredSize; - - lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpBuffer; - lpStringPtr = (LPSTR)((ULONG_PTR)lpBuffer + - dwServiceCount * sizeof(ENUM_SERVICE_STATUSA)); - - dwRequiredSize = 0; - for (ServiceEntry = &lpService->ServiceListEntry; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - dwSize = sizeof(ENUM_SERVICE_STATUSA) + - wcslen(CurrentService->lpServiceName) + 1 + - wcslen(CurrentService->lpDisplayName) + 1; - - if (dwRequiredSize + dwSize > dwBufSize) - break; - + if ((dwBufSize > 0) && (lpBuffer)) + { + lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufSize); + if (!lpStatusPtrW) + { + DPRINT1("Failed to allocate buffer!\n"); + return ERROR_NOT_ENOUGH_MEMORY; + } + } + + dwError = REnumServicesStatusW(BindingHandle, + hSCManager, + dwServiceType, + dwServiceState, + (LPBYTE)lpStatusPtrW, + dwBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeHandle); + + /* if no services were returned then we are Done */ + if (*lpServicesReturned == 0) goto Done; + + lpStatusPtrA = (LPENUM_SERVICE_STATUSA)lpBuffer; + lpStringPtrA = (LPSTR)((ULONG_PTR)lpBuffer + + *lpServicesReturned * sizeof(ENUM_SERVICE_STATUSA)); + lpStringPtrW = (LPWSTR)((ULONG_PTR)lpStatusPtrW + + *lpServicesReturned * sizeof(ENUM_SERVICE_STATUSW)); + + for (dwServiceCount = 0; dwServiceCount < *lpServicesReturned; dwServiceCount++) + { /* Copy the service name */ WideCharToMultiByte(CP_ACP, 0, - CurrentService->lpServiceName, + lpStringPtrW, -1, - lpStringPtr, - wcslen(CurrentService->lpServiceName), + lpStringPtrA, + wcslen(lpStringPtrW), 0, 0); - lpStatusPtr->lpServiceName = (LPSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpServiceName) + 1); + + lpStatusPtrA->lpServiceName = (LPSTR)((ULONG_PTR)lpStringPtrA - (ULONG_PTR)lpBuffer); + lpStringPtrA += wcslen(lpStringPtrW) + 1; + lpStringPtrW += wcslen(lpStringPtrW) + 1;
/* Copy the display name */ WideCharToMultiByte(CP_ACP, 0, - CurrentService->lpDisplayName, + lpStringPtrW, -1, - lpStringPtr, - wcslen(CurrentService->lpDisplayName), + lpStringPtrA, + wcslen(lpStringPtrW), 0, 0); - lpStatusPtr->lpDisplayName = (LPSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpDisplayName) + 1); + + lpStatusPtrA->lpDisplayName = (LPSTR)((ULONG_PTR)lpStringPtrA - (ULONG_PTR)lpBuffer); + lpStringPtrA += wcslen(lpStringPtrW) + 1; + lpStringPtrW += wcslen(lpStringPtrW) + 1;
/* Copy the status information */ - memcpy(&lpStatusPtr->ServiceStatus, - &CurrentService->Status, + memcpy(&lpStatusPtrA->ServiceStatus, + &lpStatusPtrW->ServiceStatus, sizeof(SERVICE_STATUS));
- lpStatusPtr++; - dwRequiredSize += dwSize; - } - - if (dwError != ERROR_MORE_DATA) - { - *pcbBytesNeeded = 0; - if (lpResumeHandle) *lpResumeHandle = 0; + lpStatusPtrA++; }
Done:; - /* FIXME: Unlock the service list */ + if (lpStatusPtrW) HeapFree(GetProcessHeap(), 0, lpStatusPtrW);
DPRINT("REnumServicesStatusA() done (Error %lu)\n", dwError);
@@ -4521,81 +4397,24 @@ LPBOUNDED_DWORD_256K lpResumeIndex, LPCSTR pszGroupName) { - PMANAGER_HANDLE hManager; - PSERVICE lpService; - DWORD dwError = ERROR_SUCCESS; - PLIST_ENTRY ServiceEntry; - PSERVICE CurrentService; - DWORD dwState; - DWORD dwRequiredSize; + LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtrW = NULL; + LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtrA = NULL; + LPWSTR lpStringPtrW; + LPSTR lpStringPtrA; + LPWSTR pszGroupNameW = NULL; + DWORD dwError; DWORD dwServiceCount; - DWORD dwSize; - DWORD dwLastResumeCount = 0; - LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr; - LPSTR lpStringPtr; - LPWSTR pszGroupNameW = NULL;
DPRINT("REnumServicesStatusExA() called\n");
- if (ScmShutdown) - return ERROR_SHUTDOWN_IN_PROGRESS; - - if (InfoLevel != SC_ENUM_PROCESS_INFO) - return ERROR_INVALID_LEVEL; - - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) - { - DPRINT1("Invalid manager handle!\n"); - return ERROR_INVALID_HANDLE; - } - - *pcbBytesNeeded = 0; - *lpServicesReturned = 0; - - if ((dwServiceType!=SERVICE_DRIVER) && (dwServiceType!=SERVICE_WIN32)) - { - DPRINT1("Not a valid Service Type!\n"); - return ERROR_INVALID_PARAMETER; - } - - if ((dwServiceState<SERVICE_ACTIVE) || (dwServiceState>SERVICE_STATE_ALL)) - { - DPRINT1("Not a valid Service State!\n"); - return ERROR_INVALID_PARAMETER; - } - - /* Check access rights */ - if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess, - SC_MANAGER_ENUMERATE_SERVICE)) - { - DPRINT1("Insufficient access rights! 0x%lx\n", - hManager->Handle.DesiredAccess); - return ERROR_ACCESS_DENIED; - } - - if (lpResumeIndex) dwLastResumeCount = *lpResumeIndex; - - /* FIXME: Lock the service list shared */ - - lpService = ScmGetServiceEntryByResumeCount(dwLastResumeCount); - if (lpService == NULL) - { - dwError = ERROR_SUCCESS; - goto Done; - } - - dwRequiredSize = 0; - dwServiceCount = 0; - if (pszGroupName) { pszGroupNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (strlen(pszGroupName) + 1) * sizeof(WCHAR)); - if (!pszGroupNameW) - { - DPRINT1("Failed to allocate buffer!\n"); - return ERROR_NOT_ENOUGH_MEMORY; - } + if (!pszGroupNameW) + { + DPRINT1("Failed to allocate buffer!\n"); + return ERROR_NOT_ENOUGH_MEMORY; + } MultiByteToWideChar(CP_ACP, 0, pszGroupName, @@ -4604,208 +4423,81 @@ strlen(pszGroupName) + 1); }
- for (ServiceEntry = &lpService->ServiceListEntry; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - if (pszGroupNameW) - { - if (*pszGroupNameW == 0) - { - if (CurrentService->lpGroup != NULL) - continue; - } - else - { - if ((CurrentService->lpGroup == NULL) || - _wcsicmp(pszGroupNameW, CurrentService->lpGroup->lpGroupName)) - continue; - } - } - - dwSize = sizeof(ENUM_SERVICE_STATUS_PROCESSW) + - (wcslen(CurrentService->lpServiceName) + 1) + - (wcslen(CurrentService->lpDisplayName) + 1); - - if (dwRequiredSize + dwSize <= cbBufSize) - { - DPRINT("Service name: %S fit\n", CurrentService->lpServiceName); - dwRequiredSize += dwSize; - dwServiceCount++; - dwLastResumeCount = CurrentService->dwResumeCount; - } - else - { - DPRINT("Service name: %S no fit\n", CurrentService->lpServiceName); - break; - } - - } - - DPRINT("dwRequiredSize: %lu\n", dwRequiredSize); - DPRINT("dwServiceCount: %lu\n", dwServiceCount); - - for (; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - if (pszGroupNameW) - { - if (*pszGroupNameW == 0) - { - if (CurrentService->lpGroup != NULL) - continue; - } - else - { - if ((CurrentService->lpGroup == NULL) || - _wcsicmp(pszGroupNameW, CurrentService->lpGroup->lpGroupName)) - continue; - } - } - - dwRequiredSize += (sizeof(ENUM_SERVICE_STATUS_PROCESSW) + - (wcslen(CurrentService->lpServiceName) + 1) + - (wcslen(CurrentService->lpDisplayName) + 1)); - - dwError = ERROR_MORE_DATA; - } - - DPRINT("*pcbBytesNeeded: %lu\n", dwRequiredSize); - - if (lpResumeIndex) *lpResumeIndex = dwLastResumeCount; - *lpServicesReturned = dwServiceCount; - *pcbBytesNeeded = dwRequiredSize; - - /* If there was no services that matched */ - if (!dwServiceCount) - { - dwError = ERROR_SERVICE_DOES_NOT_EXIST; - goto Done; - } - - lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpBuffer; - lpStringPtr = (LPSTR)((ULONG_PTR)lpBuffer + - dwServiceCount * sizeof(ENUM_SERVICE_STATUS_PROCESSA)); - - dwRequiredSize = 0; - for (ServiceEntry = &lpService->ServiceListEntry; - ServiceEntry != &ServiceListHead; - ServiceEntry = ServiceEntry->Flink) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if ((CurrentService->Status.dwServiceType & dwServiceType) == 0) - continue; - - dwState = SERVICE_ACTIVE; - if (CurrentService->Status.dwCurrentState == SERVICE_STOPPED) - dwState = SERVICE_INACTIVE; - - if ((dwState & dwServiceState) == 0) - continue; - - if (pszGroupNameW) - { - if (*pszGroupNameW == 0) - { - if (CurrentService->lpGroup != NULL) - continue; - } - else - { - if ((CurrentService->lpGroup == NULL) || - _wcsicmp(pszGroupNameW, CurrentService->lpGroup->lpGroupName)) - continue; - } - } - - dwSize = sizeof(ENUM_SERVICE_STATUS_PROCESSW) + - ((wcslen(CurrentService->lpServiceName) + 1) * sizeof(WCHAR)) + - ((wcslen(CurrentService->lpDisplayName) + 1) * sizeof(WCHAR)); - - if (dwRequiredSize + dwSize <= cbBufSize) - { - /* Copy the service name */ - WideCharToMultiByte(CP_ACP, - 0, - CurrentService->lpServiceName, - -1, - lpStringPtr, - wcslen(CurrentService->lpServiceName), - 0, - 0); - lpStatusPtr->lpServiceName = (LPSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpServiceName) + 1); - - /* Copy the display name */ - WideCharToMultiByte(CP_ACP, - 0, - CurrentService->lpDisplayName, - -1, - lpStringPtr, - wcslen(CurrentService->lpDisplayName), - 0, - 0); - lpStatusPtr->lpDisplayName = (LPSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpDisplayName) + 1); - - /* Copy the status information */ - memcpy(&lpStatusPtr->ServiceStatusProcess, - &CurrentService->Status, - sizeof(SERVICE_STATUS)); - lpStatusPtr->ServiceStatusProcess.dwProcessId = CurrentService->ProcessId; /* FIXME */ - lpStatusPtr->ServiceStatusProcess.dwServiceFlags = 0; /* FIXME */ - - lpStatusPtr++; - dwRequiredSize += dwSize; - } - else - { - break; - } - } - - if (dwError != ERROR_MORE_DATA) - { - *pcbBytesNeeded = 0; - if (lpResumeIndex) *lpResumeIndex = 0; + if ((cbBufSize > 0) && (lpBuffer)) + { + lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBufSize); + if (!lpStatusPtrW) + { + DPRINT1("Failed to allocate buffer!\n"); + return ERROR_NOT_ENOUGH_MEMORY; + } + } + + dwError = REnumServicesStatusExW(BindingHandle, + hSCManager, + InfoLevel, + dwServiceType, + dwServiceState, + (LPBYTE)lpStatusPtrW, + cbBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeIndex, + pszGroupNameW); + + /* if no services were returned then we are Done */ + if (*lpServicesReturned == 0) goto Done; + + lpStatusPtrA = (LPENUM_SERVICE_STATUS_PROCESSA)lpBuffer; + lpStringPtrA = (LPSTR)((ULONG_PTR)lpBuffer + + *lpServicesReturned * sizeof(ENUM_SERVICE_STATUS_PROCESSA)); + lpStringPtrW = (LPWSTR)((ULONG_PTR)lpStatusPtrW + + *lpServicesReturned * sizeof(ENUM_SERVICE_STATUS_PROCESSW)); + + for (dwServiceCount = 0; dwServiceCount < *lpServicesReturned; dwServiceCount++) + { + /* Copy the service name */ + WideCharToMultiByte(CP_ACP, + 0, + lpStringPtrW, + -1, + lpStringPtrA, + wcslen(lpStringPtrW), + 0, + 0); + + lpStatusPtrA->lpServiceName = (LPSTR)((ULONG_PTR)lpStringPtrA - (ULONG_PTR)lpBuffer); + lpStringPtrA += wcslen(lpStringPtrW) + 1; + lpStringPtrW += wcslen(lpStringPtrW) + 1; + + /* Copy the display name */ + WideCharToMultiByte(CP_ACP, + 0, + lpStringPtrW, + -1, + lpStringPtrA, + wcslen(lpStringPtrW), + 0, + 0); + + lpStatusPtrA->lpDisplayName = (LPSTR)((ULONG_PTR)lpStringPtrA - (ULONG_PTR)lpBuffer); + lpStringPtrA += wcslen(lpStringPtrW) + 1; + lpStringPtrW += wcslen(lpStringPtrW) + 1; + + /* Copy the status information */ + memcpy(&lpStatusPtrA->ServiceStatusProcess, + &lpStatusPtrW->ServiceStatusProcess, + sizeof(SERVICE_STATUS)); + + lpStatusPtrA->ServiceStatusProcess.dwProcessId = lpStatusPtrW->ServiceStatusProcess.dwProcessId; /* FIXME */ + lpStatusPtrA->ServiceStatusProcess.dwServiceFlags = 0; /* FIXME */ + lpStatusPtrA++; }
Done:; - /* Unlock the service list */ - - if (pszGroupNameW) HeapFree(GetProcessHeap(),0,pszGroupNameW); + if (pszGroupNameW) HeapFree(GetProcessHeap(), 0, pszGroupNameW); + + if (lpStatusPtrW) HeapFree(GetProcessHeap(), 0, lpStatusPtrW);
DPRINT("REnumServicesStatusExA() done (Error %lu)\n", dwError);
@@ -5073,7 +4765,7 @@ } }
- if (dwError != ERROR_MORE_DATA) + if (dwError == 0) { *pcbBytesNeeded = 0; if (lpResumeIndex) *lpResumeIndex = 0;