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;
244 ServerAddress->Length =
sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS);
245 ServerAddress->Address.lpSockaddr = (
PVOID)(ServerAddress + 1);
246 ServerAddress->Address.iSockaddrLength =
sizeof(
SOCKADDR);
255 ServerAddress->Address.lpSockaddr,
256 &ServerAddress->Address.iSockaddrLength))
259 ERR(
"%S is not a valid IP address\n", NameServer);
264 ServerAddress->Next = (
PVOID)(ServerAddress->Address.lpSockaddr + 1);
265 *
Ptr = &ServerAddress->Next;
282 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
291 *
Flags |= IP_ADAPTER_DHCP_ENABLED;
298 *
Flags |= IP_ADAPTER_REGISTER_ADAPTER_SUFFIX;
304 *
Flags |= IP_ADAPTER_DDNS_ENABLED;
326 ULONG InterfacesCount;
327 ULONG AdaptersCount = 0;
329 ULONG TotalSize = 0, RemainingSize;
334 TRACE(
"Family %u, Flags 0x%08x, Reserved %p, pAdapterAddress %p, pOutBufLen %p\n",
354 FIXME(
"IPv6 is not supported in ReactOS!\n");
359 WARN(
"IPv6 addresses ignored, IPv4 only\n");
368 RemainingSize = *pOutBufLen;
376 ERR(
"Could not open handle to tcpip.sys. Status %08x\n",
Status);
381 Status = GetInterfacesList(TcpFile, &InterfacesList, &InterfacesCount);
384 ERR(
"Could not get adapters list. Status %08x\n",
Status);
390 for (
i = 0;
i < InterfacesCount;
i++)
393 ULONG CurrentAASize = 0;
394 ULONG FriendlySize = 0, DescriptionSize = 0;
395 ULONG DhcpDomainSize = 0, DomainSize = 0;
397 if (InterfacesList[
i].tei_entity ==
IF_ENTITY)
408 PreviousAA->Next = CurrentAA;
411 CurrentAASize =
sizeof(IP_ADAPTER_ADDRESSES);
414 Status = GetInterfaceEntry(TcpFile, InterfacesList[
i],
Entry);
418 TRACE(
"Got entity %*s, index %u.\n",
422 CurrentAASize +=
Entry->if_descrlen +
sizeof(
CHAR);
432 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
437 ValueSize =
sizeof(
DWORD);
441 ValueSize =
sizeof(
DWORD);
446 DhcpDomainSize = ValueSize -
sizeof(
WCHAR);
447 CurrentAASize += DhcpDomainSize;
452 ValueSize =
sizeof(
DWORD);
457 DomainSize = ValueSize -
sizeof(
WCHAR);
458 CurrentAASize += DomainSize;
466 CurrentAASize +=
sizeof(
WCHAR);
472 CurrentAASize += DescriptionSize;
483 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
504 DescriptionSize = ValueSize -
sizeof(
WCHAR);
505 CurrentAASize += DescriptionSize;
514 CurrentAASize +=
sizeof(
WCHAR);
521 CurrentAASize += FriendlySize;
530 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
542 FriendlySize = ValueSize -
sizeof(
WCHAR);
543 CurrentAASize += FriendlySize;
551 CurrentAASize +=
sizeof(
WCHAR);
554 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
561 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
572 TotalSize += CurrentAASize;
575 if ((CurrentAA) && (RemainingSize >= CurrentAASize))
577 CurrentAA->Length =
sizeof(IP_ADAPTER_ADDRESSES);
578 CurrentAA->IfIndex =
Entry->if_index;
580 CurrentAA->PhysicalAddressLength =
Entry->if_physaddrlen;
581 QueryFlags(&
Entry->if_descr[0],
Entry->if_descrlen, &CurrentAA->Flags);
582 CurrentAA->Mtu =
Entry->if_mtu;
583 CurrentAA->IfType =
Entry->if_type;
594 CurrentAA->AdapterName = (
PCHAR)
Ptr;
595 CurrentAA->AdapterName[
Entry->if_descrlen] =
'\0';
597 Ptr = (
BYTE*)(CurrentAA->AdapterName +
Entry->if_descrlen + 1);
609 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
614 if (DhcpDomainSize != 0)
616 ValueSize = DhcpDomainSize +
sizeof(
WCHAR);
621 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + (ValueSize /
sizeof(
WCHAR)));
626 ERR(
"DhcpDomain name changed after probe!\n");
633 ValueSize = DomainSize +
sizeof(
WCHAR);
638 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + (ValueSize /
sizeof(
WCHAR)));
643 ERR(
"Domain name changed after probe!\n");
653 if ((DhcpDomainSize == 0) && (DomainSize == 0))
655 CurrentAA->DnsSuffix[0] =
L'\0';
657 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + 1);
663 if (DescriptionSize != 0)
670 CurrentAA->Description[
size] =
'\0';
683 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
699 ValueSize = DescriptionSize +
sizeof(
WCHAR);
704 Ptr = (
BYTE*)(CurrentAA->Description + (ValueSize /
sizeof(
WCHAR)));
709 ERR(
"Description name changed after probe!\n");
720 if (DescriptionSize == 0)
722 CurrentAA->Description[0] =
L'\0';
724 Ptr = (
BYTE*)(CurrentAA->Description + 1);
732 if (FriendlySize != 0)
739 CurrentAA->FriendlyName[
size] =
'\0';
749 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
755 DWORD ValueSize = FriendlySize +
sizeof(
WCHAR);
761 Ptr = (
BYTE*)(CurrentAA->FriendlyName + (ValueSize /
sizeof(
WCHAR)));
766 ERR(
"Friendly name changed after probe!\n");
781 if (FriendlySize == 0)
783 CurrentAA->FriendlyName[0] =
L'\0';
785 Ptr = (
BYTE*)(CurrentAA->FriendlyName + 1);
790 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
797 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
802 TRACE(
"Failed opening interface key for interface %*s\n",
Entry->if_descrlen, &
Entry->if_descr[0]);
806 PIP_ADAPTER_DNS_SERVER_ADDRESS* ServerAddressPtr;
808 CurrentAA->FirstDnsServerAddress = (PIP_ADAPTER_DNS_SERVER_ADDRESS)
Ptr;
809 ServerAddressPtr = &CurrentAA->FirstDnsServerAddress;
815 Ptr = (
BYTE*)*ServerAddressPtr;
816 *ServerAddressPtr =
NULL;
821 PreviousAA = CurrentAA;
822 RemainingSize -= CurrentAASize;
827 if (AdaptersCount == 0)
830 ERR(
"No Adapters found!\n");
841 for (
i = 0;
i < InterfacesCount;
i++)
853 Status = GetSnmpInfo(TcpFile, InterfacesList[
i], &SnmpInfo);
879 if (pAdapterAddresses)
881 CurrentAA = pAdapterAddresses;
884 if (CurrentAA->IfIndex == AddrEntries[
j].iae_index)
887 CurrentAA = CurrentAA->Next;
892 ERR(
"Got address for interface %u but no adapter was found for it.\n", AddrEntries[
j].iae_index);
898 TRACE(
"address is 0x%08x, mask is 0x%08x\n", AddrEntries[
j].iae_addr, AddrEntries[
j].iae_mask);
905 if (
Ptr && (RemainingSize >=
Size))
907 PIP_ADAPTER_UNICAST_ADDRESS UnicastAddress = (PIP_ADAPTER_UNICAST_ADDRESS)
Ptr;
910 UnicastAddress->Length =
sizeof(IP_ADAPTER_UNICAST_ADDRESS);
911 UnicastAddress->Next = CurrentAA->FirstUnicastAddress;
914 UnicastAddress->Flags = 0;
918 UnicastAddress->ValidLifetime = 0xFFFFFFFF;
919 UnicastAddress->PreferredLifetime = 0xFFFFFFFF;
923 UnicastAddress->Address.lpSockaddr = (
LPSOCKADDR)(UnicastAddress + 1);
924 UnicastAddress->Address.iSockaddrLength =
sizeof(
SOCKADDR);
925 UnicastAddress->Address.lpSockaddr->sa_family =
AF_INET;
926 ((
LPSOCKADDR_IN)UnicastAddress->Address.lpSockaddr)->sin_port = 0;
927 memcpy(&((
LPSOCKADDR_IN)UnicastAddress->Address.lpSockaddr)->sin_addr, &AddrEntries[
j].iae_addr,
sizeof(AddrEntries[
j].iae_addr));
929 CurrentAA->FirstUnicastAddress = UnicastAddress;
931 RemainingSize -=
Size;
937 if (
Flags & GAA_FLAG_INCLUDE_PREFIX)
941 if (
Ptr && (RemainingSize >=
Size))
943 PIP_ADAPTER_PREFIX
Prefix = (PIP_ADAPTER_PREFIX)
Ptr;
947 Prefix->Next = CurrentAA->FirstPrefix;
954 memcpy(
Prefix->Address.lpSockaddr->sa_data, &AddrEntries[
j].iae_mask,
sizeof(AddrEntries[
j].iae_mask));
959 CurrentAA->FirstPrefix =
Prefix;
961 RemainingSize -=
Size;
976 *pOutBufLen = TotalSize;
977 TRACE(
"TotalSize: %x\n", *pOutBufLen);
#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 ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
static PIP_ADAPTER_ADDRESSES
#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)
#define memcpy(s1, s2, n)
static const ENTRY Entries[]
#define sprintf(buf, format,...)
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 NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
#define UNREFERENCED_PARAMETER(P)
INT WSAAPI WSAStringToAddressW(IN LPWSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength)
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)
_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
_Must_inspect_result_ _In_ ULONG Flags
_In_ __drv_aliasesMem PSTRING Prefix