- 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.
Modified: trunk/reactos/subsys/system/services/database.c
Modified: trunk/reactos/subsys/system/services/groupdb.c
Modified: trunk/reactos/subsys/system/services/rpcserver.c
Modified: trunk/reactos/subsys/system/services/services.h
_____
Modified: trunk/reactos/subsys/system/services/database.c
--- trunk/reactos/subsys/system/services/database.c 2005-12-31
21:37:52 UTC (rev 20495)
+++ trunk/reactos/subsys/system/services/database.c 2005-12-31
22:42:41 UTC (rev 20496)
@@ -267,8 +267,9 @@
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 @@
}
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 @@
ULONG BufferLength;
ULONG DataLength;
ULONG Index;
- PLIST_ENTRY GroupEntry;
- PSERVICE_GROUP CurrentGroup;
DPRINT("ScmCheckDriver(%S) called\n", Service->lpServiceName);
@@ -481,24 +480,12 @@
/* 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 @@
{
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 @@
{
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 @@
{
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 @@
{
CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE,
ServiceListEntry);
- if ((CurrentService->lpServiceGroup == NULL) &&
+ if ((CurrentService->lpGroup == NULL) &&
(CurrentService->dwStartType == SERVICE_AUTO_START) &&
(CurrentService->ServiceVisited == FALSE))
{
_____
Modified: trunk/reactos/subsys/system/services/groupdb.c
--- trunk/reactos/subsys/system/services/groupdb.c 2005-12-31
21:37:52 UTC (rev 20495)
+++ trunk/reactos/subsys/system/services/groupdb.c 2005-12-31
22:42:41 UTC (rev 20496)
@@ -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 @@
NTSTATUS Status;
InitializeListHead(&GroupListHead);
+ InitializeListHead(&UnknownGroupListHead);
/* Build group order list */
RtlZeroMemory(&QueryTable,
_____
Modified: trunk/reactos/subsys/system/services/rpcserver.c
--- trunk/reactos/subsys/system/services/rpcserver.c 2005-12-31
21:37:52 UTC (rev 20495)
+++ trunk/reactos/subsys/system/services/rpcserver.c 2005-12-31
22:42:41 UTC (rev 20496)
@@ -927,7 +927,7 @@
if (lpdwTagId != NULL)
{
- dwError = ScmAssignNewTag(lpService->lpServiceGroup,
+ dwError = ScmAssignNewTag(lpService->lpGroup->lpGroupName,
&lpService->dwTag);
if (dwError != ERROR_SUCCESS)
goto done;
@@ -1161,7 +1161,7 @@
if (lpdwTagId != NULL)
{
- dwError = ScmAssignNewTag(lpService->lpServiceGroup,
+ dwError = ScmAssignNewTag(lpService->lpGroup->lpGroupName,
&lpService->dwTag);
if (dwError != ERROR_SUCCESS)
goto done;
@@ -1635,8 +1635,8 @@
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 @@
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 @@
if (pszGroupName)
{
- if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup))
+ if ((CurrentService->lpGroup == NULL) ||
+ _wcsicmp(pszGroupName,
CurrentService->lpGroup->lpGroupName))
continue;
}
@@ -2336,7 +2337,8 @@
if (pszGroupName)
{
- if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup))
+ if ((CurrentService->lpGroup == NULL) ||
+ _wcsicmp(pszGroupName,
CurrentService->lpGroup->lpGroupName))
continue;
}
@@ -2378,7 +2380,8 @@
if (pszGroupName)
{
- if (_wcsicmp(pszGroupName, CurrentService->lpServiceGroup))
+ if ((CurrentService->lpGroup == NULL) ||
+ _wcsicmp(pszGroupName,
CurrentService->lpGroup->lpGroupName))
continue;
}
_____
Modified: trunk/reactos/subsys/system/services/services.h
--- trunk/reactos/subsys/system/services/services.h 2005-12-31
21:37:52 UTC (rev 20495)
+++ trunk/reactos/subsys/system/services/services.h 2005-12-31
22:42:41 UTC (rev 20496)
@@ -29,7 +29,7 @@
LIST_ENTRY ServiceListEntry;
LPWSTR lpServiceName;
LPWSTR lpDisplayName;
- LPWSTR lpServiceGroup;
+ PSERVICE_GROUP lpGroup;
BOOL bDeleted;
DWORD dwResumeCount;
@@ -109,6 +109,8 @@
/* groupdb.c */
DWORD ScmCreateGroupList(VOID);
+DWORD ScmSetServiceGroup(PSERVICE lpService,
+ LPWSTR lpGroupName);
/* rpcserver.c */