Huw Davies : iphlpapi: Implement AllocateAndGetIpAddrTableFromStack() on top of GetIpAddrTable().
Alexandre Julliard
julliard at winehq.org
Thu Jul 22 16:28:19 CDT 2021
Module: wine
Branch: master
Commit: 24ca70a60cbe61ea70e7710ae7724f0ab7b4105b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=24ca70a60cbe61ea70e7710ae7724f0ab7b4105b
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Jul 22 12:50:18 2021 +0100
iphlpapi: Implement AllocateAndGetIpAddrTableFromStack() on top of GetIpAddrTable().
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/iphlpapi/iphlpapi_main.c | 76 +++++++++++++++++++------------------------
1 file changed, 34 insertions(+), 42 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 8442bc2b4a9..6e1d95ab321 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -139,48 +139,6 @@ DWORD WINAPI AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG N
return ERROR_NOT_SUPPORTED;
}
-static int IpAddrTableNumericSorter(const void *a, const void *b)
-{
- int ret = 0;
-
- if (a && b)
- ret = ((const MIB_IPADDRROW*)a)->dwAddr - ((const MIB_IPADDRROW*)b)->dwAddr;
- return ret;
-}
-
-/******************************************************************
- * AllocateAndGetIpAddrTableFromStack (IPHLPAPI.@)
- *
- * Get interface-to-IP address mapping table.
- * Like GetIpAddrTable(), but allocate the returned table from heap.
- *
- * PARAMS
- * ppIpAddrTable [Out] pointer into which the MIB_IPADDRTABLE is
- * allocated and returned.
- * bOrder [In] whether to sort the table
- * heap [In] heap from which the table is allocated
- * flags [In] flags to HeapAlloc
- *
- * RETURNS
- * ERROR_INVALID_PARAMETER if ppIpAddrTable is NULL, other error codes on
- * failure, NO_ERROR on success.
- */
-DWORD WINAPI AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable,
- BOOL bOrder, HANDLE heap, DWORD flags)
-{
- DWORD ret;
-
- TRACE("ppIpAddrTable %p, bOrder %d, heap %p, flags 0x%08x\n",
- ppIpAddrTable, bOrder, heap, flags);
- ret = getIPAddrTable(ppIpAddrTable, heap, flags);
- if (!ret && bOrder)
- qsort((*ppIpAddrTable)->table, (*ppIpAddrTable)->dwNumEntries,
- sizeof(MIB_IPADDRROW), IpAddrTableNumericSorter);
- TRACE("returning %d\n", ret);
- return ret;
-}
-
-
/******************************************************************
* CancelIPChangeNotify (IPHLPAPI.@)
*
@@ -2189,6 +2147,40 @@ err:
}
+/******************************************************************
+ * AllocateAndGetIpAddrTableFromStack (IPHLPAPI.@)
+ *
+ * Get interface-to-IP address mapping table.
+ * Like GetIpAddrTable(), but allocate the returned table from heap.
+ *
+ * PARAMS
+ * table [Out] pointer into which the MIB_IPADDRTABLE is
+ * allocated and returned.
+ * sort [In] whether to sort the table
+ * heap [In] heap from which the table is allocated
+ * flags [In] flags to HeapAlloc
+ *
+ */
+DWORD WINAPI AllocateAndGetIpAddrTableFromStack( MIB_IPADDRTABLE **table, BOOL sort, HANDLE heap, DWORD flags )
+{
+ DWORD err, size = FIELD_OFFSET(MIB_IPADDRTABLE, table[2]), attempt;
+
+ TRACE( "table %p, sort %d, heap %p, flags 0x%08x\n", table, sort, heap, flags );
+
+ for (attempt = 0; attempt < 5; attempt++)
+ {
+ *table = HeapAlloc( heap, flags, size );
+ if (!*table) return ERROR_NOT_ENOUGH_MEMORY;
+
+ err = GetIpAddrTable( *table, &size, sort );
+ if (!err) break;
+ HeapFree( heap, flags, *table );
+ if (err != ERROR_INSUFFICIENT_BUFFER) break;
+ }
+
+ return err;
+}
+
/******************************************************************
* GetIpForwardTable (IPHLPAPI.@)
*
More information about the wine-cvs
mailing list