12#ifdef GetAdaptersAddressesV2
28 ZeroMemory(&TcpQueryInfo,
sizeof(TcpQueryInfo));
103 ZeroMemory(&TcpQueryInfo,
sizeof(TcpQueryInfo));
117 sizeof(TcpQueryInfo),
143 ZeroMemory(&TcpQueryInfo,
sizeof(TcpQueryInfo));
157 sizeof(TcpQueryInfo),
159 NumEntries *
sizeof(
Entries[0]));
187 ZeroMemory(&TcpQueryInfo,
sizeof(TcpQueryInfo));
201 sizeof(TcpQueryInfo),
218EnumerateServerNameSize(
239 PIP_ADAPTER_DNS_SERVER_ADDRESS**
Ptr =
Data;
240 PIP_ADAPTER_DNS_SERVER_ADDRESS ServerAddress = **
Ptr;
246 ServerAddress->Length =
sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS);
247 ServerAddress->Address.lpSockaddr = (
PVOID)(ServerAddress + 1);
248 ServerAddress->Address.iSockaddrLength =
sizeof(
SOCKADDR);
250 ServerAddress->Address.lpSockaddr->sa_family =
AF_INET;
251 ((
LPSOCKADDR_IN)ServerAddress->Address.lpSockaddr)->sin_port = 0;
254 &((
LPSOCKADDR_IN)ServerAddress->Address.lpSockaddr)->sin_addr);
258 ERR(
"%S is not a valid IP address\n", NameServer);
263 ServerAddress->Next = (
PVOID)(ServerAddress->Address.lpSockaddr + 1);
264 *
Ptr = &ServerAddress->Next;
281 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
290 *
Flags |= IP_ADAPTER_DHCP_ENABLED;
297 *
Flags |= IP_ADAPTER_REGISTER_ADAPTER_SUFFIX;
303 *
Flags |= IP_ADAPTER_DDNS_ENABLED;
319 for (
i = 0;
i <
sizeof(
ULONG) * 8;
i++)
321 if ((Netmask & (1 <<
i)) == 0)
336 _Inout_ PIP_ADAPTER_ADDRESSES pAdapterAddresses,
342 ULONG InterfacesCount;
343 ULONG AdaptersCount = 0;
345 ULONG TotalSize = 0, RemainingSize;
348 PIP_ADAPTER_ADDRESSES PreviousAA =
NULL;
350 TRACE(
"Family %u, Flags 0x%08x, Reserved %p, pAdapterAddress %p, pOutBufLen %p\n",
370 FIXME(
"IPv6 is not supported in ReactOS!\n");
375 WARN(
"IPv6 addresses ignored, IPv4 only\n");
384 RemainingSize = *pOutBufLen;
392 ERR(
"Could not open handle to tcpip.sys. Status %08x\n",
Status);
397 Status = GetInterfacesList(TcpFile, &InterfacesList, &InterfacesCount);
400 ERR(
"Could not get adapters list. Status %08x\n",
Status);
406 for (
i = 0;
i < InterfacesCount;
i++)
408 PIP_ADAPTER_ADDRESSES CurrentAA = (PIP_ADAPTER_ADDRESSES)
Ptr;
409 ULONG CurrentAASize = 0;
410 ULONG FriendlySize = 0, DescriptionSize = 0;
411 ULONG DhcpDomainSize = 0, DomainSize = 0;
413 if (InterfacesList[
i].tei_entity ==
IF_ENTITY)
424 PreviousAA->Next = CurrentAA;
427 CurrentAASize =
sizeof(IP_ADAPTER_ADDRESSES);
430 Status = GetInterfaceEntry(TcpFile, InterfacesList[
i],
Entry);
434 TRACE(
"Got entity %*s, index %u.\n",
438 CurrentAASize +=
Entry->if_descrlen +
sizeof(
CHAR);
448 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
453 ValueSize =
sizeof(
DWORD);
457 ValueSize =
sizeof(
DWORD);
462 DhcpDomainSize = ValueSize -
sizeof(
WCHAR);
463 CurrentAASize += DhcpDomainSize;
468 ValueSize =
sizeof(
DWORD);
473 DomainSize = ValueSize -
sizeof(
WCHAR);
474 CurrentAASize += DomainSize;
482 CurrentAASize +=
sizeof(
WCHAR);
488 CurrentAASize += DescriptionSize;
499 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
520 DescriptionSize = ValueSize -
sizeof(
WCHAR);
521 CurrentAASize += DescriptionSize;
530 CurrentAASize +=
sizeof(
WCHAR);
537 CurrentAASize += FriendlySize;
546 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
558 FriendlySize = ValueSize -
sizeof(
WCHAR);
559 CurrentAASize += FriendlySize;
567 CurrentAASize +=
sizeof(
WCHAR);
570 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
577 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
588 TotalSize += CurrentAASize;
591 if ((CurrentAA) && (RemainingSize >= CurrentAASize))
593 CurrentAA->Length =
sizeof(IP_ADAPTER_ADDRESSES);
594 CurrentAA->IfIndex =
Entry->if_index;
596 CurrentAA->PhysicalAddressLength =
Entry->if_physaddrlen;
597 QueryFlags(&
Entry->if_descr[0],
Entry->if_descrlen, &CurrentAA->Flags);
598 CurrentAA->Mtu =
Entry->if_mtu;
599 CurrentAA->IfType =
Entry->if_type;
610 CurrentAA->AdapterName = (
PCHAR)
Ptr;
611 CurrentAA->AdapterName[
Entry->if_descrlen] =
'\0';
613 Ptr = (
BYTE*)(CurrentAA->AdapterName +
Entry->if_descrlen + 1);
625 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
630 if (DhcpDomainSize != 0)
632 ValueSize = DhcpDomainSize +
sizeof(
WCHAR);
637 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + (ValueSize /
sizeof(
WCHAR)));
642 ERR(
"DhcpDomain name changed after probe!\n");
649 ValueSize = DomainSize +
sizeof(
WCHAR);
654 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + (ValueSize /
sizeof(
WCHAR)));
659 ERR(
"Domain name changed after probe!\n");
669 if ((DhcpDomainSize == 0) && (DomainSize == 0))
671 CurrentAA->DnsSuffix[0] =
L'\0';
673 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + 1);
679 if (DescriptionSize != 0)
686 CurrentAA->Description[
size] =
'\0';
699 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
715 ValueSize = DescriptionSize +
sizeof(
WCHAR);
720 Ptr = (
BYTE*)(CurrentAA->Description + (ValueSize /
sizeof(
WCHAR)));
725 ERR(
"Description name changed after probe!\n");
736 if (DescriptionSize == 0)
738 CurrentAA->Description[0] =
L'\0';
740 Ptr = (
BYTE*)(CurrentAA->Description + 1);
748 if (FriendlySize != 0)
755 CurrentAA->FriendlyName[
size] =
'\0';
765 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
771 DWORD ValueSize = FriendlySize +
sizeof(
WCHAR);
777 Ptr = (
BYTE*)(CurrentAA->FriendlyName + (ValueSize /
sizeof(
WCHAR)));
782 ERR(
"Friendly name changed after probe!\n");
797 if (FriendlySize == 0)
799 CurrentAA->FriendlyName[0] =
L'\0';
801 Ptr = (
BYTE*)(CurrentAA->FriendlyName + 1);
806 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
813 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
818 TRACE(
"Failed opening interface key for interface %*s\n",
Entry->if_descrlen, &
Entry->if_descr[0]);
822 PIP_ADAPTER_DNS_SERVER_ADDRESS* ServerAddressPtr;
824 CurrentAA->FirstDnsServerAddress = (PIP_ADAPTER_DNS_SERVER_ADDRESS)
Ptr;
825 ServerAddressPtr = &CurrentAA->FirstDnsServerAddress;
831 Ptr = (
BYTE*)*ServerAddressPtr;
832 *ServerAddressPtr =
NULL;
837 PreviousAA = CurrentAA;
838 RemainingSize -= CurrentAASize;
843 if (AdaptersCount == 0)
846 ERR(
"No Adapters found!\n");
857 for (
i = 0;
i < InterfacesCount;
i++)
864 PIP_ADAPTER_ADDRESSES CurrentAA =
NULL;
869 Status = GetSnmpInfo(TcpFile, InterfacesList[
i], &SnmpInfo);
895 if (pAdapterAddresses)
897 CurrentAA = pAdapterAddresses;
900 if (CurrentAA->IfIndex == AddrEntries[
j].iae_index)
903 CurrentAA = CurrentAA->Next;
908 ERR(
"Got address for interface %u but no adapter was found for it.\n", AddrEntries[
j].iae_index);
914 TRACE(
"address is 0x%08x, mask is 0x%08x\n", AddrEntries[
j].iae_addr, AddrEntries[
j].iae_mask);
921 if (
Ptr && (RemainingSize >=
Size))
923 PIP_ADAPTER_UNICAST_ADDRESS UnicastAddress = (PIP_ADAPTER_UNICAST_ADDRESS)
Ptr;
926 UnicastAddress->Length =
sizeof(IP_ADAPTER_UNICAST_ADDRESS);
927 UnicastAddress->Next = CurrentAA->FirstUnicastAddress;
930 UnicastAddress->Flags = 0;
934 UnicastAddress->ValidLifetime = 0xFFFFFFFF;
935 UnicastAddress->PreferredLifetime = 0xFFFFFFFF;
939 UnicastAddress->Address.lpSockaddr = (
LPSOCKADDR)(UnicastAddress + 1);
940 UnicastAddress->Address.iSockaddrLength =
sizeof(
SOCKADDR);
941 UnicastAddress->Address.lpSockaddr->sa_family =
AF_INET;
942 ((
LPSOCKADDR_IN)UnicastAddress->Address.lpSockaddr)->sin_port = 0;
945 CurrentAA->FirstUnicastAddress = UnicastAddress;
947 RemainingSize -=
Size;
953 if (
Flags & GAA_FLAG_INCLUDE_PREFIX)
957 if (
Ptr && (RemainingSize >=
Size))
959 PIP_ADAPTER_PREFIX
Prefix = (PIP_ADAPTER_PREFIX)
Ptr;
963 Prefix->Next = CurrentAA->FirstPrefix;
974 Prefix->PrefixLength = CountPrefixBits(AddrEntries[
j].iae_mask);
976 CurrentAA->FirstPrefix =
Prefix;
978 RemainingSize -=
Size;
993 *pOutBufLen = TotalSize;
994 TRACE(
"TotalSize: %x\n", *pOutBufLen);
1008NhpAllocateAndGetInterfaceInfoFromStack(
1018 ULONG InterfacesCount;
1019 ULONG AdaptersCount = 0;
1025 TRACE(
"ppTable %p, pdwCount %p, bOrder %u, hHeap %p, dwFlags %lu\n",
1026 ppTable, pdwCount, bOrder, hHeap,
dwFlags);
1032 ERR(
"Could not open handle to tcpip.sys. Status %08x\n",
Status);
1037 Status = GetInterfacesList(TcpFile, &InterfacesList, &InterfacesCount);
1040 ERR(
"Could not get adapters list. Status %08x\n",
Status);
1045 for (
i = 0;
i < InterfacesCount;
i++)
1047 if (InterfacesList[
i].tei_entity ==
IF_ENTITY)
1054 Status = GetInterfaceEntry(TcpFile, InterfacesList[
i],
Entry);
1063 TRACE(
"InterfacesCount %lu AdaptersCount %lu\n", InterfacesCount, AdaptersCount);
1072 for (
i = 0,
j = 0;
i < InterfacesCount;
i++)
1074 if (InterfacesList[
i].tei_entity ==
IF_ENTITY)
1081 Status = GetInterfaceEntry(TcpFile, InterfacesList[
i],
Entry);
1085 TRACE(
"Got entity %*s, index %u.\n",
1099 &AnsiGuidString,
TRUE);
1125 *pdwCount = AdaptersCount;
#define DECLSPEC_HOTPATCH
#define IP_MIB_ADDRTABLE_ENTRY_ID
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define RegCloseKey(hKey)
#define NT_SUCCESS(StatCode)
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define ERROR_INVALID_PARAMETER
#define HeapFree(x, y, z)
TDIEntityInfo * EntityList
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define MAX_ADAPTER_DESCRIPTION_LENGTH
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define GAA_FLAG_SKIP_FRIENDLY_NAME
#define GAA_FLAG_SKIP_UNICAST
LSTATUS EnumNameServers(HKEY RegHandle, LPWSTR Interface, PVOID Data, EnumNameServersFunc cb)
@ IF_OPER_STATUS_CONNECTING
#define IF_TYPE_SOFTWARE_LOOPBACK
#define RTL_FIELD_SIZE(type, field)
static const ENTRY Entries[]
NTSYSAPI NTSTATUS NTAPI RtlIpv4StringToAddressW(_In_ PCWSTR String, _In_ BOOLEAN Strict, _Out_ PCWSTR *Terminator, _Out_ struct in_addr *Addr)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
#define UNREFERENCED_PARAMETER(P)
NTSTATUS openTcpFile(PHANDLE tcpFile, ACCESS_MASK DesiredAccess)
base of all file and directory entries
struct _TDIEntityID TDIEntityID
#define INFO_CLASS_PROTOCOL
#define INFO_CLASS_GENERIC
#define INFO_TYPE_PROVIDER
#define IOCTL_TCP_QUERY_INFORMATION_EX
#define FIELD_OFFSET(t, f)
static const EHCI_PERIOD pTable[]
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING InstanceID
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
_Reserved_ PVOID Reserved
#define ERROR_BUFFER_OVERFLOW
#define HKEY_LOCAL_MACHINE
struct sockaddr_in * LPSOCKADDR_IN
struct sockaddr * LPSOCKADDR
static const GUID InterfaceGuid
_Must_inspect_result_ _In_ ULONG Flags
_In_ __drv_aliasesMem PSTRING Prefix