Zebediah Figura : iphlpapi: Reimplement get_pid_map() using the list_processes request.

Alexandre Julliard julliard at winehq.org
Tue Jul 7 15:47:06 CDT 2020


Module: wine
Branch: master
Commit: 747573f1e4f4195772b055f5c4af227a58964f55
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=747573f1e4f4195772b055f5c4af227a58964f55

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Jul  6 21:06:01 2020 -0500

iphlpapi: Reimplement get_pid_map() using the list_processes request.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/iphlpapi/ipstats.c | 85 ++++++++++++++++++++++++++++---------------------
 1 file changed, 49 insertions(+), 36 deletions(-)

diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c
index 11d52d4d65..03e53abfb4 100644
--- a/dlls/iphlpapi/ipstats.c
+++ b/dlls/iphlpapi/ipstats.c
@@ -1887,56 +1887,69 @@ struct pid_map
 
 static struct pid_map *get_pid_map( unsigned int *num_entries )
 {
-    HANDLE snapshot = NULL;
     struct pid_map *map;
-    unsigned int i = 0, count = 16, size = count * sizeof(*map);
+    unsigned int i = 0, map_count = 16, buffer_len = 4096, process_count, pos = 0;
     NTSTATUS ret;
+    char *buffer = NULL, *new_buffer;
 
-    if (!(map = HeapAlloc( GetProcessHeap(), 0, size ))) return NULL;
+    if (!(buffer = HeapAlloc( GetProcessHeap(), 0, buffer_len ))) return NULL;
 
-    SERVER_START_REQ( create_snapshot )
+    for (;;)
+    {
+        SERVER_START_REQ( list_processes )
+        {
+            wine_server_set_reply( req, buffer, buffer_len );
+            ret = wine_server_call( req );
+            buffer_len = reply->info_size;
+            process_count = reply->process_count;
+        }
+        SERVER_END_REQ;
+
+        if (ret != STATUS_INFO_LENGTH_MISMATCH) break;
+
+        if (!(new_buffer = HeapReAlloc( GetProcessHeap(), 0, buffer, buffer_len )))
+        {
+            HeapFree( GetProcessHeap(), 0, buffer );
+            return NULL;
+        }
+    }
+
+    if (!(map = HeapAlloc( GetProcessHeap(), 0, map_count * sizeof(*map) )))
     {
-        req->flags      = SNAP_PROCESS;
-        req->attributes = 0;
-        if (!(ret = wine_server_call( req )))
-            snapshot = wine_server_ptr_handle( reply->handle );
+        HeapFree( GetProcessHeap(), 0, buffer );
+        return NULL;
     }
-    SERVER_END_REQ;
 
-    *num_entries = 0;
-    while (ret == STATUS_SUCCESS)
+    for (i = 0; i < process_count; ++i)
     {
-        SERVER_START_REQ( next_process )
+        const struct process_info *process;
+
+        pos = (pos + 7) & ~7;
+        process = (const struct process_info *)(buffer + pos);
+
+        if (i >= map_count)
         {
-            req->handle = wine_server_obj_handle( snapshot );
-            req->reset = (i == 0);
-            if (!(ret = wine_server_call( req )))
+            struct pid_map *new_map;
+            map_count *= 2;
+            if (!(new_map = HeapReAlloc( GetProcessHeap(), 0, map, map_count * sizeof(*map))))
             {
-                if (i >= count)
-                {
-                    struct pid_map *new_map;
-                    count *= 2;
-                    size = count * sizeof(*new_map);
-
-                    if (!(new_map = HeapReAlloc( GetProcessHeap(), 0, map, size )))
-                    {
-                        HeapFree( GetProcessHeap(), 0, map );
-                        map = NULL;
-                        goto done;
-                    }
-                    map = new_map;
-                }
-                map[i].pid = reply->pid;
-                map[i].unix_pid = reply->unix_pid;
-                (*num_entries)++;
-                i++;
+                HeapFree( GetProcessHeap(), 0, map );
+                HeapFree( GetProcessHeap(), 0, buffer );
+                return NULL;
             }
+            map = new_map;
         }
-        SERVER_END_REQ;
+
+        map[i].pid = process->pid;
+        map[i].unix_pid = process->unix_pid;
+
+        pos += sizeof(struct process_info) + process->name_len;
+        pos = (pos + 7) & ~7;
+        pos += process->thread_count * sizeof(struct thread_info);
     }
 
-done:
-    NtClose( snapshot );
+    HeapFree( GetProcessHeap(), 0, buffer );
+    *num_entries = process_count;
     return map;
 }
 




More information about the wine-cvs mailing list