Huw Davies : iphlpapi: Implement GetIfEntry() on top of nsi.

Alexandre Julliard julliard at winehq.org
Fri Jul 9 16:45:33 CDT 2021


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Jul  9 09:09:26 2021 +0100

iphlpapi: Implement GetIfEntry() on top of nsi.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/iphlpapi/ifenum.c        | 41 -----------------------------------------
 dlls/iphlpapi/ifenum.h        |  7 -------
 dlls/iphlpapi/iphlpapi_main.c | 33 ++++++++++++++++-----------------
 3 files changed, 16 insertions(+), 65 deletions(-)

diff --git a/dlls/iphlpapi/ifenum.c b/dlls/iphlpapi/ifenum.c
index 3b4ac775db7..8108c7ff8c2 100644
--- a/dlls/iphlpapi/ifenum.c
+++ b/dlls/iphlpapi/ifenum.c
@@ -745,47 +745,6 @@ DWORD getInterfaceStatusByName(const char *name, INTERNAL_IF_OPER_STATUS *status
   return ret;
 }
 
-DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry)
-{
-  BYTE addr[MAX_INTERFACE_PHYSADDR];
-  DWORD ret, len = sizeof(addr), type;
-
-  if (!name)
-    return ERROR_INVALID_PARAMETER;
-  if (!entry)
-    return ERROR_INVALID_PARAMETER;
-
-  if (getInterfacePhysicalByName(name, &len, addr, &type) == NO_ERROR) {
-    WCHAR *assigner;
-    const char *walker;
-
-    memset(entry, 0, sizeof(MIB_IFROW));
-    for (assigner = entry->wszName, walker = name; *walker; 
-     walker++, assigner++)
-      *assigner = *walker;
-    *assigner = 0;
-    getInterfaceIndexByName(name, &entry->dwIndex);
-    entry->dwPhysAddrLen = len;
-    memcpy(entry->bPhysAddr, addr, len);
-    memset(entry->bPhysAddr + len, 0, sizeof(entry->bPhysAddr) - len);
-    entry->dwType = type;
-    /* FIXME: how to calculate real speed? */
-    getInterfaceMtuByName(name, &entry->dwMtu);
-    /* lie, there's no "administratively down" here */
-    entry->dwAdminStatus = MIB_IF_ADMIN_STATUS_UP;
-    getInterfaceStatusByName(name, &entry->dwOperStatus);
-    /* punt on dwLastChange? */
-    entry->dwDescrLen = min(strlen(name), MAX_INTERFACE_DESCRIPTION - 1);
-    memcpy(entry->bDescr, name, entry->dwDescrLen);
-    entry->bDescr[entry->dwDescrLen] = '\0';
-    entry->dwDescrLen++;
-    ret = NO_ERROR;
-  }
-  else
-    ret = ERROR_INVALID_DATA;
-  return ret;
-}
-
 static DWORD getIPAddrRowByName(PMIB_IPADDRROW ipAddrRow, const char *ifName,
  const struct sockaddr *sa)
 {
diff --git a/dlls/iphlpapi/ifenum.h b/dlls/iphlpapi/ifenum.h
index 558dff64cb6..d0143eaaf69 100644
--- a/dlls/iphlpapi/ifenum.h
+++ b/dlls/iphlpapi/ifenum.h
@@ -87,13 +87,6 @@ DWORD getInterfaceIndexByName(const char *name, IF_INDEX *index) DECLSPEC_HIDDEN
 DWORD getInterfacePhysicalByIndex(IF_INDEX index, PDWORD len, PBYTE addr,
  PDWORD type) DECLSPEC_HIDDEN;
 
-/* Fills in the MIB_IFROW by name.  Doesn't fill in interface statistics,
- * see ipstats.h for that.
- * Returns ERROR_INVALID_PARAMETER if name is NULL, ERROR_INVALID_DATA
- * if name isn't valid, and NO_ERROR otherwise.
- */
-DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry) DECLSPEC_HIDDEN;
-
 DWORD getNumIPAddresses(void) DECLSPEC_HIDDEN;
 
 /* Gets the configured IP addresses for the system, and sets *ppIpAddrTable to
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index e5b6e72bde1..375766f1e9c 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1821,26 +1821,25 @@ static void if_row_fill( MIB_IFROW *row, struct nsi_ndis_ifinfo_rw *rw, struct n
  *  Success: NO_ERROR
  *  Failure: error code from winerror.h
  */
-DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow)
+DWORD WINAPI GetIfEntry( MIB_IFROW *row )
 {
-  DWORD ret;
-  char nameBuf[MAX_ADAPTER_NAME];
-  char *name;
+    struct nsi_ndis_ifinfo_rw rw;
+    struct nsi_ndis_ifinfo_dynamic dyn;
+    struct nsi_ndis_ifinfo_static stat;
+    NET_LUID luid;
+    DWORD err;
 
-  TRACE("pIfRow %p\n", pIfRow);
-  if (!pIfRow)
-    return ERROR_INVALID_PARAMETER;
+    TRACE( "row %p\n", row );
+    if (!row) return ERROR_INVALID_PARAMETER;
 
-  name = getInterfaceNameByIndex(pIfRow->dwIndex, nameBuf);
-  if (name) {
-    ret = getInterfaceEntryByName(name, pIfRow);
-    if (ret == NO_ERROR)
-      ret = getInterfaceStatsByName(name, pIfRow);
-  }
-  else
-    ret = ERROR_INVALID_DATA;
-  TRACE("returning %d\n", ret);
-  return ret;
+    err = ConvertInterfaceIndexToLuid( row->dwIndex, &luid );
+    if (err) return err;
+
+    err = NsiGetAllParameters( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE,
+                               &luid, sizeof(luid), &rw, sizeof(rw),
+                               &dyn, sizeof(dyn), &stat, sizeof(stat) );
+    if (!err) if_row_fill( row, &rw, &dyn, &stat );
+    return err;
 }
 
 static int ifrow_cmp( const void *a, const void *b )




More information about the wine-cvs mailing list