update for HEAD-2003091401
[reactos.git] / lib / iphlpapi / iphlpapi.c
index 7ddb040..114259b 100644 (file)
 #include <tchar.h>
 #include <time.h>
 
+#include <winsock2.h>
 #include <iptypes.h>
 #include <ipexport.h>
 #include <iphlpapi.h>
+#include <icmpapi.h>
 
 #include "debug.h"
 //#include "trace.h"
@@ -37,7 +39,7 @@ DWORD DebugTraceLevel = MAX_TRACE;
 //VOID STDCALL KeBugCheck (ULONG       BugCheckCode) {}
 
 
-BOOL
+WINBOOL
 EXPORT
 DllMain(HANDLE hInstDll,
         ULONG dwReason,
@@ -65,8 +67,11 @@ DllMain(HANDLE hInstDll,
 }
 
 
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL
 AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PULONG NTEInstance)
 {
     UNIMPLEMENTED
@@ -74,16 +79,23 @@ AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PU
 }
 
 
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL
 SetIpNetEntry(PMIB_IPNETROW pArpEntry)
 {
     UNIMPLEMENTED
     return 0L;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute)
 {
     UNIMPLEMENTED
@@ -91,29 +103,162 @@ CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute)
 }
 
 
-#ifdef __GNUC__
-
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex)
 {
     return 0;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
 {
-    return 0;
-}
+       LONG lErr;
+       DWORD dwSize;
+       DWORD dwIndex;
+       BYTE* pNextMemFree = (BYTE*) pAdapterInfo;
+       ULONG uUsedMemory = 0;
+       PIP_ADAPTER_INFO pPrevAdapter = NULL;
+       PIP_ADAPTER_INFO pCurrentAdapter = NULL;
+       HKEY hAdapters;
+       HKEY hAdapter;
+       HKEY hIpConfig;
+       wchar_t* strAdapter;
+       wchar_t* strTemp1;
+       wchar_t* strTemp2;
+       DWORD dwAdapterLen;
+       char strTemp[MAX_ADAPTER_NAME_LENGTH + 4];
 
-#endif
+       if(pAdapterInfo == NULL && pOutBufLen == NULL)
+               return ERROR_INVALID_PARAMETER;
+       ZeroMemory(pAdapterInfo, *pOutBufLen);
+
+       lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters", 0, KEY_READ, &hAdapters);
+       if(lErr != ERROR_SUCCESS)
+               return lErr;
+
+       //      Determine the size of the largest name of any adapter and the number of adapters.
+       lErr = RegQueryInfoKeyW(hAdapters, NULL, NULL, NULL, NULL, &dwAdapterLen, NULL, NULL, NULL, NULL, NULL, NULL);
+    if(lErr != ERROR_SUCCESS)
+       {
+               RegCloseKey(hAdapters);
+               return lErr;
+       }
+       dwAdapterLen++; // RegQueryInfoKeyW return value does not include terminating null.
+
+       strAdapter = (wchar_t*) malloc(dwAdapterLen * sizeof(wchar_t));
+
+       //      Enumerate all adapters in SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters.
+       for(dwIndex = 0; ; dwIndex++)
+       {
+               dwSize = dwAdapterLen;                  //      Reset size of the strAdapterLen buffer.
+               lErr = RegEnumKeyExW(hAdapters, dwIndex, strAdapter, &dwSize, NULL, NULL, NULL, NULL);
+               if(lErr == ERROR_NO_MORE_ITEMS)
+                       break;
+
+               //      TODO    Skip NdisWanIP???
+               if(wcsstr(strAdapter, L"NdisWanIp") != 0)
+                       continue;
+
+               lErr = RegOpenKeyExW(hAdapters, strAdapter, 0, KEY_READ, &hAdapter);
+               if(lErr != ERROR_SUCCESS)
+                       continue;
+
+               //      Read the IpConfig value.
+               lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, NULL, &dwSize);
+               if(lErr != ERROR_SUCCESS)
+                       continue;
+
+               strTemp1 = (wchar_t*) malloc(dwSize);
+               strTemp2 = (wchar_t*) malloc(dwSize + 35 * sizeof(wchar_t));
+               lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, (BYTE*) strTemp1, &dwSize);
+               if(lErr != ERROR_SUCCESS)
+               {
+                       free(strTemp1);
+                       free(strTemp2);
+                       continue;
+               }
+               swprintf(strTemp2, L"SYSTEM\\CurrentControlSet\\Services\\%s", strTemp1);
+
+               //      Open the IpConfig key.
+               lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, strTemp2, 0, KEY_READ, &hIpConfig);
+               if(lErr != ERROR_SUCCESS)
+               {
+                       free(strTemp1);
+                       free(strTemp2);
+                       continue;
+               }
+               free((void*) strTemp1);
+               free((void*) strTemp2);
+               
+
+               //      Fill IP_ADAPTER_INFO block.
+               pCurrentAdapter = (IP_ADAPTER_INFO*) pNextMemFree;
+               pNextMemFree += sizeof(IP_ADAPTER_INFO);
+               uUsedMemory += sizeof(IP_ADAPTER_INFO);
+               if(uUsedMemory > *pOutBufLen)
+                       return ERROR_BUFFER_OVERFLOW;                           //      TODO    return the needed size
+
+                       //      struct _IP_ADAPTER_INFO* Next
+               if(pPrevAdapter != NULL)
+                       pPrevAdapter->Next = pCurrentAdapter;
+                       //      TODO    DWORD ComboIndex
+                       //      char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]
+               wcstombs(strTemp, strAdapter, MAX_ADAPTER_NAME_LENGTH + 4);
+               strcpy(pCurrentAdapter->AdapterName, strTemp);
+                       //      TODO    char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]
+                       //      TODO    UINT AddressLength
+                       //      TODO    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]
+                       //      TODO    DWORD Index
+                       //      TODO    UINT Type
+                       //      TODO    UINT DhcpEnabled
+                       //      TODO    PIP_ADDR_STRING CurrentIpAddress
+                       //      IP_ADDR_STRING IpAddressList
+               dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"IPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize);
+               dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"SubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize);
+               if(strstr(pCurrentAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0)
+               {       
+                       dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpIPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize);
+                       dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize);
+               }
+                       //      TODO    IP_ADDR_STRING GatewayList
+                       //      IP_ADDR_STRING DhcpServer
+               dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpServer", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpAddress, &dwSize);
+               dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpMask, &dwSize);
+                       //      TODO    BOOL HaveWins
+                       //      TODO    IP_ADDR_STRING PrimaryWinsServer
+                       //      TODO    IP_ADDR_STRING SecondaryWinsServer
+                       //      TODO    time_t LeaseObtained
+                       //      TODO    time_t LeaseExpires
+
+               pPrevAdapter = pCurrentAdapter;
+               RegCloseKey(hAdapter);
+               RegCloseKey(hIpConfig);
+       }
+
+       //      Cleanup
+       free(strAdapter);
+       RegCloseKey(hAdapters);
+
+       return ERROR_SUCCESS;
+}
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
+/*
+ * @implemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetNumberOfInterfaces(OUT PDWORD pdwNumIf)
 {
     DWORD result = NO_ERROR;
@@ -147,8 +292,11 @@ GetNumberOfInterfaces(OUT PDWORD pdwNumIf)
 }
 
 
+/*
+ * @implemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG pOutBufLen)
 {
     DWORD result = ERROR_SUCCESS;
@@ -197,68 +345,86 @@ GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG pOutBufLen)
     return result;
 }
 
+
+/*
+ * @implemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
 {
-    DWORD result = ERROR_SUCCESS;
-    DWORD dwSize;
-    HKEY hKey;
-    LONG errCode;
+  DWORD result = ERROR_SUCCESS;
+  DWORD dwSize;
+  HKEY hKey;
+  LONG errCode;
 
-    if (pFixedInfo == NULL || pOutBufLen == NULL) return ERROR_INVALID_PARAMETER;
+  if (pFixedInfo == NULL || pOutBufLen == NULL) return ERROR_INVALID_PARAMETER;
 
-    if (*pOutBufLen < sizeof(FIXED_INFO)) {
-        *pOutBufLen = sizeof(FIXED_INFO);
-        return ERROR_BUFFER_OVERFLOW;
-    }
-    memset(pFixedInfo, 0, sizeof(FIXED_INFO));
+  if (*pOutBufLen < sizeof(FIXED_INFO))
+  {
+    *pOutBufLen = sizeof(FIXED_INFO);
+    return ERROR_BUFFER_OVERFLOW;
+  }
+  memset(pFixedInfo, 0, sizeof(FIXED_INFO));
 
-        errCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"), 0, KEY_READ, &hKey);
-        if (errCode == ERROR_SUCCESS) {
-            dwSize = sizeof(pFixedInfo->HostName);
-            errCode = RegQueryValueExA(hKey, "Hostname", NULL, NULL, (LPBYTE)&pFixedInfo->HostName, &dwSize);
-            dwSize = sizeof(pFixedInfo->DomainName);
-            errCode = RegQueryValueExA(hKey, "Domain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
-            if (errCode != ERROR_SUCCESS) {
-                dwSize = sizeof(pFixedInfo->DomainName);
-                errCode = RegQueryValueExA(hKey, "DhcpDomain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
-            }
-            dwSize = sizeof(pFixedInfo->EnableRouting);
-            errCode = RegQueryValueEx(hKey, _T("IPEnableRouter"), NULL, NULL, (LPBYTE)&pFixedInfo->EnableRouting, &dwSize);
-            RegCloseKey(hKey);
-        } else {
-            result = ERROR_NO_DATA; // No adapter information exists for the local computer
-        }
+  errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey);
+  if (errCode == ERROR_SUCCESS)
+  {
+    dwSize = sizeof(pFixedInfo->HostName);
+    errCode = RegQueryValueExA(hKey, "Hostname", NULL, NULL, (LPBYTE)&pFixedInfo->HostName, &dwSize);
+    dwSize = sizeof(pFixedInfo->DomainName);
+    errCode = RegQueryValueExA(hKey, "Domain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
+    if (errCode != ERROR_SUCCESS)
+    {
+      dwSize = sizeof(pFixedInfo->DomainName);
+      errCode = RegQueryValueExA(hKey, "DhcpDomain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
+    }
+    dwSize = sizeof(pFixedInfo->EnableRouting);
+    errCode = RegQueryValueExW(hKey, L"IPEnableRouter", NULL, NULL, (LPBYTE)&pFixedInfo->EnableRouting, &dwSize);
+    RegCloseKey(hKey);
+  }
+  else
+  {
+    result = ERROR_NO_DATA; // No adapter information exists for the local computer
+  }
 
-        errCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters"), 0, KEY_READ, &hKey);
-        if (errCode == ERROR_SUCCESS) {
-            dwSize = sizeof(pFixedInfo->ScopeId);
-            errCode = RegQueryValueExA(hKey, "ScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
-            if (errCode != ERROR_SUCCESS) {
-                dwSize = sizeof(pFixedInfo->ScopeId);
-                errCode = RegQueryValueExA(hKey, "DhcpScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
-            }
-            dwSize = sizeof(pFixedInfo->NodeType);
-            errCode = RegQueryValueEx(hKey, _T("NodeType"), NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
-            if (errCode != ERROR_SUCCESS) {
-                dwSize = sizeof(pFixedInfo->NodeType);
-                errCode = RegQueryValueExA(hKey, "DhcpNodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
-            }
-            dwSize = sizeof(pFixedInfo->EnableProxy);
-            errCode = RegQueryValueEx(hKey, _T("EnableProxy"), NULL, NULL, (LPBYTE)&pFixedInfo->EnableProxy, &dwSize);
-            dwSize = sizeof(pFixedInfo->EnableDns);
-            errCode = RegQueryValueEx(hKey, _T("EnableDNS"), NULL, NULL, (LPBYTE)&pFixedInfo->EnableDns, &dwSize);
-            RegCloseKey(hKey);
-        } else {
-            result = ERROR_NO_DATA; // No adapter information exists for the local computer
-        }
+  errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", 0, KEY_READ, &hKey);
+  if (errCode == ERROR_SUCCESS)
+  {
+    dwSize = sizeof(pFixedInfo->ScopeId);
+    errCode = RegQueryValueExA(hKey, "ScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
+    if (errCode != ERROR_SUCCESS)
+    {
+      dwSize = sizeof(pFixedInfo->ScopeId);
+      errCode = RegQueryValueExA(hKey, "DhcpScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
+    }
+    dwSize = sizeof(pFixedInfo->NodeType);
+    errCode = RegQueryValueExW(hKey, L"NodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
+    if (errCode != ERROR_SUCCESS)
+    {
+      dwSize = sizeof(pFixedInfo->NodeType);
+      errCode = RegQueryValueExA(hKey, "DhcpNodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
+    }
+    dwSize = sizeof(pFixedInfo->EnableProxy);
+    errCode = RegQueryValueExW(hKey, L"EnableProxy", NULL, NULL, (LPBYTE)&pFixedInfo->EnableProxy, &dwSize);
+    dwSize = sizeof(pFixedInfo->EnableDns);
+    errCode = RegQueryValueExW(hKey, L"EnableDNS", NULL, NULL, (LPBYTE)&pFixedInfo->EnableDns, &dwSize);
+    RegCloseKey(hKey);
+  }
+  else
+  {
+    result = ERROR_NO_DATA; // No adapter information exists for the local computer
+  }
 
-    return result;
+  return result;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetTcpStatistics(PMIB_TCPSTATS pStats)
 {
     DWORD result = NO_ERROR;
@@ -268,9 +434,13 @@ GetTcpStatistics(PMIB_TCPSTATS pStats)
     return result;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
-GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder)
+STDCALL 
+GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, WINBOOL bOrder)
 {
     DWORD result = NO_ERROR;
 
@@ -279,8 +449,12 @@ GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder)
     return result;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 GetUdpStatistics(PMIB_UDPSTATS pStats)
 {
     DWORD result = NO_ERROR;
@@ -290,9 +464,13 @@ GetUdpStatistics(PMIB_UDPSTATS pStats)
     return result;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
-GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder)
+STDCALL 
+GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, WINBOOL bOrder)
 {
     DWORD result = NO_ERROR;
 
@@ -301,8 +479,12 @@ GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder)
     return result;
 }
 
+
+/*
+ * @unimplemented
+ */
 DWORD
-WINAPI
+STDCALL 
 FlushIpNetTable(DWORD dwIfIndex)
 {
     DWORD result = NO_ERROR;
@@ -310,5 +492,614 @@ FlushIpNetTable(DWORD dwIfIndex)
     return result;
 }
 
-/* EOF */
+/******************************************************************
+ *    GetIfEntry (IPHLPAPI.@)
+ *
+ *
+ * PARAMS
+ *
+ *  pIfRow [In/Out]
+ *
+ * RETURNS
+ *
+ *  DWORD
+ *
+ */
+DWORD
+STDCALL  
+GetIfEntry(PMIB_IFROW pIfRow)
+{
+    DWORD result = NO_ERROR;
+
+    return result;
+}
+
+
+/******************************************************************
+ *    GetIfTable (IPHLPAPI.@)
+ *
+ *
+ * PARAMS
+ *
+ *  pIfTable [In/Out]
+ *  pdwSize [In/Out]
+ *  bOrder [In]
+ *
+ * RETURNS
+ *
+ *  DWORD
+ *
+ */
+DWORD
+STDCALL 
+GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, WINBOOL bOrder)
+{
+    DWORD result = NO_ERROR;
+
+    return result;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize,
+ WINBOOL bOrder)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize,
+ WINBOOL bOrder)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable,
+ PULONG pdwSize, WINBOOL bOrder)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpStatistics(PMIB_IPSTATS pStats)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIcmpStatistics(PMIB_ICMP pStats)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetTcpStatisticsEx(PMIB_TCPSTATS pStats, DWORD dwFamily)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SetIfEntry(PMIB_IFROW pIfRow)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SetIpForwardEntry(PMIB_IPFORWARDROW pRoute)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SetIpStatistics(PMIB_IPSTATS pIpStats)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SetIpTTL(UINT nTTL)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL CreateIpNetEntry(PMIB_IPNETROW pArpEntry)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL DeleteIpNetEntry(PMIB_IPNETROW pArpEntry)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL CreateProxyArpEntry(DWORD dwAddress, DWORD dwMask,
+ DWORD dwIfIndex)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL DeleteProxyArpEntry(DWORD dwAddress, DWORD dwMask,
+ DWORD dwIfIndex)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SetTcpEntry(PMIB_TCPROW pTcpRow)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetUniDirectionalAdapterInfo(
+ PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetBestInterface(IPAddr dwDestAddr, PDWORD pdwBestIfIndex)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetBestRoute(DWORD dwDestAddr, DWORD dwSourceAddr,
+ PMIB_IPFORWARDROW   pBestRoute)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL DeleteIPAddress(ULONG NTEContext)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetPerAdapterInfo(ULONG IfIndex,
+ PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr,
+ PULONG  PhyAddrLen)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+WINBOOL STDCALL GetRTTAndHopCount(IPAddr DestIpAddress, PULONG HopCount,
+ ULONG  MaxHops, PULONG RTT)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetFriendlyIfIndex(DWORD IfIndex)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL EnableRouter(HANDLE* pHandle, OVERLAPPED* pOverlapped)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL UnenableRouter(OVERLAPPED* pOverlapped, LPDWORD lpdwEnableCount)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,WINBOOL bOrder,HANDLE hHeap,DWORD dwFlags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+WINBOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL RestoreMediaSense(OVERLAPPED* pOverlapped,LPDWORD lpdwEnableCount)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+HANDLE STDCALL  IcmpCreateFile(
+    VOID
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+HANDLE STDCALL  Icmp6CreateFile(
+    VOID
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+WINBOOL STDCALL  IcmpCloseHandle(
+    HANDLE  IcmpHandle
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL  IcmpSendEcho(
+    HANDLE                 IcmpHandle,
+    IPAddr                 DestinationAddress,
+    LPVOID                 RequestData,
+    WORD                   RequestSize,
+    PIP_OPTION_INFORMATION RequestOptions,
+    LPVOID                 ReplyBuffer,
+    DWORD                  ReplySize,
+    DWORD                  Timeout
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD
+STDCALL 
+IcmpSendEcho2(
+    HANDLE                   IcmpHandle,
+    HANDLE                   Event,
+    FARPROC                  ApcRoutine,
+    PVOID                    ApcContext,
+    IPAddr                   DestinationAddress,
+    LPVOID                   RequestData,
+    WORD                     RequestSize,
+    PIP_OPTION_INFORMATION   RequestOptions,
+    LPVOID                   ReplyBuffer,
+    DWORD                    ReplySize,
+    DWORD                    Timeout
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
 
+/*
+ * @unimplemented
+ */
+DWORD
+STDCALL 
+Icmp6SendEcho2(
+    HANDLE                   IcmpHandle,
+    HANDLE                   Event,
+    FARPROC                  ApcRoutine,
+    PVOID                    ApcContext,
+    struct sockaddr_in6     *SourceAddress,
+    struct sockaddr_in6     *DestinationAddress,
+    LPVOID                   RequestData,
+    WORD                     RequestSize,
+    PIP_OPTION_INFORMATION   RequestOptions,
+    LPVOID                   ReplyBuffer,
+    DWORD                    ReplySize,
+    DWORD                    Timeout
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD
+STDCALL
+IcmpParseReplies(
+    LPVOID                   ReplyBuffer,
+    DWORD                    ReplySize
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD
+STDCALL
+Icmp6ParseReplies(
+    LPVOID                   ReplyBuffer,
+    DWORD                    ReplySize
+    )
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable,
+ BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable,
+ BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE *
+ ppIpForwardTable, BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable,
+ BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable,
+ BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD STDCALL AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable,
+ BOOL bOrder, HANDLE heap, DWORD flags)
+{
+    UNIMPLEMENTED
+    return 0L;
+}