- 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
This commit is contained in:
Eric Kohl 2005-12-31 22:42:41 +00:00
parent 1d13ed66fa
commit d142c4f988
4 changed files with 83 additions and 38 deletions

View file

@ -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))
{

View file

@ -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,

View file

@ -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;
}

View file

@ -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 */