2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Winsock 2 IP Helper API DLL
6 * PROGRAMMERS: Robert Dickenson (robd@reactos.org)
8 * RDD August 18, 2002 Created
24 #include "ipprivate.h"
25 #include "ipregprivate.h"
30 #define EXPORT STDCALL
32 #define EXPORT CALLBACK
37 /* See debug.h for debug/trace constants */
38 DWORD DebugTraceLevel
= MAX_TRACE
;
42 /* To make the linker happy */
43 //VOID STDCALL KeBugCheck (ULONG BugCheckCode) {}
48 DllMain(HANDLE hInstDll
,
52 //WSH_DbgPrint(MIN_TRACE, ("DllMain of iphlpapi.dll\n"));
55 case DLL_PROCESS_ATTACH
:
56 /* Don't need thread attach notifications
57 so disable them to improve performance */
58 DisableThreadLibraryCalls(hInstDll
);
61 case DLL_THREAD_ATTACH
:
64 case DLL_THREAD_DETACH
:
67 case DLL_PROCESS_DETACH
:
79 AddIPAddress(IPAddr Address
, IPMask IpMask
, DWORD IfIndex
, PULONG NTEContext
, PULONG NTEInstance
)
91 SetIpNetEntry(PMIB_IPNETROW pArpEntry
)
103 CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute
)
115 GetAdapterIndex(LPWSTR AdapterName
, PULONG IfIndex
)
126 GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo
, PULONG pOutBufLen
)
131 BYTE
* pNextMemFree
= (BYTE
*) pAdapterInfo
;
132 ULONG uUsedMemory
= 0;
133 PIP_ADAPTER_INFO pPrevAdapter
= NULL
;
134 PIP_ADAPTER_INFO pCurrentAdapter
= NULL
;
142 char strTemp
[MAX_ADAPTER_NAME_LENGTH
+ 4];
144 if(pAdapterInfo
== NULL
&& pOutBufLen
== NULL
)
145 return ERROR_INVALID_PARAMETER
;
146 ZeroMemory(pAdapterInfo
, *pOutBufLen
);
148 lErr
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
149 L
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters", 0, KEY_READ
, &hAdapters
);
150 if(lErr
!= ERROR_SUCCESS
)
153 // Determine the size of the largest name of any adapter and the number of adapters.
154 lErr
= RegQueryInfoKeyW(hAdapters
, NULL
, NULL
, NULL
, NULL
, &dwAdapterLen
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
155 if(lErr
!= ERROR_SUCCESS
)
157 RegCloseKey(hAdapters
);
160 dwAdapterLen
++; // RegQueryInfoKeyW return value does not include terminating null.
162 strAdapter
= (wchar_t*) malloc(dwAdapterLen
* sizeof(wchar_t));
164 // Enumerate all adapters in SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters.
165 for(dwIndex
= 0; ; dwIndex
++)
167 dwSize
= dwAdapterLen
; // Reset size of the strAdapterLen buffer.
168 lErr
= RegEnumKeyExW(hAdapters
, dwIndex
, strAdapter
, &dwSize
, NULL
, NULL
, NULL
, NULL
);
169 if(lErr
== ERROR_NO_MORE_ITEMS
)
172 // TODO Skip NdisWanIP???
173 if(wcsstr(strAdapter
, L
"NdisWanIp") != 0)
176 lErr
= RegOpenKeyExW(hAdapters
, strAdapter
, 0, KEY_READ
, &hAdapter
);
177 if(lErr
!= ERROR_SUCCESS
)
180 // Read the IpConfig value.
181 lErr
= RegQueryValueExW(hAdapter
, L
"IpConfig", NULL
, NULL
, NULL
, &dwSize
);
182 if(lErr
!= ERROR_SUCCESS
)
185 strTemp1
= (wchar_t*) malloc(dwSize
);
186 strTemp2
= (wchar_t*) malloc(dwSize
+ 35 * sizeof(wchar_t));
187 lErr
= RegQueryValueExW(hAdapter
, L
"IpConfig", NULL
, NULL
, (BYTE
*) strTemp1
, &dwSize
);
188 if(lErr
!= ERROR_SUCCESS
)
194 swprintf(strTemp2
, L
"SYSTEM\\CurrentControlSet\\Services\\%s", strTemp1
);
196 // Open the IpConfig key.
197 lErr
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
, strTemp2
, 0, KEY_READ
, &hIpConfig
);
198 if(lErr
!= ERROR_SUCCESS
)
204 free((void*) strTemp1
);
205 free((void*) strTemp2
);
208 // Fill IP_ADAPTER_INFO block.
209 pCurrentAdapter
= (IP_ADAPTER_INFO
*) pNextMemFree
;
210 pNextMemFree
+= sizeof(IP_ADAPTER_INFO
);
211 uUsedMemory
+= sizeof(IP_ADAPTER_INFO
);
212 if(uUsedMemory
> *pOutBufLen
)
213 return ERROR_BUFFER_OVERFLOW
; // TODO return the needed size
215 // struct _IP_ADAPTER_INFO* Next
216 if(pPrevAdapter
!= NULL
)
217 pPrevAdapter
->Next
= pCurrentAdapter
;
218 // TODO DWORD ComboIndex
219 // char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]
220 wcstombs(strTemp
, strAdapter
, MAX_ADAPTER_NAME_LENGTH
+ 4);
221 strcpy(pCurrentAdapter
->AdapterName
, strTemp
);
222 // TODO char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]
223 // TODO UINT AddressLength
224 // TODO BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]
227 // TODO UINT DhcpEnabled
228 // TODO PIP_ADDR_STRING CurrentIpAddress
229 // IP_ADDR_STRING IpAddressList
230 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"IPAddress", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->IpAddressList
.IpAddress
, &dwSize
);
231 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"SubnetMask", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->IpAddressList
.IpMask
, &dwSize
);
232 if(strstr(pCurrentAdapter
->IpAddressList
.IpAddress
.String
, "0.0.0.0") != 0)
234 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"DhcpIPAddress", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->IpAddressList
.IpAddress
, &dwSize
);
235 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"DhcpSubnetMask", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->IpAddressList
.IpMask
, &dwSize
);
237 // TODO IP_ADDR_STRING GatewayList
238 // IP_ADDR_STRING DhcpServer
239 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"DhcpServer", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->DhcpServer
.IpAddress
, &dwSize
);
240 dwSize
= 16; lErr
= RegQueryValueExW(hIpConfig
, L
"DhcpSubnetMask", NULL
, NULL
, (BYTE
*) &pCurrentAdapter
->DhcpServer
.IpMask
, &dwSize
);
241 // TODO BOOL HaveWins
242 // TODO IP_ADDR_STRING PrimaryWinsServer
243 // TODO IP_ADDR_STRING SecondaryWinsServer
244 // TODO time_t LeaseObtained
245 // TODO time_t LeaseExpires
247 pPrevAdapter
= pCurrentAdapter
;
248 RegCloseKey(hAdapter
);
249 RegCloseKey(hIpConfig
);
254 RegCloseKey(hAdapters
);
256 return ERROR_SUCCESS
;
260 ////////////////////////////////////////////////////////////////////////////////
267 GetNumberOfInterfaces(OUT PDWORD pdwNumIf
)
269 DWORD result
= NO_ERROR
;
274 if (pdwNumIf
== NULL
) return ERROR_INVALID_PARAMETER
;
276 errCode
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ
, &hKey
);
277 if (errCode
== ERROR_SUCCESS
) {
279 errCode
= RegQueryValueExW(hKey
, L
"Bind", NULL
, NULL
, NULL
, &dwSize
);
280 if (errCode
== ERROR_SUCCESS
) {
281 wchar_t* pData
= (wchar_t*)malloc(dwSize
* sizeof(wchar_t));
282 errCode
= RegQueryValueExW(hKey
, L
"Bind", NULL
, NULL
, (LPBYTE
)pData
, &dwSize
);
283 if (errCode
== ERROR_SUCCESS
) {
284 wchar_t* pStr
= pData
;
285 for (i
= 0; *pStr
!= L
'\0'; i
++) {
286 pStr
= pStr
+ wcslen(pStr
) + 1; // next string
305 GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable
, PULONG pOutBufLen
)
307 DWORD result
= ERROR_SUCCESS
;
315 if ((errCode
= GetNumberOfInterfaces(&dwNumIf
)) != NO_ERROR
) {
316 _tprintf(_T("GetInterfaceInfo() failed with code 0x%08X - Use FormatMessage to obtain the message string for the returned error\n"), (int)errCode
);
319 if (dwNumIf
== 0) return ERROR_NO_DATA
; // No adapter information exists for the local computer
320 if (pOutBufLen
== NULL
) return ERROR_INVALID_PARAMETER
;
321 dwOutBufLen
= sizeof(IP_INTERFACE_INFO
) + dwNumIf
* sizeof(IP_ADAPTER_INDEX_MAP
);
322 if (*pOutBufLen
< dwOutBufLen
|| pIfTable
== NULL
) {
323 *pOutBufLen
= dwOutBufLen
;
324 return ERROR_INSUFFICIENT_BUFFER
;
326 memset(pIfTable
, 0, dwOutBufLen
);
327 pIfTable
->NumAdapters
= dwNumIf
- 1;
328 errCode
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ
, &hKey
);
329 if (errCode
== ERROR_SUCCESS
) {
330 errCode
= RegQueryValueExW(hKey
, L
"Bind", NULL
, NULL
, NULL
, &dwSize
);
331 if (errCode
== ERROR_SUCCESS
) {
332 wchar_t* pData
= (wchar_t*)malloc(dwSize
* sizeof(wchar_t));
333 errCode
= RegQueryValueExW(hKey
, L
"Bind", NULL
, NULL
, (LPBYTE
)pData
, &dwSize
);
334 if (errCode
== ERROR_SUCCESS
) {
335 wchar_t* pStr
= pData
;
336 for (i
= 0; i
< pIfTable
->NumAdapters
&& *pStr
!= L
'\0'; pStr
+= wcslen(pStr
) + 1) {
337 if (wcsstr(pStr
, L
"\\Device\\NdisWanIp") == 0) {
338 wcsncpy(pIfTable
->Adapter
[i
].Name
, pStr
, MAX_ADAPTER_NAME
);
339 pIfTable
->Adapter
[i
].Index
= i
;
358 static void EnumNameServers( HANDLE RegHandle
, PWCHAR Interface
,
359 PVOID Data
, EnumNameServersFunc cb
) {
360 PWCHAR NameServerString
= QueryRegistryValueString(RegHandle
, L
"NameServer");
361 /* Now, count the non-empty comma separated */
362 if (NameServerString
) {
364 DWORD LastNameStart
= 0;
365 for (ch
= 0; NameServerString
[ch
]; ch
++) {
366 if (NameServerString
[ch
] == ',') {
367 if (ch
- LastNameStart
> 0) { /* Skip empty entries */
368 PWCHAR NameServer
= malloc(sizeof(WCHAR
) * (ch
- LastNameStart
+ 1));
370 memcpy(NameServer
,NameServerString
+ LastNameStart
,
371 (ch
- LastNameStart
) * sizeof(WCHAR
));
372 NameServer
[ch
- LastNameStart
] = 0;
373 cb( Interface
, NameServer
, Data
);
377 LastNameStart
= ch
+ 1; /* The first one after the comma */
380 if (ch
- LastNameStart
> 0) { /* A last name? */
381 PWCHAR NameServer
= malloc(sizeof(WCHAR
) * (ch
- LastNameStart
+ 1));
382 memcpy(NameServer
,NameServerString
+ LastNameStart
,
383 (ch
- LastNameStart
) * sizeof(WCHAR
));
384 NameServer
[ch
- LastNameStart
] = 0;
385 cb( Interface
, NameServer
, Data
);
388 ConsumeRegValueString(NameServerString
);
395 * Call the enumeration function for each name server.
398 static void EnumInterfaces( PVOID Data
, EnumInterfacesFunc cb
) {
400 HKEY ChildKeyHandle
= 0;
401 PWCHAR RegKeyToEnumerate
=
402 L
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces";
403 PWCHAR ChildKeyName
= 0;
404 DWORD CurrentInterface
;
406 if (OpenChildKeyRead(HKEY_LOCAL_MACHINE
,RegKeyToEnumerate
,&RegHandle
)) {
410 for (CurrentInterface
= 0; TRUE
; CurrentInterface
++) {
411 ChildKeyName
= GetNthChildKeyName( RegHandle
, CurrentInterface
);
412 if (!ChildKeyName
) break;
413 if (OpenChildKeyRead(RegHandle
,ChildKeyName
,
414 &ChildKeyHandle
) == 0) {
415 cb( ChildKeyHandle
, ChildKeyName
, Data
);
416 RegCloseKey( ChildKeyHandle
);
418 ConsumeChildKeyName( ChildKeyName
);
422 static void CreateNameServerListEnumNamesFuncCount( PWCHAR Interface
,
425 PNAME_SERVER_LIST_PRIVATE Data
= (PNAME_SERVER_LIST_PRIVATE
)_Data
;
429 static void CreateNameServerListEnumIfFuncCount( HANDLE RegHandle
,
430 PWCHAR InterfaceName
,
432 PNAME_SERVER_LIST_PRIVATE Data
= (PNAME_SERVER_LIST_PRIVATE
)_Data
;
433 EnumNameServers(RegHandle
,InterfaceName
,Data
,
434 CreateNameServerListEnumNamesFuncCount
);
437 static void CreateNameServerListEnumNamesFunc( PWCHAR Interface
,
440 PNAME_SERVER_LIST_PRIVATE Data
= (PNAME_SERVER_LIST_PRIVATE
)_Data
;
441 wcstombs(Data
->AddrString
[Data
->CurrentName
].IpAddress
.String
,
443 sizeof(IP_ADDRESS_STRING
));
444 strcpy(Data
->AddrString
[Data
->CurrentName
].IpMask
.String
,"0.0.0.0");
445 Data
->AddrString
[Data
->CurrentName
].Context
= 0;
446 if (Data
->CurrentName
< Data
->NumServers
- 1) {
447 Data
->AddrString
[Data
->CurrentName
].Next
=
448 &Data
->AddrString
[Data
->CurrentName
+1];
450 Data
->AddrString
[Data
->CurrentName
].Next
= 0;
455 static void CreateNameServerListEnumIfFunc( HANDLE RegHandle
,
456 PWCHAR InterfaceName
,
458 PNAME_SERVER_LIST_PRIVATE Data
= (PNAME_SERVER_LIST_PRIVATE
)_Data
;
459 EnumNameServers(RegHandle
,InterfaceName
,Data
,
460 CreateNameServerListEnumNamesFunc
);
463 static int CountNameServers( PNAME_SERVER_LIST_PRIVATE PrivateData
) {
464 EnumInterfaces(PrivateData
,CreateNameServerListEnumIfFuncCount
);
465 return PrivateData
->NumServers
;
468 static void MakeNameServerList( PNAME_SERVER_LIST_PRIVATE PrivateData
) {
469 EnumInterfaces(PrivateData
,CreateNameServerListEnumIfFunc
);
477 GetNetworkParams(PFIXED_INFO pFixedInfo
, PULONG pOutBufLen
)
479 DWORD result
= ERROR_SUCCESS
;
483 NAME_SERVER_LIST_PRIVATE PrivateNSEnum
= { 0 };
485 CountNameServers( &PrivateNSEnum
);
487 if (pOutBufLen
== NULL
) return ERROR_INVALID_PARAMETER
;
489 if (*pOutBufLen
< sizeof(FIXED_INFO
))
491 *pOutBufLen
= sizeof(FIXED_INFO
) +
492 ((PrivateNSEnum
.NumServers
- 1) * sizeof(IP_ADDR_STRING
));
493 return ERROR_BUFFER_OVERFLOW
;
495 if (pFixedInfo
== NULL
) return ERROR_INVALID_PARAMETER
;
496 memset(pFixedInfo
, 0, sizeof(FIXED_INFO
));
498 errCode
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
499 L
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ
, &hKey
);
500 if (errCode
== ERROR_SUCCESS
)
502 dwSize
= sizeof(pFixedInfo
->HostName
);
503 errCode
= RegQueryValueExA(hKey
, "Hostname", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->HostName
, &dwSize
);
504 dwSize
= sizeof(pFixedInfo
->DomainName
);
505 errCode
= RegQueryValueExA(hKey
, "Domain", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->DomainName
, &dwSize
);
506 if (errCode
!= ERROR_SUCCESS
)
508 dwSize
= sizeof(pFixedInfo
->DomainName
);
509 errCode
= RegQueryValueExA(hKey
, "DhcpDomain", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->DomainName
, &dwSize
);
511 dwSize
= sizeof(pFixedInfo
->EnableRouting
);
512 errCode
= RegQueryValueExW(hKey
, L
"IPEnableRouter", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->EnableRouting
, &dwSize
);
515 /* Get the number of name servers */
516 PIP_ADDR_STRING AddressAfterFixedInfo
;
517 AddressAfterFixedInfo
= (PIP_ADDR_STRING
)&pFixedInfo
[1];
518 DWORD NumberOfServersAllowed
= 0, CurrentServer
= 0;
520 while( &AddressAfterFixedInfo
[NumberOfServersAllowed
] <
521 (PIP_ADDR_STRING
)(((PCHAR
)pFixedInfo
) + *pOutBufLen
) )
522 NumberOfServersAllowed
++;
524 NumberOfServersAllowed
++; /* One struct is built in */
526 /* Since the first part of the struct is built in, we have to do some
528 PrivateNSEnum
.AddrString
=
529 malloc(NumberOfServersAllowed
* sizeof(IP_ADDR_STRING
));
530 if (PrivateNSEnum
.NumServers
> NumberOfServersAllowed
)
531 PrivateNSEnum
.NumServers
= NumberOfServersAllowed
;
532 MakeNameServerList( &PrivateNSEnum
);
534 /* Now we have the name servers, place the first one in the struct,
535 and follow it with the rest */
536 if (!PrivateNSEnum
.NumServers
)
537 RtlZeroMemory( &pFixedInfo
->DnsServerList
, sizeof(IP_ADDR_STRING
) );
539 memcpy( &pFixedInfo
->DnsServerList
, &PrivateNSEnum
.AddrString
[0],
540 sizeof(PrivateNSEnum
.AddrString
[0]) );
541 pFixedInfo
->CurrentDnsServer
= &pFixedInfo
->DnsServerList
;
542 if (PrivateNSEnum
.NumServers
> 1)
543 memcpy( &AddressAfterFixedInfo
[0],
544 &PrivateNSEnum
.AddrString
[1],
545 sizeof(IP_ADDR_STRING
) * (PrivateNSEnum
.NumServers
- 1) );
547 pFixedInfo
->CurrentDnsServer
->Next
= 0;
549 for( CurrentServer
= 0;
550 CurrentServer
< PrivateNSEnum
.NumServers
- 1;
552 pFixedInfo
->CurrentDnsServer
->Next
= &AddressAfterFixedInfo
[CurrentServer
];
553 pFixedInfo
->CurrentDnsServer
= &AddressAfterFixedInfo
[CurrentServer
];
554 pFixedInfo
->CurrentDnsServer
->Next
= 0;
556 /* For now, set the first server as the current server */
557 pFixedInfo
->CurrentDnsServer
= &pFixedInfo
->DnsServerList
;
558 free(PrivateNSEnum
.AddrString
);
562 result
= ERROR_NO_DATA
; // No adapter information exists for the local computer
565 errCode
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", 0, KEY_READ
, &hKey
);
566 if (errCode
== ERROR_SUCCESS
)
568 dwSize
= sizeof(pFixedInfo
->ScopeId
);
569 errCode
= RegQueryValueExA(hKey
, "ScopeId", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->ScopeId
, &dwSize
);
570 if (errCode
!= ERROR_SUCCESS
)
572 dwSize
= sizeof(pFixedInfo
->ScopeId
);
573 errCode
= RegQueryValueExA(hKey
, "DhcpScopeId", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->ScopeId
, &dwSize
);
575 dwSize
= sizeof(pFixedInfo
->NodeType
);
576 errCode
= RegQueryValueExW(hKey
, L
"NodeType", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->NodeType
, &dwSize
);
577 if (errCode
!= ERROR_SUCCESS
)
579 dwSize
= sizeof(pFixedInfo
->NodeType
);
580 errCode
= RegQueryValueExA(hKey
, "DhcpNodeType", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->NodeType
, &dwSize
);
582 dwSize
= sizeof(pFixedInfo
->EnableProxy
);
583 errCode
= RegQueryValueExW(hKey
, L
"EnableProxy", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->EnableProxy
, &dwSize
);
584 dwSize
= sizeof(pFixedInfo
->EnableDns
);
585 errCode
= RegQueryValueExW(hKey
, L
"EnableDNS", NULL
, NULL
, (LPBYTE
)&pFixedInfo
->EnableDns
, &dwSize
);
590 result
= ERROR_NO_DATA
; // No adapter information exists for the local computer
602 GetTcpStatistics(PMIB_TCPSTATS pStats
)
604 DWORD result
= NO_ERROR
;
606 result
= ERROR_NO_DATA
;
617 GetTcpTable(PMIB_TCPTABLE pTcpTable
, PDWORD pdwSize
, WINBOOL bOrder
)
619 DWORD result
= NO_ERROR
;
621 result
= ERROR_NO_DATA
;
632 GetUdpStatistics(PMIB_UDPSTATS pStats
)
634 DWORD result
= NO_ERROR
;
636 result
= ERROR_NO_DATA
;
647 GetUdpTable(PMIB_UDPTABLE pUdpTable
, PDWORD pdwSize
, WINBOOL bOrder
)
649 DWORD result
= NO_ERROR
;
651 result
= ERROR_NO_DATA
;
662 FlushIpNetTable(DWORD dwIfIndex
)
664 DWORD result
= NO_ERROR
;
669 /******************************************************************
670 * GetIfEntry (IPHLPAPI.@)
684 GetIfEntry(PMIB_IFROW pIfRow
)
686 DWORD result
= NO_ERROR
;
692 /******************************************************************
693 * GetIfTable (IPHLPAPI.@)
709 GetIfTable(PMIB_IFTABLE pIfTable
, PULONG pdwSize
, WINBOOL bOrder
)
711 DWORD result
= NO_ERROR
;
719 DWORD STDCALL
GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable
, PULONG pdwSize
,
729 DWORD STDCALL
GetIpNetTable(PMIB_IPNETTABLE pIpNetTable
, PULONG pdwSize
,
739 DWORD STDCALL
GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable
,
740 PULONG pdwSize
, WINBOOL bOrder
)
749 DWORD STDCALL
GetIpStatistics(PMIB_IPSTATS pStats
)
758 DWORD STDCALL
GetIpStatisticsEx(PMIB_IPSTATS pStats
, DWORD dwFamily
)
767 DWORD STDCALL
GetIcmpStatistics(PMIB_ICMP pStats
)
776 DWORD STDCALL
GetTcpStatisticsEx(PMIB_TCPSTATS pStats
, DWORD dwFamily
)
785 DWORD STDCALL
GetUdpStatisticsEx(PMIB_UDPSTATS pStats
, DWORD dwFamily
)
794 DWORD STDCALL
SetIfEntry(PMIB_IFROW pIfRow
)
803 DWORD STDCALL
SetIpForwardEntry(PMIB_IPFORWARDROW pRoute
)
812 DWORD STDCALL
DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute
)
821 DWORD STDCALL
SetIpStatistics(PMIB_IPSTATS pIpStats
)
830 DWORD STDCALL
SetIpTTL(UINT nTTL
)
839 DWORD STDCALL
CreateIpNetEntry(PMIB_IPNETROW pArpEntry
)
848 DWORD STDCALL
DeleteIpNetEntry(PMIB_IPNETROW pArpEntry
)
857 DWORD STDCALL
CreateProxyArpEntry(DWORD dwAddress
, DWORD dwMask
,
867 DWORD STDCALL
DeleteProxyArpEntry(DWORD dwAddress
, DWORD dwMask
,
877 DWORD STDCALL
SetTcpEntry(PMIB_TCPROW pTcpRow
)
886 DWORD STDCALL
GetUniDirectionalAdapterInfo(
887 PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo
, PULONG dwOutBufLen
)
896 DWORD STDCALL
GetBestInterface(IPAddr dwDestAddr
, PDWORD pdwBestIfIndex
)
905 DWORD STDCALL
GetBestRoute(DWORD dwDestAddr
, DWORD dwSourceAddr
,
906 PMIB_IPFORWARDROW pBestRoute
)
915 DWORD STDCALL
NotifyAddrChange(PHANDLE Handle
, LPOVERLAPPED overlapped
)
924 DWORD STDCALL
NotifyRouteChange(PHANDLE Handle
, LPOVERLAPPED overlapped
)
933 DWORD STDCALL
DeleteIPAddress(ULONG NTEContext
)
942 DWORD STDCALL
GetPerAdapterInfo(ULONG IfIndex
,
943 PIP_PER_ADAPTER_INFO pPerAdapterInfo
, PULONG pOutBufLen
)
952 DWORD STDCALL
IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo
)
961 DWORD STDCALL
IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo
)
970 DWORD STDCALL
SendARP(IPAddr DestIP
, IPAddr SrcIP
, PULONG pMacAddr
,
980 WINBOOL STDCALL
GetRTTAndHopCount(IPAddr DestIpAddress
, PULONG HopCount
,
981 ULONG MaxHops
, PULONG RTT
)
990 DWORD STDCALL
GetFriendlyIfIndex(DWORD IfIndex
)
999 DWORD STDCALL
EnableRouter(HANDLE
* pHandle
, OVERLAPPED
* pOverlapped
)
1008 DWORD STDCALL
UnenableRouter(OVERLAPPED
* pOverlapped
, LPDWORD lpdwEnableCount
)
1017 DWORD STDCALL
GetIcmpStatisticsEx(PMIB_ICMP_EX pStats
,DWORD dwFamily
)
1026 DWORD STDCALL
NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO
**ppTable
,PDWORD pdwCount
,WINBOOL bOrder
,HANDLE hHeap
,DWORD dwFlags
)
1035 DWORD STDCALL
GetBestInterfaceEx(struct sockaddr
*pDestAddr
,PDWORD pdwBestIfIndex
)
1044 WINBOOL STDCALL
CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped
)
1053 PIP_ADAPTER_ORDER_MAP STDCALL
GetAdapterOrderMap(VOID
)
1062 DWORD STDCALL
GetAdaptersAddresses(ULONG Family
,DWORD Flags
,PVOID Reserved
,PIP_ADAPTER_ADDRESSES pAdapterAddresses
,PULONG pOutBufLen
)
1071 DWORD STDCALL
DisableMediaSense(HANDLE
*pHandle
,OVERLAPPED
*pOverLapped
)
1080 DWORD STDCALL
RestoreMediaSense(OVERLAPPED
* pOverlapped
,LPDWORD lpdwEnableCount
)
1089 DWORD STDCALL
GetIpErrorString(IP_STATUS ErrorCode
,PWCHAR Buffer
,PDWORD Size
)
1098 HANDLE STDCALL
IcmpCreateFile(
1109 HANDLE STDCALL
Icmp6CreateFile(
1120 WINBOOL STDCALL
IcmpCloseHandle(
1131 DWORD STDCALL
IcmpSendEcho(
1133 IPAddr DestinationAddress
,
1136 PIP_OPTION_INFORMATION RequestOptions
,
1156 IPAddr DestinationAddress
,
1159 PIP_OPTION_INFORMATION RequestOptions
,
1179 struct sockaddr_in6
*SourceAddress
,
1180 struct sockaddr_in6
*DestinationAddress
,
1183 PIP_OPTION_INFORMATION RequestOptions
,
1224 DWORD STDCALL
AllocateAndGetIfTableFromStack(PMIB_IFTABLE
*ppIfTable
,
1225 BOOL bOrder
, HANDLE heap
, DWORD flags
)
1234 DWORD STDCALL
AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE
*ppIpAddrTable
,
1235 BOOL bOrder
, HANDLE heap
, DWORD flags
)
1244 DWORD STDCALL
AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE
*
1245 ppIpForwardTable
, BOOL bOrder
, HANDLE heap
, DWORD flags
)
1254 DWORD STDCALL
AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE
*ppIpNetTable
,
1255 BOOL bOrder
, HANDLE heap
, DWORD flags
)
1264 DWORD STDCALL
AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE
*ppTcpTable
,
1265 BOOL bOrder
, HANDLE heap
, DWORD flags
)
1274 DWORD STDCALL
AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE
*ppUdpTable
,
1275 BOOL bOrder
, HANDLE heap
, DWORD flags
)