update for HEAD-2003091401
[reactos.git] / lib / iphlpapi / iphlpapi.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS Winsock 2 IP Helper API DLL
4  * FILE:        iphlpapi.c
5  * PURPOSE:     DLL entry
6  * PROGRAMMERS: Robert Dickenson (robd@reactos.org)
7  * REVISIONS:
8  *   RDD August 18, 2002 Created
9  */
10
11 #include <stdio.h>
12 #include <windows.h>
13 #include <tchar.h>
14 #include <time.h>
15
16 #include <winsock2.h>
17 #include <iptypes.h>
18 #include <ipexport.h>
19 #include <iphlpapi.h>
20 #include <icmpapi.h>
21
22 #include "debug.h"
23 //#include "trace.h"
24
25 #ifdef __GNUC__
26 #define EXPORT STDCALL
27 #else
28 #define EXPORT CALLBACK
29 #endif
30
31 #ifdef DBG
32
33 /* See debug.h for debug/trace constants */
34 DWORD DebugTraceLevel = MAX_TRACE;
35
36 #endif /* DBG */
37
38 /* To make the linker happy */
39 //VOID STDCALL KeBugCheck (ULONG        BugCheckCode) {}
40
41
42 WINBOOL
43 EXPORT
44 DllMain(HANDLE hInstDll,
45         ULONG dwReason,
46         PVOID Reserved)
47 {
48     //WSH_DbgPrint(MIN_TRACE, ("DllMain of iphlpapi.dll\n"));
49
50     switch (dwReason) {
51     case DLL_PROCESS_ATTACH:
52         /* Don't need thread attach notifications
53            so disable them to improve performance */
54         DisableThreadLibraryCalls(hInstDll);
55         break;
56
57     case DLL_THREAD_ATTACH:
58         break;
59
60     case DLL_THREAD_DETACH:
61         break;
62
63     case DLL_PROCESS_DETACH:
64         break;
65     }
66     return TRUE;
67 }
68
69
70 /*
71  * @unimplemented
72  */
73 DWORD
74 STDCALL
75 AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PULONG NTEInstance)
76 {
77     UNIMPLEMENTED
78     return 0L;
79 }
80
81
82 /*
83  * @unimplemented
84  */
85 DWORD
86 STDCALL
87 SetIpNetEntry(PMIB_IPNETROW pArpEntry)
88 {
89     UNIMPLEMENTED
90     return 0L;
91 }
92
93
94 /*
95  * @unimplemented
96  */
97 DWORD
98 STDCALL 
99 CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute)
100 {
101     UNIMPLEMENTED
102     return 0L;
103 }
104
105
106 /*
107  * @unimplemented
108  */
109 DWORD
110 STDCALL 
111 GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex)
112 {
113     return 0;
114 }
115
116
117 /*
118  * @unimplemented
119  */
120 DWORD
121 STDCALL 
122 GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
123 {
124         LONG lErr;
125         DWORD dwSize;
126         DWORD dwIndex;
127         BYTE* pNextMemFree = (BYTE*) pAdapterInfo;
128         ULONG uUsedMemory = 0;
129         PIP_ADAPTER_INFO pPrevAdapter = NULL;
130         PIP_ADAPTER_INFO pCurrentAdapter = NULL;
131         HKEY hAdapters;
132         HKEY hAdapter;
133         HKEY hIpConfig;
134         wchar_t* strAdapter;
135         wchar_t* strTemp1;
136         wchar_t* strTemp2;
137         DWORD dwAdapterLen;
138         char strTemp[MAX_ADAPTER_NAME_LENGTH + 4];
139
140         if(pAdapterInfo == NULL && pOutBufLen == NULL)
141                 return ERROR_INVALID_PARAMETER;
142         ZeroMemory(pAdapterInfo, *pOutBufLen);
143
144         lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters", 0, KEY_READ, &hAdapters);
145         if(lErr != ERROR_SUCCESS)
146                 return lErr;
147
148         //      Determine the size of the largest name of any adapter and the number of adapters.
149         lErr = RegQueryInfoKeyW(hAdapters, NULL, NULL, NULL, NULL, &dwAdapterLen, NULL, NULL, NULL, NULL, NULL, NULL);
150     if(lErr != ERROR_SUCCESS)
151         {
152                 RegCloseKey(hAdapters);
153                 return lErr;
154         }
155         dwAdapterLen++; // RegQueryInfoKeyW return value does not include terminating null.
156
157         strAdapter = (wchar_t*) malloc(dwAdapterLen * sizeof(wchar_t));
158
159         //      Enumerate all adapters in SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters.
160         for(dwIndex = 0; ; dwIndex++)
161         {
162                 dwSize = dwAdapterLen;                  //      Reset size of the strAdapterLen buffer.
163                 lErr = RegEnumKeyExW(hAdapters, dwIndex, strAdapter, &dwSize, NULL, NULL, NULL, NULL);
164                 if(lErr == ERROR_NO_MORE_ITEMS)
165                         break;
166
167                 //      TODO    Skip NdisWanIP???
168                 if(wcsstr(strAdapter, L"NdisWanIp") != 0)
169                         continue;
170
171                 lErr = RegOpenKeyExW(hAdapters, strAdapter, 0, KEY_READ, &hAdapter);
172                 if(lErr != ERROR_SUCCESS)
173                         continue;
174
175                 //      Read the IpConfig value.
176                 lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, NULL, &dwSize);
177                 if(lErr != ERROR_SUCCESS)
178                         continue;
179
180                 strTemp1 = (wchar_t*) malloc(dwSize);
181                 strTemp2 = (wchar_t*) malloc(dwSize + 35 * sizeof(wchar_t));
182                 lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, (BYTE*) strTemp1, &dwSize);
183                 if(lErr != ERROR_SUCCESS)
184                 {
185                         free(strTemp1);
186                         free(strTemp2);
187                         continue;
188                 }
189                 swprintf(strTemp2, L"SYSTEM\\CurrentControlSet\\Services\\%s", strTemp1);
190
191                 //      Open the IpConfig key.
192                 lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, strTemp2, 0, KEY_READ, &hIpConfig);
193                 if(lErr != ERROR_SUCCESS)
194                 {
195                         free(strTemp1);
196                         free(strTemp2);
197                         continue;
198                 }
199                 free((void*) strTemp1);
200                 free((void*) strTemp2);
201                 
202
203                 //      Fill IP_ADAPTER_INFO block.
204                 pCurrentAdapter = (IP_ADAPTER_INFO*) pNextMemFree;
205                 pNextMemFree += sizeof(IP_ADAPTER_INFO);
206                 uUsedMemory += sizeof(IP_ADAPTER_INFO);
207                 if(uUsedMemory > *pOutBufLen)
208                         return ERROR_BUFFER_OVERFLOW;                           //      TODO    return the needed size
209
210                         //      struct _IP_ADAPTER_INFO* Next
211                 if(pPrevAdapter != NULL)
212                         pPrevAdapter->Next = pCurrentAdapter;
213                         //      TODO    DWORD ComboIndex
214                         //      char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]
215                 wcstombs(strTemp, strAdapter, MAX_ADAPTER_NAME_LENGTH + 4);
216                 strcpy(pCurrentAdapter->AdapterName, strTemp);
217                         //      TODO    char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]
218                         //      TODO    UINT AddressLength
219                         //      TODO    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]
220                         //      TODO    DWORD Index
221                         //      TODO    UINT Type
222                         //      TODO    UINT DhcpEnabled
223                         //      TODO    PIP_ADDR_STRING CurrentIpAddress
224                         //      IP_ADDR_STRING IpAddressList
225                 dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"IPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize);
226                 dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"SubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize);
227                 if(strstr(pCurrentAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0)
228                 {       
229                         dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpIPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize);
230                         dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize);
231                 }
232                         //      TODO    IP_ADDR_STRING GatewayList
233                         //      IP_ADDR_STRING DhcpServer
234                 dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpServer", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpAddress, &dwSize);
235                 dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpMask, &dwSize);
236                         //      TODO    BOOL HaveWins
237                         //      TODO    IP_ADDR_STRING PrimaryWinsServer
238                         //      TODO    IP_ADDR_STRING SecondaryWinsServer
239                         //      TODO    time_t LeaseObtained
240                         //      TODO    time_t LeaseExpires
241
242                 pPrevAdapter = pCurrentAdapter;
243                 RegCloseKey(hAdapter);
244                 RegCloseKey(hIpConfig);
245         }
246
247         //      Cleanup
248         free(strAdapter);
249         RegCloseKey(hAdapters);
250
251         return ERROR_SUCCESS;
252 }
253
254
255 ////////////////////////////////////////////////////////////////////////////////
256
257 /*
258  * @implemented
259  */
260 DWORD
261 STDCALL 
262 GetNumberOfInterfaces(OUT PDWORD pdwNumIf)
263 {
264     DWORD result = NO_ERROR;
265     HKEY hKey;
266     LONG errCode;
267     int i = 0;
268
269     if (pdwNumIf == NULL) return ERROR_INVALID_PARAMETER;
270     *pdwNumIf = 0;
271     errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &hKey);
272     if (errCode == ERROR_SUCCESS) {
273         DWORD dwSize;
274         errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, NULL, &dwSize);
275         if (errCode == ERROR_SUCCESS) {
276             wchar_t* pData = (wchar_t*)malloc(dwSize * sizeof(wchar_t));
277             errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, (LPBYTE)pData, &dwSize);
278             if (errCode == ERROR_SUCCESS) {
279                 wchar_t* pStr = pData;
280                 for (i = 0; *pStr != L'\0'; i++) {
281                     pStr = pStr + wcslen(pStr) + 1; // next string
282                 }
283             }
284             free(pData);
285         }
286         RegCloseKey(hKey);
287         *pdwNumIf = i;
288     } else {
289         result = errCode;
290     }
291     return result;
292 }
293
294
295 /*
296  * @implemented
297  */
298 DWORD
299 STDCALL 
300 GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG pOutBufLen)
301 {
302     DWORD result = ERROR_SUCCESS;
303     DWORD dwSize;
304     DWORD dwOutBufLen;
305     DWORD dwNumIf;
306     HKEY hKey;
307     LONG errCode;
308     int i = 0;
309
310     if ((errCode = GetNumberOfInterfaces(&dwNumIf)) != NO_ERROR) {
311         _tprintf(_T("GetInterfaceInfo() failed with code 0x%08X - Use FormatMessage to obtain the message string for the returned error\n"), errCode);
312         return errCode;
313     }
314     if (dwNumIf == 0) return ERROR_NO_DATA; // No adapter information exists for the local computer
315     if (pOutBufLen == NULL) return ERROR_INVALID_PARAMETER;
316     dwOutBufLen = sizeof(IP_INTERFACE_INFO) + dwNumIf * sizeof(IP_ADAPTER_INDEX_MAP);
317     if (*pOutBufLen < dwOutBufLen || pIfTable == NULL) {
318         *pOutBufLen = dwOutBufLen;
319         return ERROR_INSUFFICIENT_BUFFER;
320     }
321     memset(pIfTable, 0, dwOutBufLen);
322     pIfTable->NumAdapters = dwNumIf - 1;
323     errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &hKey);
324     if (errCode == ERROR_SUCCESS) {
325             errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, NULL, &dwSize);
326             if (errCode == ERROR_SUCCESS) {
327                 wchar_t* pData = (wchar_t*)malloc(dwSize * sizeof(wchar_t));
328                 errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, (LPBYTE)pData, &dwSize);
329                 if (errCode == ERROR_SUCCESS) {
330                     wchar_t* pStr = pData;
331                     for (i = 0; i < pIfTable->NumAdapters, *pStr != L'\0'; pStr += wcslen(pStr) + 1) {
332                         if (wcsstr(pStr, L"\\Device\\NdisWanIp") == 0) {
333                             wcsncpy(pIfTable->Adapter[i].Name, pStr, MAX_ADAPTER_NAME);
334                             pIfTable->Adapter[i].Index = i++;
335                         }
336                     }
337
338                 }
339                 free(pData);
340             }
341             RegCloseKey(hKey);
342     } else {
343         result = errCode;
344     }
345     return result;
346 }
347
348
349 /*
350  * @implemented
351  */
352 DWORD
353 STDCALL 
354 GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
355 {
356   DWORD result = ERROR_SUCCESS;
357   DWORD dwSize;
358   HKEY hKey;
359   LONG errCode;
360
361   if (pFixedInfo == NULL || pOutBufLen == NULL) return ERROR_INVALID_PARAMETER;
362
363   if (*pOutBufLen < sizeof(FIXED_INFO))
364   {
365     *pOutBufLen = sizeof(FIXED_INFO);
366     return ERROR_BUFFER_OVERFLOW;
367   }
368   memset(pFixedInfo, 0, sizeof(FIXED_INFO));
369
370   errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey);
371   if (errCode == ERROR_SUCCESS)
372   {
373     dwSize = sizeof(pFixedInfo->HostName);
374     errCode = RegQueryValueExA(hKey, "Hostname", NULL, NULL, (LPBYTE)&pFixedInfo->HostName, &dwSize);
375     dwSize = sizeof(pFixedInfo->DomainName);
376     errCode = RegQueryValueExA(hKey, "Domain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
377     if (errCode != ERROR_SUCCESS)
378     {
379       dwSize = sizeof(pFixedInfo->DomainName);
380       errCode = RegQueryValueExA(hKey, "DhcpDomain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize);
381     }
382     dwSize = sizeof(pFixedInfo->EnableRouting);
383     errCode = RegQueryValueExW(hKey, L"IPEnableRouter", NULL, NULL, (LPBYTE)&pFixedInfo->EnableRouting, &dwSize);
384     RegCloseKey(hKey);
385   }
386   else
387   {
388     result = ERROR_NO_DATA; // No adapter information exists for the local computer
389   }
390
391   errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", 0, KEY_READ, &hKey);
392   if (errCode == ERROR_SUCCESS)
393   {
394     dwSize = sizeof(pFixedInfo->ScopeId);
395     errCode = RegQueryValueExA(hKey, "ScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
396     if (errCode != ERROR_SUCCESS)
397     {
398       dwSize = sizeof(pFixedInfo->ScopeId);
399       errCode = RegQueryValueExA(hKey, "DhcpScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize);
400     }
401     dwSize = sizeof(pFixedInfo->NodeType);
402     errCode = RegQueryValueExW(hKey, L"NodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
403     if (errCode != ERROR_SUCCESS)
404     {
405       dwSize = sizeof(pFixedInfo->NodeType);
406       errCode = RegQueryValueExA(hKey, "DhcpNodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize);
407     }
408     dwSize = sizeof(pFixedInfo->EnableProxy);
409     errCode = RegQueryValueExW(hKey, L"EnableProxy", NULL, NULL, (LPBYTE)&pFixedInfo->EnableProxy, &dwSize);
410     dwSize = sizeof(pFixedInfo->EnableDns);
411     errCode = RegQueryValueExW(hKey, L"EnableDNS", NULL, NULL, (LPBYTE)&pFixedInfo->EnableDns, &dwSize);
412     RegCloseKey(hKey);
413   }
414   else
415   {
416     result = ERROR_NO_DATA; // No adapter information exists for the local computer
417   }
418
419   return result;
420 }
421
422
423 /*
424  * @unimplemented
425  */
426 DWORD
427 STDCALL 
428 GetTcpStatistics(PMIB_TCPSTATS pStats)
429 {
430     DWORD result = NO_ERROR;
431
432     result = ERROR_NO_DATA;
433
434     return result;
435 }
436
437
438 /*
439  * @unimplemented
440  */
441 DWORD
442 STDCALL 
443 GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, WINBOOL bOrder)
444 {
445     DWORD result = NO_ERROR;
446
447     result = ERROR_NO_DATA;
448
449     return result;
450 }
451
452
453 /*
454  * @unimplemented
455  */
456 DWORD
457 STDCALL 
458 GetUdpStatistics(PMIB_UDPSTATS pStats)
459 {
460     DWORD result = NO_ERROR;
461
462     result = ERROR_NO_DATA;
463
464     return result;
465 }
466
467
468 /*
469  * @unimplemented
470  */
471 DWORD
472 STDCALL 
473 GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, WINBOOL bOrder)
474 {
475     DWORD result = NO_ERROR;
476
477     result = ERROR_NO_DATA;
478
479     return result;
480 }
481
482
483 /*
484  * @unimplemented
485  */
486 DWORD
487 STDCALL 
488 FlushIpNetTable(DWORD dwIfIndex)
489 {
490     DWORD result = NO_ERROR;
491
492     return result;
493 }
494
495 /******************************************************************
496  *    GetIfEntry (IPHLPAPI.@)
497  *
498  *
499  * PARAMS
500  *
501  *  pIfRow [In/Out]
502  *
503  * RETURNS
504  *
505  *  DWORD
506  *
507  */
508 DWORD
509 STDCALL  
510 GetIfEntry(PMIB_IFROW pIfRow)
511 {
512     DWORD result = NO_ERROR;
513
514     return result;
515 }
516
517
518 /******************************************************************
519  *    GetIfTable (IPHLPAPI.@)
520  *
521  *
522  * PARAMS
523  *
524  *  pIfTable [In/Out]
525  *  pdwSize [In/Out]
526  *  bOrder [In]
527  *
528  * RETURNS
529  *
530  *  DWORD
531  *
532  */
533 DWORD
534 STDCALL 
535 GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, WINBOOL bOrder)
536 {
537     DWORD result = NO_ERROR;
538
539     return result;
540 }
541
542 /*
543  * @unimplemented
544  */
545 DWORD STDCALL GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize,
546  WINBOOL bOrder)
547 {
548     UNIMPLEMENTED
549     return 0L;
550 }
551
552 /*
553  * @unimplemented
554  */
555 DWORD STDCALL GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize,
556  WINBOOL bOrder)
557 {
558     UNIMPLEMENTED
559     return 0L;
560 }
561
562 /*
563  * @unimplemented
564  */
565 DWORD STDCALL GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable,
566  PULONG pdwSize, WINBOOL bOrder)
567 {
568     UNIMPLEMENTED
569     return 0L;
570 }
571
572 /*
573  * @unimplemented
574  */
575 DWORD STDCALL GetIpStatistics(PMIB_IPSTATS pStats)
576 {
577     UNIMPLEMENTED
578     return 0L;
579 }
580
581 /*
582  * @unimplemented
583  */
584 DWORD STDCALL GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily)
585 {
586     UNIMPLEMENTED
587     return 0L;
588 }
589
590 /*
591  * @unimplemented
592  */
593 DWORD STDCALL GetIcmpStatistics(PMIB_ICMP pStats)
594 {
595     UNIMPLEMENTED
596     return 0L;
597 }
598
599 /*
600  * @unimplemented
601  */
602 DWORD STDCALL GetTcpStatisticsEx(PMIB_TCPSTATS pStats, DWORD dwFamily)
603 {
604     UNIMPLEMENTED
605     return 0L;
606 }
607
608 /*
609  * @unimplemented
610  */
611 DWORD STDCALL GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily)
612 {
613     UNIMPLEMENTED
614     return 0L;
615 }
616
617 /*
618  * @unimplemented
619  */
620 DWORD STDCALL SetIfEntry(PMIB_IFROW pIfRow)
621 {
622     UNIMPLEMENTED
623     return 0L;
624 }
625
626 /*
627  * @unimplemented
628  */
629 DWORD STDCALL SetIpForwardEntry(PMIB_IPFORWARDROW pRoute)
630 {
631     UNIMPLEMENTED
632     return 0L;
633 }
634
635 /*
636  * @unimplemented
637  */
638 DWORD STDCALL DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute)
639 {
640     UNIMPLEMENTED
641     return 0L;
642 }
643
644 /*
645  * @unimplemented
646  */
647 DWORD STDCALL SetIpStatistics(PMIB_IPSTATS pIpStats)
648 {
649     UNIMPLEMENTED
650     return 0L;
651 }
652
653 /*
654  * @unimplemented
655  */
656 DWORD STDCALL SetIpTTL(UINT nTTL)
657 {
658     UNIMPLEMENTED
659     return 0L;
660 }
661
662 /*
663  * @unimplemented
664  */
665 DWORD STDCALL CreateIpNetEntry(PMIB_IPNETROW pArpEntry)
666 {
667     UNIMPLEMENTED
668     return 0L;
669 }
670
671 /*
672  * @unimplemented
673  */
674 DWORD STDCALL DeleteIpNetEntry(PMIB_IPNETROW pArpEntry)
675 {
676     UNIMPLEMENTED
677     return 0L;
678 }
679
680 /*
681  * @unimplemented
682  */
683 DWORD STDCALL CreateProxyArpEntry(DWORD dwAddress, DWORD dwMask,
684  DWORD dwIfIndex)
685 {
686     UNIMPLEMENTED
687     return 0L;
688 }
689
690 /*
691  * @unimplemented
692  */
693 DWORD STDCALL DeleteProxyArpEntry(DWORD dwAddress, DWORD dwMask,
694  DWORD dwIfIndex)
695 {
696     UNIMPLEMENTED
697     return 0L;
698 }
699
700 /*
701  * @unimplemented
702  */
703 DWORD STDCALL SetTcpEntry(PMIB_TCPROW pTcpRow)
704 {
705     UNIMPLEMENTED
706     return 0L;
707 }
708
709 /*
710  * @unimplemented
711  */
712 DWORD STDCALL GetUniDirectionalAdapterInfo(
713  PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen)
714 {
715     UNIMPLEMENTED
716     return 0L;
717 }
718
719 /*
720  * @unimplemented
721  */
722 DWORD STDCALL GetBestInterface(IPAddr dwDestAddr, PDWORD pdwBestIfIndex)
723 {
724     UNIMPLEMENTED
725     return 0L;
726 }
727
728 /*
729  * @unimplemented
730  */
731 DWORD STDCALL GetBestRoute(DWORD dwDestAddr, DWORD dwSourceAddr,
732  PMIB_IPFORWARDROW   pBestRoute)
733 {
734     UNIMPLEMENTED
735     return 0L;
736 }
737
738 /*
739  * @unimplemented
740  */
741 DWORD STDCALL NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped)
742 {
743     UNIMPLEMENTED
744     return 0L;
745 }
746
747 /*
748  * @unimplemented
749  */
750 DWORD STDCALL NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped)
751 {
752     UNIMPLEMENTED
753     return 0L;
754 }
755
756 /*
757  * @unimplemented
758  */
759 DWORD STDCALL DeleteIPAddress(ULONG NTEContext)
760 {
761     UNIMPLEMENTED
762     return 0L;
763 }
764
765 /*
766  * @unimplemented
767  */
768 DWORD STDCALL GetPerAdapterInfo(ULONG IfIndex,
769  PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen)
770 {
771     UNIMPLEMENTED
772     return 0L;
773 }
774
775 /*
776  * @unimplemented
777  */
778 DWORD STDCALL IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
779 {
780     UNIMPLEMENTED
781     return 0L;
782 }
783
784 /*
785  * @unimplemented
786  */
787 DWORD STDCALL IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
788 {
789     UNIMPLEMENTED
790     return 0L;
791 }
792
793 /*
794  * @unimplemented
795  */
796 DWORD STDCALL SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr,
797  PULONG  PhyAddrLen)
798 {
799     UNIMPLEMENTED
800     return 0L;
801 }
802
803 /*
804  * @unimplemented
805  */
806 WINBOOL STDCALL GetRTTAndHopCount(IPAddr DestIpAddress, PULONG HopCount,
807  ULONG  MaxHops, PULONG RTT)
808 {
809     UNIMPLEMENTED
810     return 0L;
811 }
812
813 /*
814  * @unimplemented
815  */
816 DWORD STDCALL GetFriendlyIfIndex(DWORD IfIndex)
817 {
818     UNIMPLEMENTED
819     return 0L;
820 }
821
822 /*
823  * @unimplemented
824  */
825 DWORD STDCALL EnableRouter(HANDLE* pHandle, OVERLAPPED* pOverlapped)
826 {
827     UNIMPLEMENTED
828     return 0L;
829 }
830
831 /*
832  * @unimplemented
833  */
834 DWORD STDCALL UnenableRouter(OVERLAPPED* pOverlapped, LPDWORD lpdwEnableCount)
835 {
836     UNIMPLEMENTED
837     return 0L;
838 }
839
840 /*
841  * @unimplemented
842  */
843 DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily)
844 {
845     UNIMPLEMENTED
846     return 0L;
847 }
848
849 /*
850  * @unimplemented
851  */
852 DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,WINBOOL bOrder,HANDLE hHeap,DWORD dwFlags)
853 {
854     UNIMPLEMENTED
855     return 0L;
856 }
857
858 /*
859  * @unimplemented
860  */
861 DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex)
862 {
863     UNIMPLEMENTED
864     return 0L;
865 }
866
867 /*
868  * @unimplemented
869  */
870 WINBOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped)
871 {
872     UNIMPLEMENTED
873     return 0L;
874 }
875
876 /*
877  * @unimplemented
878  */
879 PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID)
880 {
881     UNIMPLEMENTED
882     return 0L;
883 }
884
885 /*
886  * @unimplemented
887  */
888 DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen)
889 {
890     UNIMPLEMENTED
891     return 0L;
892 }
893
894 /*
895  * @unimplemented
896  */
897 DWORD STDCALL DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped)
898 {
899     UNIMPLEMENTED
900     return 0L;
901 }
902
903 /*
904  * @unimplemented
905  */
906 DWORD STDCALL RestoreMediaSense(OVERLAPPED* pOverlapped,LPDWORD lpdwEnableCount)
907 {
908     UNIMPLEMENTED
909     return 0L;
910 }
911
912 /*
913  * @unimplemented
914  */
915 DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size)
916 {
917     UNIMPLEMENTED
918     return 0L;
919 }
920
921 /*
922  * @unimplemented
923  */
924 HANDLE STDCALL  IcmpCreateFile(
925     VOID
926     )
927 {
928     UNIMPLEMENTED
929     return 0L;
930 }
931
932 /*
933  * @unimplemented
934  */
935 HANDLE STDCALL  Icmp6CreateFile(
936     VOID
937     )
938 {
939     UNIMPLEMENTED
940     return 0L;
941 }
942
943 /*
944  * @unimplemented
945  */
946 WINBOOL STDCALL  IcmpCloseHandle(
947     HANDLE  IcmpHandle
948     )
949 {
950     UNIMPLEMENTED
951     return 0L;
952 }
953
954 /*
955  * @unimplemented
956  */
957 DWORD STDCALL  IcmpSendEcho(
958     HANDLE                 IcmpHandle,
959     IPAddr                 DestinationAddress,
960     LPVOID                 RequestData,
961     WORD                   RequestSize,
962     PIP_OPTION_INFORMATION RequestOptions,
963     LPVOID                 ReplyBuffer,
964     DWORD                  ReplySize,
965     DWORD                  Timeout
966     )
967 {
968     UNIMPLEMENTED
969     return 0L;
970 }
971
972 /*
973  * @unimplemented
974  */
975 DWORD
976 STDCALL 
977 IcmpSendEcho2(
978     HANDLE                   IcmpHandle,
979     HANDLE                   Event,
980     FARPROC                  ApcRoutine,
981     PVOID                    ApcContext,
982     IPAddr                   DestinationAddress,
983     LPVOID                   RequestData,
984     WORD                     RequestSize,
985     PIP_OPTION_INFORMATION   RequestOptions,
986     LPVOID                   ReplyBuffer,
987     DWORD                    ReplySize,
988     DWORD                    Timeout
989     )
990 {
991     UNIMPLEMENTED
992     return 0L;
993 }
994
995 /*
996  * @unimplemented
997  */
998 DWORD
999 STDCALL 
1000 Icmp6SendEcho2(
1001     HANDLE                   IcmpHandle,
1002     HANDLE                   Event,
1003     FARPROC                  ApcRoutine,
1004     PVOID                    ApcContext,
1005     struct sockaddr_in6     *SourceAddress,
1006     struct sockaddr_in6     *DestinationAddress,
1007     LPVOID                   RequestData,
1008     WORD                     RequestSize,
1009     PIP_OPTION_INFORMATION   RequestOptions,
1010     LPVOID                   ReplyBuffer,
1011     DWORD                    ReplySize,
1012     DWORD                    Timeout
1013     )
1014 {
1015     UNIMPLEMENTED
1016     return 0L;
1017 }
1018
1019 /*
1020  * @unimplemented
1021  */
1022 DWORD
1023 STDCALL
1024 IcmpParseReplies(
1025     LPVOID                   ReplyBuffer,
1026     DWORD                    ReplySize
1027     )
1028 {
1029     UNIMPLEMENTED
1030     return 0L;
1031 }
1032
1033 /*
1034  * @unimplemented
1035  */
1036 DWORD
1037 STDCALL
1038 Icmp6ParseReplies(
1039     LPVOID                   ReplyBuffer,
1040     DWORD                    ReplySize
1041     )
1042 {
1043     UNIMPLEMENTED
1044     return 0L;
1045 }
1046
1047 /*
1048  * @unimplemented
1049  */
1050 DWORD STDCALL AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable,
1051  BOOL bOrder, HANDLE heap, DWORD flags)
1052 {
1053     UNIMPLEMENTED
1054     return 0L;
1055 }
1056
1057 /*
1058  * @unimplemented
1059  */
1060 DWORD STDCALL AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable,
1061  BOOL bOrder, HANDLE heap, DWORD flags)
1062 {
1063     UNIMPLEMENTED
1064     return 0L;
1065 }
1066
1067 /*
1068  * @unimplemented
1069  */
1070 DWORD STDCALL AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE *
1071  ppIpForwardTable, BOOL bOrder, HANDLE heap, DWORD flags)
1072 {
1073     UNIMPLEMENTED
1074     return 0L;
1075 }
1076
1077 /*
1078  * @unimplemented
1079  */
1080 DWORD STDCALL AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable,
1081  BOOL bOrder, HANDLE heap, DWORD flags)
1082 {
1083     UNIMPLEMENTED
1084     return 0L;
1085 }
1086
1087 /*
1088  * @unimplemented
1089  */
1090 DWORD STDCALL AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable,
1091  BOOL bOrder, HANDLE heap, DWORD flags)
1092 {
1093     UNIMPLEMENTED
1094     return 0L;
1095 }
1096
1097 /*
1098  * @unimplemented
1099  */
1100 DWORD STDCALL AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable,
1101  BOOL bOrder, HANDLE heap, DWORD flags)
1102 {
1103     UNIMPLEMENTED
1104     return 0L;
1105 }