Hans Leidekker : iphlpapi: Add partial support for UDP_TABLE_OWNER_MODULE in GetExtendedUdpTable.

Alexandre Julliard julliard at winehq.org
Fri Sep 7 13:26:21 CDT 2012


Module: wine
Branch: master
Commit: bc8876f9ce24beda5dba4a4413543f163fa154bb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bc8876f9ce24beda5dba4a4413543f163fa154bb

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Sep  7 13:35:48 2012 +0200

iphlpapi: Add partial support for UDP_TABLE_OWNER_MODULE in GetExtendedUdpTable.

---

 dlls/iphlpapi/iphlpapi_main.c |    6 +++++-
 dlls/iphlpapi/ipstats.c       |   15 +++++++++++----
 include/udpmib.h              |   23 +++++++++++++++++++++++
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index a9ab1e0..f3568b8 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1935,11 +1935,15 @@ DWORD WINAPI GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder,
     if (!pdwSize) return ERROR_INVALID_PARAMETER;
 
     if (ulAf != AF_INET ||
-        (TableClass != UDP_TABLE_BASIC && TableClass != UDP_TABLE_OWNER_PID))
+        (TableClass != UDP_TABLE_BASIC && TableClass != UDP_TABLE_OWNER_PID &&
+         TableClass != UDP_TABLE_OWNER_MODULE))
     {
         FIXME("ulAf = %u, TableClass = %u not supported\n", ulAf, TableClass);
         return ERROR_NOT_SUPPORTED;
     }
+    if (TableClass == UDP_TABLE_OWNER_MODULE)
+        FIXME("UDP_TABLE_OWNER_MODULE not fully supported\n");
+
     if ((ret = build_udp_table(TableClass, &table, bOrder, GetProcessHeap(), 0, &size)))
         return ret;
 
diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c
index 18307d5..7c64b41 100644
--- a/dlls/iphlpapi/ipstats.c
+++ b/dlls/iphlpapi/ipstats.c
@@ -1837,6 +1837,12 @@ static DWORD get_udp_table_sizes( UDP_TABLE_CLASS class, DWORD row_count, DWORD
         if (row_size) *row_size = sizeof(MIB_UDPROW_OWNER_PID);
         break;
     }
+    case UDP_TABLE_OWNER_MODULE:
+    {
+        table_size = FIELD_OFFSET(MIB_UDPTABLE_OWNER_MODULE, table[row_count]);
+        if (row_size) *row_size = sizeof(MIB_UDPROW_OWNER_MODULE);
+        break;
+    }
     default:
         ERR("unhandled class %u\n", class);
         return 0;
@@ -1846,7 +1852,7 @@ static DWORD get_udp_table_sizes( UDP_TABLE_CLASS class, DWORD row_count, DWORD
 
 static MIB_UDPTABLE *append_udp_row( UDP_TABLE_CLASS class, HANDLE heap, DWORD flags,
                                      MIB_UDPTABLE *table, DWORD *count,
-                                     const MIB_UDPROW_OWNER_PID *row, DWORD row_size )
+                                     const MIB_UDPROW_OWNER_MODULE *row, DWORD row_size )
 {
     if (table->dwNumEntries >= *count)
     {
@@ -1881,7 +1887,7 @@ DWORD build_udp_table( UDP_TABLE_CLASS class, void **tablep, BOOL order, HANDLE
                        DWORD *size )
 {
     MIB_UDPTABLE *table;
-    MIB_UDPROW_OWNER_PID row;
+    MIB_UDPROW_OWNER_MODULE row;
     DWORD ret = NO_ERROR, count = 16, table_size, row_size;
 
     if (!(table_size = get_udp_table_sizes( class, count, &row_size )))
@@ -1904,7 +1910,8 @@ DWORD build_udp_table( UDP_TABLE_CLASS class, void **tablep, BOOL order, HANDLE
             unsigned int dummy, num_entries = 0;
             int inode;
 
-            if (class == UDP_TABLE_OWNER_PID) map = get_pid_map( &num_entries );
+            if (class == UDP_TABLE_OWNER_PID || class == UDP_TABLE_OWNER_MODULE)
+                map = get_pid_map( &num_entries );
 
             /* skip header line */
             ptr = fgets( buf, sizeof(buf), fp );
@@ -1914,7 +1921,7 @@ DWORD build_udp_table( UDP_TABLE_CLASS class, void **tablep, BOOL order, HANDLE
                     &row.dwLocalAddr, &row.dwLocalPort, &inode ) != 4)
                     continue;
                 row.dwLocalPort = htons( row.dwLocalPort );
-                if (class == UDP_TABLE_OWNER_PID)
+                if (class == UDP_TABLE_OWNER_PID || class == UDP_TABLE_OWNER_MODULE)
                     row.dwOwningPid = find_owning_pid( map, num_entries, inode );
                 if (!(table = append_udp_row( class, heap, flags, table, &count, &row, row_size )))
                     break;
diff --git a/include/udpmib.h b/include/udpmib.h
index c2d507f..6b3f51c 100644
--- a/include/udpmib.h
+++ b/include/udpmib.h
@@ -48,6 +48,29 @@ typedef struct _MIB_UDPTABLE_OWNER_PID
     MIB_UDPROW_OWNER_PID table[1];
 } MIB_UDPTABLE_OWNER_PID, *PMIB_UDPTABLE_OWNER_PID;
 
+typedef struct _MIB_UDPROW_OWNER_MODULE
+{
+    DWORD         dwLocalAddr;
+    DWORD         dwLocalPort;
+    DWORD         dwOwningPid;
+    LARGE_INTEGER liCreateTimestamp;
+    __C89_NAMELESS union
+    {
+        __C89_NAMELESS struct
+        {
+            int SpecificPortBind:1;
+        } __C89_NAMELESSSTRUCTNAME;
+        int dwFlags;
+    } __C89_NAMELESSUNIONNAME;
+    ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
+} MIB_UDPROW_OWNER_MODULE, *PMIB_UDPROW_OWNER_MODULE;
+
+typedef struct _MIB_UDPTABLE_OWNER_MODULE
+{
+    DWORD                   dwNumEntries;
+    MIB_UDPROW_OWNER_MODULE table[1];
+} MIB_UDPTABLE_OWNER_MODULE, *PMIB_UDPTABLE_OWNER_MODULE;
+
 /* UDP statistics */
 
 typedef struct _MIB_UDPSTATS




More information about the wine-cvs mailing list