[MPR]
authorPierre Schweitzer <pierre@reactos.org>
Fri, 23 Jun 2017 19:21:29 +0000 (19:21 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Fri, 23 Jun 2017 19:21:29 +0000 (19:21 +0000)
Import Wine commit:
51b4a42969366cc409808aded23d3602a34206e2, Properly handle the count set to -1 when enumerating connections.

This fixes 'net use' not being able to enumerate multiple connections served by multiple network providers.

CORE-13475

svn path=/trunk/; revision=75172

reactos/dll/win32/mpr/wnet.c

index 77c0985..37ad58f 100644 (file)
@@ -1400,7 +1400,7 @@ static DWORD _copyStringToEnumW(const WCHAR *source, DWORD* left, void** end)
 static DWORD _enumerateConnectedW(PWNetEnumerator enumerator, DWORD* user_count,
                                   void* user_buffer, DWORD* user_size)
 {
 static DWORD _enumerateConnectedW(PWNetEnumerator enumerator, DWORD* user_count,
                                   void* user_buffer, DWORD* user_size)
 {
-    DWORD ret, index, count, size, i, left;
+    DWORD ret, index, count, total_count, size, i, left;
     void* end;
     NETRESOURCEW* curr, * buffer;
     HANDLE* handles;
     void* end;
     NETRESOURCEW* curr, * buffer;
     HANDLE* handles;
@@ -1424,6 +1424,7 @@ static DWORD _enumerateConnectedW(PWNetEnumerator enumerator, DWORD* user_count,
     curr = user_buffer;
     end = (char *)user_buffer + size;
     count = *user_count;
     curr = user_buffer;
     end = (char *)user_buffer + size;
     count = *user_count;
+    total_count = 0;
 
     ret = WN_NO_MORE_ENTRIES;
     for (index = 0; index < providerTable->numProviders; index++)
 
     ret = WN_NO_MORE_ENTRIES;
     for (index = 0; index < providerTable->numProviders; index++)
@@ -1443,6 +1444,7 @@ static DWORD _enumerateConnectedW(PWNetEnumerator enumerator, DWORD* user_count,
             ret = providerTable->table[index].enumResource(handles[index],
                                                            &count, buffer,
                                                            &size);
             ret = providerTable->table[index].enumResource(handles[index],
                                                            &count, buffer,
                                                            &size);
+            total_count += count;
             if (ret == WN_MORE_DATA)
                 break;
 
             if (ret == WN_MORE_DATA)
                 break;
 
@@ -1477,19 +1479,22 @@ static DWORD _enumerateConnectedW(PWNetEnumerator enumerator, DWORD* user_count,
                     ++curr;
                 }
 
                     ++curr;
                 }
 
-                count = *user_count - count;
+                if (*user_count != -1)
+                    count = *user_count - total_count;
+                else
+                    count = *user_count;
                 size = left;
             }
 
                 size = left;
             }
 
-            if (ret != WN_SUCCESS || count == 0)
+            if (ret != WN_SUCCESS || total_count == 0)
                 break;
         }
     }
 
                 break;
         }
     }
 
-    if (count == 0)
+    if (total_count == 0)
         ret = WN_NO_MORE_ENTRIES;
 
         ret = WN_NO_MORE_ENTRIES;
 
-    *user_count = *user_count - count;
+    *user_count = total_count;
     if (ret != WN_MORE_DATA && ret != WN_NO_MORE_ENTRIES)
         ret = WN_SUCCESS;
 
     if (ret != WN_MORE_DATA && ret != WN_NO_MORE_ENTRIES)
         ret = WN_SUCCESS;