From d142c4f9880d9fad1fb1c8f14dce79f2ce2419d0 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 31 Dec 2005 22:42:41 +0000 Subject: [PATCH] - Service list entries use a pointer to a group list entry instead of the goup name. - New group list entries are created in the unknown-group-list for services of unknown groups. svn path=/trunk/; revision=20496 --- reactos/subsys/system/services/database.c | 39 +++++---------- reactos/subsys/system/services/groupdb.c | 55 ++++++++++++++++++++++ reactos/subsys/system/services/rpcserver.c | 23 +++++---- reactos/subsys/system/services/services.h | 4 +- 4 files changed, 83 insertions(+), 38 deletions(-) diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index 34bf1ebbea8..1ce5f359fdf 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -267,8 +267,9 @@ CreateServiceListEntry(LPWSTR lpServiceName, if (lpGroup != NULL) { - lpService->lpServiceGroup = lpGroup; - lpGroup = NULL; + dwError = ScmSetServiceGroup(lpService, lpGroup); + if (dwError != ERROR_SUCCESS) + goto done; } if (lpDisplayName != NULL) @@ -278,7 +279,7 @@ CreateServiceListEntry(LPWSTR lpServiceName, } DPRINT("ServiceName: '%S'\n", lpService->lpServiceName); - DPRINT("Group: '%S'\n", lpService->lpServiceGroup); + DPRINT("Group: '%S'\n", lpService->lpGroup->lpGroupName); DPRINT("Start %lx Type %lx Tag %lx ErrorControl %lx\n", lpService->dwStartType, lpService->Status.dwServiceType, @@ -415,8 +416,6 @@ ScmCheckDriver(PSERVICE Service) ULONG BufferLength; ULONG DataLength; ULONG Index; - PLIST_ENTRY GroupEntry; - PSERVICE_GROUP CurrentGroup; DPRINT("ScmCheckDriver(%S) called\n", Service->lpServiceName); @@ -481,24 +480,12 @@ ScmCheckDriver(PSERVICE Service) /* Mark service as 'running' */ Service->Status.dwCurrentState = SERVICE_RUNNING; - /* Find the driver's group and mark it as 'running' */ - if (Service->lpServiceGroup != NULL) + /* Mark the service group as 'running' */ + if (Service->lpGroup != NULL) { - GroupEntry = GroupListHead.Flink; - while (GroupEntry != &GroupListHead) - { - CurrentGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP, GroupListEntry); - - DPRINT("Checking group '%S'\n", &CurrentGroup->lpGroupName); - if (Service->lpServiceGroup != NULL && - _wcsicmp(Service->lpServiceGroup, CurrentGroup->lpGroupName) == 0) - { - CurrentGroup->ServicesRunning = TRUE; - } - - GroupEntry = GroupEntry->Flink; - } + Service->lpGroup->ServicesRunning = TRUE; } + break; } } @@ -856,8 +843,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentService->lpServiceGroup != NULL) && - (_wcsicmp(CurrentGroup->lpGroupName, CurrentService->lpServiceGroup) == 0) && + if ((CurrentService->lpGroup == CurrentGroup) && (CurrentService->dwStartType == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE) && (CurrentService->dwTag == CurrentGroup->TagArray[i])) @@ -877,8 +863,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentService->lpServiceGroup != NULL) && - (_wcsicmp(CurrentGroup->lpGroupName, CurrentService->lpServiceGroup) == 0) && + if ((CurrentService->lpGroup == CurrentGroup) && (CurrentService->dwStartType == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE)) { @@ -899,7 +884,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentService->lpServiceGroup != NULL) && + if ((CurrentService->lpGroup != NULL) && (CurrentService->dwStartType == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE)) { @@ -917,7 +902,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentService->lpServiceGroup == NULL) && + if ((CurrentService->lpGroup == NULL) && (CurrentService->dwStartType == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE)) { diff --git a/reactos/subsys/system/services/groupdb.c b/reactos/subsys/system/services/groupdb.c index c2451f21139..2f50981dad6 100644 --- a/reactos/subsys/system/services/groupdb.c +++ b/reactos/subsys/system/services/groupdb.c @@ -13,10 +13,64 @@ /* GLOBALS *******************************************************************/ LIST_ENTRY GroupListHead; +LIST_ENTRY UnknownGroupListHead; /* FUNCTIONS *****************************************************************/ +DWORD +ScmSetServiceGroup(PSERVICE lpService, + LPWSTR lpGroupName) +{ + PLIST_ENTRY GroupEntry; + PSERVICE_GROUP lpGroup; + + GroupEntry = GroupListHead.Flink; + while (GroupEntry != &GroupListHead) + { + lpGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP, GroupListEntry); + + if (!_wcsicmp(lpGroup->lpGroupName, lpGroupName)) + { + lpService->lpGroup = lpGroup; + return ERROR_SUCCESS; + } + + GroupEntry = GroupEntry->Flink; + } + + GroupEntry = UnknownGroupListHead.Flink; + while (GroupEntry != &UnknownGroupListHead) + { + lpGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP, GroupListEntry); + + if (!_wcsicmp(lpGroup->lpGroupName, lpGroupName)) + { + lpGroup->dwRefCount++; + lpService->lpGroup = lpGroup; + return ERROR_SUCCESS; + } + + GroupEntry = GroupEntry->Flink; + } + + lpGroup = (PSERVICE_GROUP)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SERVICE_GROUP) + (wcslen(lpGroupName) * sizeof(WCHAR))); + if (lpGroup == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + wcscpy(lpGroup->szGroupName, lpGroupName); + lpGroup->lpGroupName = lpGroup->szGroupName; + lpGroup->dwRefCount = 1; + + InsertTailList(&UnknownGroupListHead, + &lpGroup->GroupListEntry); + + return ERROR_SUCCESS; +} + + static NTSTATUS STDCALL CreateGroupOrderListRoutine(PWSTR ValueName, ULONG ValueType, @@ -120,6 +174,7 @@ ScmCreateGroupList(VOID) NTSTATUS Status; InitializeListHead(&GroupListHead); + InitializeListHead(&UnknownGroupListHead); /* Build group order list */ RtlZeroMemory(&QueryTable, diff --git a/reactos/subsys/system/services/rpcserver.c b/reactos/subsys/system/services/rpcserver.c index d88703f184f..2464ece405d 100644 --- a/reactos/subsys/system/services/rpcserver.c +++ b/reactos/subsys/system/services/rpcserver.c @@ -927,7 +927,7 @@ ScmrChangeServiceConfigW(handle_t BiningHandle, if (lpdwTagId != NULL) { - dwError = ScmAssignNewTag(lpService->lpServiceGroup, + dwError = ScmAssignNewTag(lpService->lpGroup->lpGroupName, &lpService->dwTag); if (dwError != ERROR_SUCCESS) goto done; @@ -1161,7 +1161,7 @@ ScmrCreateServiceW(handle_t BindingHandle, if (lpdwTagId != NULL) { - dwError = ScmAssignNewTag(lpService->lpServiceGroup, + dwError = ScmAssignNewTag(lpService->lpGroup->lpGroupName, &lpService->dwTag); if (dwError != ERROR_SUCCESS) goto done; @@ -1635,8 +1635,8 @@ ScmrQueryServiceConfigW(handle_t BindingHandle, if (lpImagePath != NULL) dwRequiredSize += ((wcslen(lpImagePath) + 1) * sizeof(WCHAR)); - if (lpService->lpServiceGroup != NULL) - dwRequiredSize += ((wcslen(lpService->lpServiceGroup) + 1) * sizeof(WCHAR)); + if (lpService->lpGroup != NULL) + dwRequiredSize += ((wcslen(lpService->lpGroup->lpGroupName) + 1) * sizeof(WCHAR)); /* FIXME: Add Dependencies length*/ @@ -1670,11 +1670,11 @@ ScmrQueryServiceConfigW(handle_t BindingHandle, lpConfig->lpBinaryPathName = NULL; } - if (lpService->lpServiceGroup != NULL) + if (lpService->lpGroup != NULL) { - wcscpy(lpStr, lpService->lpServiceGroup); + wcscpy(lpStr, lpService->lpGroup->lpGroupName); lpConfig->lpLoadOrderGroup = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); - lpStr += (wcslen(lpService->lpServiceGroup) + 1); + lpStr += (wcslen(lpService->lpGroup->lpGroupName) + 1); } else { @@ -2290,7 +2290,8 @@ ScmrEnumServicesStatusExW(handle_t BindingHandle, if (pszGroupName) { - if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup)) + if ((CurrentService->lpGroup == NULL) || + _wcsicmp(pszGroupName, CurrentService->lpGroup->lpGroupName)) continue; } @@ -2336,7 +2337,8 @@ ScmrEnumServicesStatusExW(handle_t BindingHandle, if (pszGroupName) { - if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup)) + if ((CurrentService->lpGroup == NULL) || + _wcsicmp(pszGroupName, CurrentService->lpGroup->lpGroupName)) continue; } @@ -2378,7 +2380,8 @@ ScmrEnumServicesStatusExW(handle_t BindingHandle, if (pszGroupName) { - if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup)) + if ((CurrentService->lpGroup == NULL) || + _wcsicmp(pszGroupName, CurrentService->lpGroup->lpGroupName)) continue; } diff --git a/reactos/subsys/system/services/services.h b/reactos/subsys/system/services/services.h index 31f739c17ae..5c72fcf4745 100644 --- a/reactos/subsys/system/services/services.h +++ b/reactos/subsys/system/services/services.h @@ -29,7 +29,7 @@ typedef struct _SERVICE LIST_ENTRY ServiceListEntry; LPWSTR lpServiceName; LPWSTR lpDisplayName; - LPWSTR lpServiceGroup; + PSERVICE_GROUP lpGroup; BOOL bDeleted; DWORD dwResumeCount; @@ -109,6 +109,8 @@ DWORD ScmControlDriver(PSERVICE lpService, /* groupdb.c */ DWORD ScmCreateGroupList(VOID); +DWORD ScmSetServiceGroup(PSERVICE lpService, + LPWSTR lpGroupName); /* rpcserver.c */