[NETAPI32]
[reactos.git] / reactos / dll / win32 / netapi32 / local_group.c
index 0f301af..798248d 100644 (file)
@@ -22,7 +22,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
 
-
 typedef enum _ENUM_PHASE
 {
     BuiltinPhase,
@@ -104,7 +103,7 @@ BuildAliasInfoBuffer(PALIAS_GENERAL_INFORMATION AliasInfo,
         case 0:
             LocalInfo0 = (PLOCALGROUP_INFO_0)LocalBuffer;
 
-            Ptr = (LPWSTR)LocalInfo0++;
+            Ptr = (LPWSTR)((ULONG_PTR)LocalInfo0 + sizeof(LOCALGROUP_INFO_0));
             LocalInfo0->lgrpi0_name = Ptr;
 
             memcpy(LocalInfo0->lgrpi0_name,
@@ -468,7 +467,12 @@ NetLocalGroupAdd(
 
 done:
     if (AliasHandle != NULL)
-        SamCloseHandle(AliasHandle);
+    {
+        if (ApiStatus != NERR_Success)
+            SamDeleteAlias(AliasHandle);
+        else
+            SamCloseHandle(AliasHandle);
+    }
 
     if (DomainHandle != NULL)
         SamCloseHandle(DomainHandle);
@@ -1159,7 +1163,7 @@ NetLocalGroupEnum(
 //    }
 
 done:
-    if (ApiStatus == NERR_Success && EnumContext->Phase != DonePhase)
+    if (ApiStatus == NERR_Success && EnumContext != NULL && EnumContext->Phase != DonePhase)
         ApiStatus = ERROR_MORE_DATA;
 
     if (EnumContext != NULL)
@@ -1370,7 +1374,7 @@ NetLocalGroupGetMembers(
     NET_API_STATUS ApiStatus = NERR_Success;
     NTSTATUS Status = STATUS_SUCCESS;
 
-    TRACE("(%s %s %d %p %d, %p %p %p)\n", debugstr_w(servername),
+    TRACE("(%s %s %d %p %d %p %p %p)\n", debugstr_w(servername),
           debugstr_w(localgroupname), level, bufptr, prefmaxlen, entriesread,
           totalentries, resumehandle);
 
@@ -1528,14 +1532,16 @@ NetLocalGroupGetMembers(
             case 2:
                 Size += sizeof(LOCALGROUP_MEMBERS_INFO_2) +
                         RtlLengthSid(EnumContext->Sids[i]) +
-                        EnumContext->Names[i].Name.Length + sizeof(WCHAR) +
-                        EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
+                        EnumContext->Names[i].Name.Length + sizeof(WCHAR);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                    Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
                 break;
 
             case 3:
                 Size += sizeof(LOCALGROUP_MEMBERS_INFO_3) +
-                        EnumContext->Names[i].Name.Length + sizeof(WCHAR) +
-                        EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
+                        EnumContext->Names[i].Name.Length + sizeof(WCHAR);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                    Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
                 break;
 
             default:
@@ -1587,6 +1593,7 @@ NetLocalGroupGetMembers(
                        EnumContext->Sids[i],
                        SidLength);
                 Ptr = (PVOID)((ULONG_PTR)Ptr + SidLength);
+                MembersInfo0++;
                 break;
 
             case 1:
@@ -1603,11 +1610,13 @@ NetLocalGroupGetMembers(
 
                 TRACE("Name: %S\n", EnumContext->Names[i].Name.Buffer);
 
-                MembersInfo1->lgrmi1_name = (LPWSTR)Ptr;
+                MembersInfo1->lgrmi1_name = Ptr;
 
                 memcpy(MembersInfo1->lgrmi1_name,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
+                MembersInfo1++;
                 break;
 
             case 2:
@@ -1622,37 +1631,49 @@ NetLocalGroupGetMembers(
 
                 MembersInfo2->lgrmi2_sidusage = EnumContext->Names[i].Use;
 
-                MembersInfo2->lgrmi2_domainandname = (LPWSTR)Ptr;
-                memcpy(MembersInfo2->lgrmi2_domainandname,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                MembersInfo2->lgrmi2_domainandname = Ptr;
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                {
+                    memcpy(MembersInfo2->lgrmi2_domainandname,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                *((LPWSTR)Ptr) = L'\\';
+                    *((LPWSTR)Ptr) = L'\\';
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                }
 
                 memcpy(Ptr,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
+                MembersInfo2++;
                 break;
 
             case 3:
-                MembersInfo3->lgrmi3_domainandname = (PSID)Ptr;
-                memcpy(MembersInfo2->lgrmi2_domainandname,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
-                       EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                MembersInfo3->lgrmi3_domainandname = Ptr;
+
+                if (EnumContext->Names[i].DomainIndex >= 0)
+                {
+                    memcpy(MembersInfo3->lgrmi3_domainandname,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
+                           EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
 
-                *((LPWSTR)Ptr) = L'\\';
+                    *((LPWSTR)Ptr) = L'\\';
 
-                Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                    Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
+                }
 
                 memcpy(Ptr,
                        EnumContext->Names[i].Name.Buffer,
                        EnumContext->Names[i].Name.Length);
+                Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
+                MembersInfo3++;
                 break;
         }
     }
@@ -1859,7 +1880,9 @@ done:
 /************************************************************
  *                NetLocalGroupSetMember (NETAPI32.@)
  */
-NET_API_STATUS WINAPI NetLocalGroupSetMembers(
+NET_API_STATUS
+WINAPI
+NetLocalGroupSetMembers(
     LPCWSTR servername,
     LPCWSTR groupname,
     DWORD level,