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;
396 if (InterfacesList[
i].tei_entity ==
IF_ENTITY)
407 PreviousAA->Next = CurrentAA;
410 CurrentAASize =
sizeof(IP_ADAPTER_ADDRESSES);
413 Status = GetInterfaceEntry(TcpFile, InterfacesList[
i],
Entry);
417 TRACE(
"Got entity %*s, index %u.\n",
421 CurrentAASize +=
Entry->if_descrlen +
sizeof(
CHAR);
424 CurrentAASize +=
sizeof(
WCHAR);
427 CurrentAASize +=
sizeof(
WCHAR);
436 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
448 FriendlySize = ValueSize -
sizeof(
WCHAR);
449 CurrentAASize += FriendlySize;
456 CurrentAASize +=
sizeof(
WCHAR);
459 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
466 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
477 TotalSize += CurrentAASize;
480 if ((CurrentAA) && (RemainingSize >= CurrentAASize))
482 CurrentAA->Length =
sizeof(IP_ADAPTER_ADDRESSES);
483 CurrentAA->IfIndex =
Entry->if_index;
485 CurrentAA->PhysicalAddressLength =
Entry->if_physaddrlen;
486 QueryFlags(&
Entry->if_descr[0],
Entry->if_descrlen, &CurrentAA->Flags);
487 CurrentAA->Mtu =
Entry->if_mtu;
488 CurrentAA->IfType =
Entry->if_type;
499 CurrentAA->AdapterName = (
PCHAR)
Ptr;
500 CurrentAA->AdapterName[
Entry->if_descrlen] =
'\0';
502 Ptr = (
BYTE*)(CurrentAA->AdapterName +
Entry->if_descrlen + 1);
506 CurrentAA->DnsSuffix[0] =
L'\0';
508 Ptr = (
BYTE*)(CurrentAA->DnsSuffix + 1);
512 CurrentAA->Description[0] =
L'\0';
514 Ptr = (
BYTE*)(CurrentAA->Description + 1);
521 if (FriendlySize != 0)
528 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%*s\\Connection",
534 DWORD ValueSize = FriendlySize +
sizeof(
WCHAR);
540 Ptr = (
BYTE*)(CurrentAA->FriendlyName + (ValueSize /
sizeof(
WCHAR)));
545 ERR(
"Friendly name changed after probe!\n");
559 if (FriendlySize == 0)
561 CurrentAA->FriendlyName[0] =
L'\0';
563 Ptr = (
BYTE*)(CurrentAA->FriendlyName + 1);
568 if (!(
Flags & GAA_FLAG_SKIP_DNS_SERVER))
575 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%*s",
580 TRACE(
"Failed opening interface key for interface %*s\n",
Entry->if_descrlen, &
Entry->if_descr[0]);
584 PIP_ADAPTER_DNS_SERVER_ADDRESS* ServerAddressPtr;
586 CurrentAA->FirstDnsServerAddress = (PIP_ADAPTER_DNS_SERVER_ADDRESS)
Ptr;
587 ServerAddressPtr = &CurrentAA->FirstDnsServerAddress;
593 Ptr = (
BYTE*)*ServerAddressPtr;
594 *ServerAddressPtr =
NULL;
599 PreviousAA = CurrentAA;
600 RemainingSize -= CurrentAASize;
605 if (AdaptersCount == 0)
608 ERR(
"No Adapters found!\n");
619 for (
i = 0;
i < InterfacesCount;
i++)
631 Status = GetSnmpInfo(TcpFile, InterfacesList[
i], &SnmpInfo);
657 if (pAdapterAddresses)
659 CurrentAA = pAdapterAddresses;
662 if (CurrentAA->IfIndex == AddrEntries[
j].iae_index)
665 CurrentAA = CurrentAA->Next;
670 ERR(
"Got address for interface %u but no adapter was found for it.\n", AddrEntries[
j].iae_index);
676 TRACE(
"address is 0x%08x, mask is 0x%08x\n", AddrEntries[
j].iae_addr, AddrEntries[
j].iae_mask);
683 if (
Ptr && (RemainingSize >=
Size))
685 PIP_ADAPTER_UNICAST_ADDRESS UnicastAddress = (PIP_ADAPTER_UNICAST_ADDRESS)
Ptr;
688 UnicastAddress->Length =
sizeof(IP_ADAPTER_UNICAST_ADDRESS);
689 UnicastAddress->Next = CurrentAA->FirstUnicastAddress;
692 UnicastAddress->Flags = 0;
696 UnicastAddress->ValidLifetime = 0xFFFFFFFF;
697 UnicastAddress->PreferredLifetime = 0xFFFFFFFF;
701 UnicastAddress->Address.lpSockaddr = (
LPSOCKADDR)(UnicastAddress + 1);
702 UnicastAddress->Address.iSockaddrLength =
sizeof(
SOCKADDR);
703 UnicastAddress->Address.lpSockaddr->sa_family =
AF_INET;
704 ((
LPSOCKADDR_IN)UnicastAddress->Address.lpSockaddr)->sin_port = 0;
705 memcpy(&((
LPSOCKADDR_IN)UnicastAddress->Address.lpSockaddr)->sin_addr, &AddrEntries[
j].iae_addr,
sizeof(AddrEntries[
j].iae_addr));
707 CurrentAA->FirstUnicastAddress = UnicastAddress;
709 RemainingSize -=
Size;
715 if (
Flags & GAA_FLAG_INCLUDE_PREFIX)
719 if (
Ptr && (RemainingSize >=
Size))
721 PIP_ADAPTER_PREFIX
Prefix = (PIP_ADAPTER_PREFIX)
Ptr;
725 Prefix->Next = CurrentAA->FirstPrefix;
732 memcpy(
Prefix->Address.lpSockaddr->sa_data, &AddrEntries[
j].iae_mask,
sizeof(AddrEntries[
j].iae_mask));
737 CurrentAA->FirstPrefix =
Prefix;
739 RemainingSize -=
Size;
754 *pOutBufLen = TotalSize;
755 TRACE(
"TotalSize: %x\n", *pOutBufLen);
#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 RTL_FIELD_SIZE(type, field)
#define memcpy(s1, s2, n)
static const ENTRY Entries[]
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)
#define DECLSPEC_HOTPATCH
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_ 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