#define NDEBUG
#include <debug.h>
-
/* GLOBALS *******************************************************************/
LIST_ENTRY GroupListHead;
/* FUNCTIONS *****************************************************************/
+PSERVICE_GROUP
+ScmGetServiceGroupByName(
+ _In_ LPCWSTR lpGroupName)
+{
+ PLIST_ENTRY GroupEntry;
+ PSERVICE_GROUP lpGroup;
+
+ DPRINT("ScmGetServiceGroupByName(%S)\n", lpGroupName);
+
+ GroupEntry = GroupListHead.Flink;
+ while (GroupEntry != &GroupListHead)
+ {
+ lpGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP, GroupListEntry);
+
+ if (!_wcsicmp(lpGroup->lpGroupName, lpGroupName))
+ return lpGroup;
+
+ GroupEntry = GroupEntry->Flink;
+ }
+
+ GroupEntry = UnknownGroupListHead.Flink;
+ while (GroupEntry != &UnknownGroupListHead)
+ {
+ lpGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP, GroupListEntry);
+
+ if (!_wcsicmp(lpGroup->lpGroupName, lpGroupName))
+ return lpGroup;
+
+ GroupEntry = GroupEntry->Flink;
+ }
+
+ return NULL;
+}
+
+
DWORD
ScmSetServiceGroup(PSERVICE lpService,
LPCWSTR lpGroupName)
if (lpService->lpGroup != NULL)
{
- lpService->lpGroup->dwRefCount--;
-
- /* FIXME: What do we have to do when dwRefCount is 0? */
+ ASSERT(lpService->lpGroup->dwRefCount != 0);
+ ASSERT(lpService->lpGroup->dwRefCount == (DWORD)-1 ||
+ lpService->lpGroup->dwRefCount < 10000);
+ if (lpService->lpGroup->dwRefCount != (DWORD)-1)
+ {
+ lpService->lpGroup->dwRefCount--;
+ if (lpService->lpGroup->dwRefCount == 0)
+ {
+ ASSERT(lpService->lpGroup->TagCount == 0);
+ ASSERT(lpService->lpGroup->TagArray == NULL);
+ RemoveEntryList(&lpService->lpGroup->GroupListEntry);
+ HeapFree(GetProcessHeap(), 0, lpService->lpGroup);
+ lpService->lpGroup = NULL;
+ }
+ }
}
+ if (lpGroupName == NULL)
+ return ERROR_SUCCESS;
+
GroupEntry = GroupListHead.Flink;
while (GroupEntry != &GroupListHead)
{