[MSIEXEC] Sync with Wine Staging 2.16. CORE-13762
[reactos.git] / base / system / services / groupdb.c
index 50db8d3..b64b59f 100644 (file)
@@ -22,6 +22,41 @@ LIST_ENTRY UnknownGroupListHead;
 
 /* 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)
@@ -33,11 +68,26 @@ ScmSetServiceGroup(PSERVICE lpService,
 
     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)
     {