2025-05-13 19:45:22 +03:00

787 lines
37 KiB
C

/*
* Process Hacker Plugins -
* Hardware Devices Plugin
*
* Copyright (C) 2015-2016 dmex
* Copyright (C) 2016 wj32
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include "devices.h"
VOID NTAPI NetAdapterProcessesUpdatedHandler(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
{
PDV_NETADAPTER_DETAILS_CONTEXT context = Context;
if (context->WindowHandle)
{
PostMessage(context->WindowHandle, UPDATE_MSG, 0, 0);
}
}
VOID NetAdapterAddListViewItemGroups(
_In_ HWND ListViewHandle
)
{
if (WindowsVersion >= WINDOWS_VISTA)
{
ListView_EnableGroupView(ListViewHandle, TRUE);
AddListViewGroup(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, L"Adapter");
AddListViewGroup(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, L"Unicast");
AddListViewGroup(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, L"Broadcast");
AddListViewGroup(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, L"Multicast");
AddListViewGroup(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, L"Errors");
}
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_STATE, L"State", NULL);
//AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_CONNECTIVITY, L"Connectivity");
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_IPADDRESS, L"IP address", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_SUBNET, L"Subnet mask", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_GATEWAY, L"Default gateway", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_DNS, L"DNS", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_DOMAIN, L"Domain", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_LINKSPEED, L"Link speed", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_SENT, L"Sent", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_RECEIVED, L"Received", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_TOTAL, L"Total", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_SENDING, L"Sending", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_RECEIVING, L"Receiving", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ADAPTER, NETADAPTER_DETAILS_INDEX_UTILIZATION, L"Utilization", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_SENTPKTS, L"Sent packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_RECVPKTS, L"Received packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_TOTALPKTS, L"Total packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_SENT, L"Sent", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_RECEIVED, L"Received", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_TOTAL, L"Total", NULL);
//AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_SENDING, L"Sending");
//AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_RECEIVING, L"Receiving");
//AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_UNICAST, NETADAPTER_DETAILS_INDEX_UNICAST_UTILIZATION, L"Utilization");
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_SENTPKTS, L"Sent packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_RECVPKTS, L"Received packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_TOTALPKTS, L"Total packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_SENT, L"Sent", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_RECEIVED, L"Received", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_BROADCAST, NETADAPTER_DETAILS_INDEX_BROADCAST_TOTAL, L"Total", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_SENTPKTS, L"Sent packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_RECVPKTS, L"Received packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_TOTALPKTS, L"Total packets", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_SENT, L"Sent", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_RECEIVED, L"Received", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_MULTICAST, NETADAPTER_DETAILS_INDEX_MULTICAST_TOTAL, L"Total", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_SENTPKTS, L"Send errors", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_RECVPKTS, L"Receive errors", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_TOTALPKTS, L"Total errors", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_SENT, L"Send discards", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_RECEIVED, L"Receive discards", NULL);
AddListViewItemGroupId(ListViewHandle, NETADAPTER_DETAILS_CATEGORY_ERRORS, NETADAPTER_DETAILS_INDEX_ERRORS_TOTAL, L"Total discards", NULL);
}
PVOID NetAdapterGetAddresses(
_In_ ULONG Family
)
{
ULONG flags;
ULONG bufferLength = 0;
PIP_ADAPTER_ADDRESSES buffer = NULL;
flags = GAA_FLAG_INCLUDE_GATEWAYS | GAA_FLAG_SKIP_FRIENDLY_NAME;
if (WindowsVersion >= WINDOWS_VISTA)
{
flags |= GAA_FLAG_INCLUDE_ALL_INTERFACES;
}
if (GetAdaptersAddresses(Family, flags, NULL, NULL, &bufferLength) != ERROR_BUFFER_OVERFLOW)
{
return NULL;
}
buffer = PhAllocate(bufferLength);
memset(buffer, 0, bufferLength);
if (GetAdaptersAddresses(Family, flags, NULL, buffer, &bufferLength) != ERROR_SUCCESS)
{
PhFree(buffer);
return NULL;
}
return buffer;
}
VOID NetAdapterEnumerateAddresses(
_In_ PVOID AddressesBuffer,
_In_ ULONG64 InterfaceLuid,
_In_ PPH_STRING_BUILDER DomainBuffer,
_In_ PPH_STRING_BUILDER IpAddressBuffer,
_In_ PPH_STRING_BUILDER SubnetAddressBuffer,
_In_ PPH_STRING_BUILDER GatewayAddressBuffer,
_In_ PPH_STRING_BUILDER DnsAddressBuffer
)
{
PIP_ADAPTER_ADDRESSES addressesBuffer;
PIP_ADAPTER_UNICAST_ADDRESS unicastAddress;
PIP_ADAPTER_GATEWAY_ADDRESS gatewayAddress;
PIP_ADAPTER_DNS_SERVER_ADDRESS dnsAddress;
for (addressesBuffer = AddressesBuffer; addressesBuffer; addressesBuffer = addressesBuffer->Next)
{
if (addressesBuffer->Luid.Value != InterfaceLuid)
continue;
if (addressesBuffer->DnsSuffix && PhCountStringZ(addressesBuffer->DnsSuffix) > 0)
{
PhAppendFormatStringBuilder(DomainBuffer, L"%s, ", addressesBuffer->DnsSuffix);
}
for (unicastAddress = addressesBuffer->FirstUnicastAddress; unicastAddress; unicastAddress = unicastAddress->Next)
{
if (unicastAddress->Address.lpSockaddr->sa_family == AF_INET)
{
PSOCKADDR_IN sockAddrIn = { 0 };
IN_ADDR subnetMask = { 0 };
WCHAR ipv4AddressString[INET_ADDRSTRLEN] = L"";
WCHAR subnetAddressString[INET_ADDRSTRLEN] = L"";
sockAddrIn = (PSOCKADDR_IN)unicastAddress->Address.lpSockaddr;
if (WindowsVersion >= WINDOWS_VISTA && ConvertLengthToIpv4Mask)
{
ConvertLengthToIpv4Mask(unicastAddress->OnLinkPrefixLength, &subnetMask.s_addr);
}
if (RtlIpv4AddressToString(&sockAddrIn->sin_addr, ipv4AddressString))
{
PhAppendFormatStringBuilder(IpAddressBuffer, L"%s, ", ipv4AddressString);
}
if (RtlIpv4AddressToString(&subnetMask, subnetAddressString))
{
PhAppendFormatStringBuilder(SubnetAddressBuffer, L"%s, ", subnetAddressString);
}
}
if (unicastAddress->Address.lpSockaddr->sa_family == AF_INET6)
{
PSOCKADDR_IN6 sockAddrIn6 = { 0 };
WCHAR ipv6AddressString[INET6_ADDRSTRLEN] = L"";
sockAddrIn6 = (PSOCKADDR_IN6)unicastAddress->Address.lpSockaddr;
if (RtlIpv6AddressToString(&sockAddrIn6->sin6_addr, ipv6AddressString))
{
PhAppendFormatStringBuilder(IpAddressBuffer, L"%s, ", ipv6AddressString);
}
}
}
for (gatewayAddress = addressesBuffer->FirstGatewayAddress; gatewayAddress; gatewayAddress = gatewayAddress->Next)
{
if (gatewayAddress->Address.lpSockaddr->sa_family == AF_INET)
{
PSOCKADDR_IN sockAddrIn = { 0 };
WCHAR ipv4AddressString[INET_ADDRSTRLEN] = L"";
sockAddrIn = (PSOCKADDR_IN)gatewayAddress->Address.lpSockaddr;
if (RtlIpv4AddressToString(&sockAddrIn->sin_addr, ipv4AddressString))
{
PhAppendFormatStringBuilder(GatewayAddressBuffer, L"%s, ", ipv4AddressString);
}
}
if (gatewayAddress->Address.lpSockaddr->sa_family == AF_INET6)
{
PSOCKADDR_IN6 sockAddrIn6 = (PSOCKADDR_IN6)gatewayAddress->Address.lpSockaddr;
WCHAR ipv6AddressString[INET6_ADDRSTRLEN] = L"";
if (RtlIpv6AddressToString(&sockAddrIn6->sin6_addr, ipv6AddressString))
{
PhAppendFormatStringBuilder(GatewayAddressBuffer, L"%s, ", ipv6AddressString);
}
}
}
for (dnsAddress = addressesBuffer->FirstDnsServerAddress; dnsAddress; dnsAddress = dnsAddress->Next)
{
if (dnsAddress->Address.lpSockaddr->sa_family == AF_INET)
{
PSOCKADDR_IN sockAddrIn = (PSOCKADDR_IN)dnsAddress->Address.lpSockaddr;
WCHAR ipv4AddressString[INET_ADDRSTRLEN] = L"";
if (RtlIpv4AddressToString(&sockAddrIn->sin_addr, ipv4AddressString))
{
PhAppendFormatStringBuilder(DnsAddressBuffer, L"%s, ", ipv4AddressString);
}
}
else if (dnsAddress->Address.lpSockaddr->sa_family == AF_INET6)
{
PSOCKADDR_IN6 sockAddrIn6 = (PSOCKADDR_IN6)dnsAddress->Address.lpSockaddr;
WCHAR ipv6AddressString[INET6_ADDRSTRLEN] = L"";
if (RtlIpv6AddressToString(&sockAddrIn6->sin6_addr, ipv6AddressString))
{
PhAppendFormatStringBuilder(DnsAddressBuffer, L"%s, ", ipv6AddressString);
}
}
}
}
}
VOID NetAdapterLookupConfig(
_Inout_ PDV_NETADAPTER_DETAILS_CONTEXT Context
)
{
if (WindowsVersion >= WINDOWS_VISTA)
{
PVOID addressesBuffer = NULL;
PPH_STRING domainString = NULL;
PPH_STRING ipAddressString = NULL;
PPH_STRING subnetAddressString = NULL;
PPH_STRING gatewayAddressString = NULL;
PPH_STRING dnsAddressString = NULL;
PH_STRING_BUILDER domainBuffer;
PH_STRING_BUILDER ipAddressBuffer;
PH_STRING_BUILDER subnetAddressBuffer;
PH_STRING_BUILDER gatewayAddressBuffer;
PH_STRING_BUILDER dnsAddressBuffer;
PhInitializeStringBuilder(&domainBuffer, 64);
PhInitializeStringBuilder(&ipAddressBuffer, 64);
PhInitializeStringBuilder(&subnetAddressBuffer, 64);
PhInitializeStringBuilder(&gatewayAddressBuffer, 64);
PhInitializeStringBuilder(&dnsAddressBuffer, 64);
if (addressesBuffer = NetAdapterGetAddresses(AF_INET))
{
NetAdapterEnumerateAddresses(
addressesBuffer,
Context->AdapterId.InterfaceLuid.Value,
&domainBuffer,
&ipAddressBuffer,
&subnetAddressBuffer,
&gatewayAddressBuffer,
&dnsAddressBuffer
);
PhFree(addressesBuffer);
}
if (addressesBuffer = NetAdapterGetAddresses(AF_INET6))
{
NetAdapterEnumerateAddresses(
addressesBuffer,
Context->AdapterId.InterfaceLuid.Value,
&domainBuffer,
&ipAddressBuffer,
&subnetAddressBuffer,
&gatewayAddressBuffer,
&dnsAddressBuffer
);
PhFree(addressesBuffer);
}
if (domainBuffer.String->Length > 2)
PhRemoveEndStringBuilder(&domainBuffer, 2);
if (ipAddressBuffer.String->Length > 2)
PhRemoveEndStringBuilder(&ipAddressBuffer, 2);
if (subnetAddressBuffer.String->Length > 2)
PhRemoveEndStringBuilder(&subnetAddressBuffer, 2);
if (gatewayAddressBuffer.String->Length > 2)
PhRemoveEndStringBuilder(&gatewayAddressBuffer, 2);
if (dnsAddressBuffer.String->Length > 2)
PhRemoveEndStringBuilder(&dnsAddressBuffer, 2);
domainString = PhFinalStringBuilderString(&domainBuffer);
ipAddressString = PhFinalStringBuilderString(&ipAddressBuffer);
subnetAddressString = PhFinalStringBuilderString(&subnetAddressBuffer);
gatewayAddressString = PhFinalStringBuilderString(&gatewayAddressBuffer);
dnsAddressString = PhFinalStringBuilderString(&dnsAddressBuffer);
//PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_CONNECTIVITY, 1, internet ? L"Internet" : L"Local");
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_IPADDRESS, 1, ipAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_SUBNET, 1, subnetAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_GATEWAY, 1, gatewayAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_DNS, 1, dnsAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_DOMAIN, 1, domainString->Buffer);
PhDeleteStringBuilder(&domainBuffer);
PhDeleteStringBuilder(&ipAddressBuffer);
PhDeleteStringBuilder(&subnetAddressBuffer);
PhDeleteStringBuilder(&gatewayAddressBuffer);
PhDeleteStringBuilder(&dnsAddressBuffer);
}
else
{
static PH_STRINGREF tcpIpv4KeyName = PH_STRINGREF_INIT(L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
HANDLE keyHandle;
PPH_STRING keyNameIpV4;
keyNameIpV4 = PhConcatStringRef2(&tcpIpv4KeyName, &Context->AdapterId.InterfaceGuid->sr);
if (NT_SUCCESS(PhOpenKey(
&keyHandle,
KEY_READ,
PH_KEY_LOCAL_MACHINE,
&keyNameIpV4->sr,
0
)))
{
PPH_STRING domainString = NULL;
PPH_STRING ipAddressString = NULL;
PPH_STRING subnetAddressString = NULL;
PPH_STRING gatewayAddressString = NULL;
domainString = PhQueryRegistryString(keyHandle, L"DhcpDomain");
ipAddressString = PhQueryRegistryString(keyHandle, L"DhcpIPAddress");
subnetAddressString = PhQueryRegistryString(keyHandle, L"DhcpSubnetMask");
gatewayAddressString = PhQueryRegistryString(keyHandle, L"DhcpDefaultGateway");
if (PhIsNullOrEmptyString(domainString))
PhMoveReference(&domainString, PhQueryRegistryString(keyHandle, L"Domain"));
if (PhIsNullOrEmptyString(ipAddressString))
PhMoveReference(&ipAddressString, PhQueryRegistryString(keyHandle, L"IPAddress"));
if (PhIsNullOrEmptyString(subnetAddressString))
PhMoveReference(&subnetAddressString, PhQueryRegistryString(keyHandle, L"SubnetMask"));
if (PhIsNullOrEmptyString(gatewayAddressString))
PhMoveReference(&gatewayAddressString, PhQueryRegistryString(keyHandle, L"DefaultGateway"));
//PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_CONNECTIVITY, 1, internet ? L"Internet" : L"Local");
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_IPADDRESS, 1, PhIsNullOrEmptyString(ipAddressString) ? L"" : ipAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_SUBNET, 1, PhIsNullOrEmptyString(subnetAddressString) ? L"" : subnetAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_GATEWAY, 1, PhIsNullOrEmptyString(gatewayAddressString) ? L"" : gatewayAddressString->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_DOMAIN, 1, PhIsNullOrEmptyString(domainString) ? L"" : domainString->Buffer);
PhClearReference(&domainString);
PhClearReference(&ipAddressString);
PhClearReference(&subnetAddressString);
PhClearReference(&gatewayAddressString);
NtClose(keyHandle);
}
PhDereferenceObject(keyNameIpV4);
}
}
VOID NETIOAPI_API_ NetAdapterChangeCallback(
_In_ PVOID CallerContext,
_In_opt_ PMIB_IPINTERFACE_ROW Row,
_In_ MIB_NOTIFICATION_TYPE NotificationType
)
{
PDV_NETADAPTER_DETAILS_CONTEXT context = CallerContext;
if (NotificationType == MibInitialNotification)
{
NetAdapterLookupConfig(context);
}
else if (NotificationType == MibParameterNotification)
{
if (Row->InterfaceLuid.Value = context->AdapterId.InterfaceLuid.Value)
{
NetAdapterLookupConfig(context);
}
}
}
VOID NetAdapterUpdateDetails(
_Inout_ PDV_NETADAPTER_DETAILS_CONTEXT Context
)
{
ULONG64 interfaceLinkSpeed = 0;
ULONG64 interfaceRcvSpeed = 0;
ULONG64 interfaceXmitSpeed = 0;
NDIS_STATISTICS_INFO interfaceStats = { 0 };
NDIS_MEDIA_CONNECT_STATE mediaState = MediaConnectStateUnknown;
HANDLE deviceHandle = NULL;
if (PhGetIntegerSetting(SETTING_NAME_ENABLE_NDIS))
{
// Create the handle to the network device
if (NT_SUCCESS(NetworkAdapterCreateHandle(&deviceHandle, Context->AdapterId.InterfaceGuid)))
{
if (!Context->CheckedDeviceSupport)
{
// Check the network adapter supports the OIDs we're going to be using.
if (NetworkAdapterQuerySupported(deviceHandle))
{
Context->DeviceSupported = TRUE;
}
Context->CheckedDeviceSupport = TRUE;
}
if (!Context->DeviceSupported)
{
// Device is faulty. Close the handle so we can fallback to GetIfEntry.
NtClose(deviceHandle);
deviceHandle = NULL;
}
}
}
if (deviceHandle)
{
NDIS_LINK_STATE interfaceState;
NetworkAdapterQueryStatistics(deviceHandle, &interfaceStats);
if (NT_SUCCESS(NetworkAdapterQueryLinkState(deviceHandle, &interfaceState)))
{
mediaState = interfaceState.MediaConnectState;
interfaceLinkSpeed = interfaceState.XmitLinkSpeed;
}
else
{
NetworkAdapterQueryLinkSpeed(deviceHandle, &interfaceLinkSpeed);
}
NtClose(deviceHandle);
}
else
{
if (WindowsVersion >= WINDOWS_VISTA && GetIfEntry2)
{
MIB_IF_ROW2 interfaceRow;
if (QueryInterfaceRowVista(&Context->AdapterId, &interfaceRow))
{
interfaceStats.ifInDiscards = interfaceRow.InDiscards;
interfaceStats.ifInErrors = interfaceRow.InErrors;
interfaceStats.ifHCInOctets = interfaceRow.InOctets;
interfaceStats.ifHCInUcastPkts = interfaceRow.InUcastPkts;
//interfaceStats.ifHCInMulticastPkts;
//interfaceStats.ifHCInBroadcastPkts;
interfaceStats.ifHCOutOctets = interfaceRow.OutOctets;
interfaceStats.ifHCOutUcastPkts = interfaceRow.OutUcastPkts;
//interfaceStats.ifHCOutMulticastPkts;
//interfaceStats.ifHCOutBroadcastPkts;
interfaceStats.ifOutErrors = interfaceRow.OutErrors;
interfaceStats.ifOutDiscards = interfaceRow.OutDiscards;
interfaceStats.ifHCInUcastOctets = interfaceRow.InUcastOctets;
interfaceStats.ifHCInMulticastOctets = interfaceRow.InMulticastOctets;
interfaceStats.ifHCInBroadcastOctets = interfaceRow.InBroadcastOctets;
interfaceStats.ifHCOutUcastOctets = interfaceRow.OutUcastOctets;
interfaceStats.ifHCOutMulticastOctets = interfaceRow.OutMulticastOctets;
interfaceStats.ifHCOutBroadcastOctets = interfaceRow.OutBroadcastOctets;
//interfaceRow.InNUcastPkts;
//interfaceRow.InUnknownProtos;
//interfaceRow.OutNUcastPkts;
//interfaceRow.OutQLen;
mediaState = interfaceRow.MediaConnectState;
interfaceLinkSpeed = interfaceRow.TransmitLinkSpeed;
}
}
else
{
MIB_IFROW interfaceRow;
if (QueryInterfaceRowXP(&Context->AdapterId, &interfaceRow))
{
interfaceStats.ifInDiscards = interfaceRow.dwInDiscards;
interfaceStats.ifInErrors = interfaceRow.dwInErrors;
interfaceStats.ifHCInOctets = interfaceRow.dwInOctets;
interfaceStats.ifHCInUcastPkts = interfaceRow.dwInUcastPkts;
//interfaceStats.ifHCInMulticastPkts;
//interfaceStats.ifHCInBroadcastPkts;
interfaceStats.ifHCOutOctets = interfaceRow.dwOutOctets;
interfaceStats.ifHCOutUcastPkts = interfaceRow.dwOutUcastPkts;
//interfaceStats.ifHCOutMulticastPkts;
//interfaceStats.ifHCOutBroadcastPkts;
interfaceStats.ifOutErrors = interfaceRow.dwOutErrors;
interfaceStats.ifOutDiscards = interfaceRow.dwOutDiscards;
//interfaceStats.ifHCInUcastOctets;
//interfaceStats.ifHCInMulticastOctets;
//interfaceStats.ifHCInBroadcastOctets;
//interfaceStats.ifHCOutUcastOctets;
//interfaceStats.ifHCOutMulticastOctets;
//interfaceStats.ifHCOutBroadcastOctets;
//interfaceRow.InNUcastPkts;
//interfaceRow.InUnknownProtos;
//interfaceRow.OutNUcastPkts;
//interfaceRow.OutQLen;
mediaState = interfaceRow.dwOperStatus == IF_OPER_STATUS_OPERATIONAL ? MediaConnectStateConnected : MediaConnectStateDisconnected;
interfaceLinkSpeed = interfaceRow.dwSpeed;
}
}
}
interfaceRcvSpeed = interfaceStats.ifHCInOctets - Context->LastDetailsInboundValue;
interfaceXmitSpeed = interfaceStats.ifHCOutOctets - Context->LastDetailsIOutboundValue;
//interfaceRcvUnicastSpeed = interfaceStats.ifHCInUcastOctets - Context->LastDetailsInboundUnicastValue;
//interfaceXmitUnicastSpeed = interfaceStats.ifHCOutUcastOctets - Context->LastDetailsIOutboundUnicastValue;
if (!Context->HaveFirstSample)
{
interfaceRcvSpeed = 0;
interfaceXmitSpeed = 0;
Context->HaveFirstSample = TRUE;
}
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_STATE, 1, mediaState == MediaConnectStateConnected ? L"Connected" : L"Disconnected");
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_LINKSPEED, 1, PhaFormatString(L"%s/s", PhaFormatSize(interfaceLinkSpeed / BITS_IN_ONE_BYTE, -1)->Buffer)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_SENT, 1, PhaFormatSize(interfaceStats.ifHCOutOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_RECEIVED, 1, PhaFormatSize(interfaceStats.ifHCInOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_TOTAL, 1, PhaFormatSize(interfaceStats.ifHCInOctets + interfaceStats.ifHCOutOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_SENDING, 1, interfaceXmitSpeed != 0 ? PhaFormatString(L"%s/s", PhaFormatSize(interfaceXmitSpeed, -1)->Buffer)->Buffer : L"");
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_RECEIVING, 1, interfaceRcvSpeed != 0 ? PhaFormatString(L"%s/s", PhaFormatSize(interfaceRcvSpeed, -1)->Buffer)->Buffer : L"");
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UTILIZATION, 1, PhaFormatString(L"%.2f%%", (FLOAT)(interfaceRcvSpeed + interfaceXmitSpeed) / (interfaceLinkSpeed / BITS_IN_ONE_BYTE) * 100)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_SENTPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCOutUcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_RECVPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInUcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_TOTALPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInUcastPkts + interfaceStats.ifHCOutUcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_SENT, 1, PhaFormatSize(interfaceStats.ifHCOutUcastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_RECEIVED, 1, PhaFormatSize(interfaceStats.ifHCInUcastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_TOTAL, 1, PhaFormatSize(interfaceStats.ifHCInUcastOctets + interfaceStats.ifHCOutUcastOctets, -1)->Buffer);
//PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_SENDING, 1, interfaceXmitUnicastSpeed != 0 ? PhaFormatString(L"%s/s", PhaFormatSize(interfaceXmitUnicastSpeed, -1)->Buffer)->Buffer : L"");
//PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_RECEIVING, 1, interfaceRcvUnicastSpeed != 0 ? PhaFormatString(L"%s/s", PhaFormatSize(interfaceRcvUnicastSpeed, -1)->Buffer)->Buffer : L"");
//PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_UNICAST_UTILIZATION, 1, PhaFormatString(L"%.2f%%", utilization2)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_SENTPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCOutBroadcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_RECVPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInBroadcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_TOTALPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInBroadcastPkts + interfaceStats.ifHCOutBroadcastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_SENT, 1, PhaFormatSize(interfaceStats.ifHCOutBroadcastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_RECEIVED, 1, PhaFormatSize(interfaceStats.ifHCInBroadcastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_BROADCAST_TOTAL, 1, PhaFormatSize(interfaceStats.ifHCInBroadcastOctets + interfaceStats.ifHCOutBroadcastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_SENTPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCOutMulticastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_RECVPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInMulticastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_TOTALPKTS, 1, PhaFormatUInt64(interfaceStats.ifHCInMulticastPkts + interfaceStats.ifHCOutMulticastPkts, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_SENT, 1, PhaFormatSize(interfaceStats.ifHCOutMulticastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_RECEIVED, 1, PhaFormatSize(interfaceStats.ifHCInMulticastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_MULTICAST_TOTAL, 1, PhaFormatSize(interfaceStats.ifHCInMulticastOctets + interfaceStats.ifHCOutMulticastOctets, -1)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_SENTPKTS, 1, PhaFormatUInt64(interfaceStats.ifOutErrors, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_RECVPKTS, 1, PhaFormatUInt64(interfaceStats.ifInErrors, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_TOTALPKTS, 1, PhaFormatUInt64(interfaceStats.ifInErrors + interfaceStats.ifOutErrors, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_SENT, 1, PhaFormatUInt64(interfaceStats.ifOutDiscards, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_RECEIVED, 1, PhaFormatUInt64(interfaceStats.ifInDiscards, TRUE)->Buffer);
PhSetListViewSubItem(Context->ListViewHandle, NETADAPTER_DETAILS_INDEX_ERRORS_TOTAL, 1, PhaFormatUInt64(interfaceStats.ifInDiscards + interfaceStats.ifOutDiscards, TRUE)->Buffer);
Context->LastDetailsInboundValue = interfaceStats.ifHCInOctets;
Context->LastDetailsIOutboundValue = interfaceStats.ifHCOutOctets;
//Context->LastDetailsInboundUnicastValue = interfaceStats.ifHCInUcastOctets;
//Context->LastDetailsIOutboundUnicastValue = interfaceStats.ifHCOutUcastOctets;
}
INT_PTR CALLBACK NetAdapterDetailsDlgProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
PDV_NETADAPTER_DETAILS_CONTEXT context;
if (uMsg == WM_INITDIALOG)
{
context = (PDV_NETADAPTER_DETAILS_CONTEXT)lParam;
SetProp(hwndDlg, L"Context", (HANDLE)context);
}
else
{
context = (PDV_NETADAPTER_DETAILS_CONTEXT)GetProp(hwndDlg, L"Context");
if (uMsg == WM_DESTROY)
RemoveProp(hwndDlg, L"Context");
}
if (!context)
return FALSE;
switch (uMsg)
{
case WM_INITDIALOG:
{
context->WindowHandle = hwndDlg;
context->ListViewHandle = GetDlgItem(hwndDlg, IDC_DETAILS_LIST);
if (context->AdapterName)
SetWindowText(hwndDlg, context->AdapterName->Buffer);
else
SetWindowText(hwndDlg, L"Unknown network adapter");
PhCenterWindow(hwndDlg, context->ParentHandle);
PhSetListViewStyle(context->ListViewHandle, FALSE, TRUE);
PhSetControlTheme(context->ListViewHandle, L"explorer");
PhAddListViewColumn(context->ListViewHandle, 0, 0, 0, LVCFMT_LEFT, 315, L"Property");
PhAddListViewColumn(context->ListViewHandle, 1, 1, 1, LVCFMT_LEFT, 100, L"Value");
PhInitializeLayoutManager(&context->LayoutManager, hwndDlg);
PhAddLayoutItem(&context->LayoutManager, context->ListViewHandle, NULL, PH_ANCHOR_ALL);
PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDOK), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_RIGHT);
NetAdapterAddListViewItemGroups(context->ListViewHandle);
PhRegisterCallback(
&PhProcessesUpdatedEvent,
NetAdapterProcessesUpdatedHandler,
context,
&context->ProcessesUpdatedRegistration
);
NetAdapterLookupConfig(context);
NetAdapterUpdateDetails(context);
if (WindowsVersion >= WINDOWS_VISTA && NotifyIpInterfaceChange)
{
NotifyIpInterfaceChange(
AF_UNSPEC,
NetAdapterChangeCallback,
context,
FALSE,
&context->NotifyHandle
);
}
}
break;
case WM_DESTROY:
{
PhUnregisterCallback(
&PhProcessesUpdatedEvent,
&context->ProcessesUpdatedRegistration
);
if (WindowsVersion >= WINDOWS_VISTA && CancelMibChangeNotify2 && context->NotifyHandle)
{
CancelMibChangeNotify2(context->NotifyHandle);
}
PhDeleteLayoutManager(&context->LayoutManager);
PostQuitMessage(0);
}
break;
case WM_COMMAND:
{
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDCANCEL:
case IDOK:
DestroyWindow(hwndDlg);
break;
}
}
break;
case WM_SIZE:
{
PhLayoutManagerLayout(&context->LayoutManager);
}
break;
case WM_SHOWDIALOG:
{
if (IsMinimized(hwndDlg))
ShowWindow(hwndDlg, SW_RESTORE);
else
ShowWindow(hwndDlg, SW_SHOW);
SetForegroundWindow(hwndDlg);
}
break;
case UPDATE_MSG:
{
NetAdapterUpdateDetails(context);
}
break;
}
return FALSE;
}
VOID FreeNetAdapterDetailsContext(
_In_ PDV_NETADAPTER_DETAILS_CONTEXT Context
)
{
DeleteNetAdapterId(&Context->AdapterId);
PhClearReference(&Context->AdapterName);
PhFree(Context);
}
NTSTATUS ShowNetAdapterDetailsDialogThread(
_In_ PVOID Parameter
)
{
PDV_NETADAPTER_DETAILS_CONTEXT context = (PDV_NETADAPTER_DETAILS_CONTEXT)Parameter;
BOOL result;
MSG message;
HWND dialogHandle;
PH_AUTO_POOL autoPool;
PhInitializeAutoPool(&autoPool);
dialogHandle = CreateDialogParam(
PluginInstance->DllBase,
MAKEINTRESOURCE(IDD_NETADAPTER_DETAILS),
NULL,
NetAdapterDetailsDlgProc,
(LPARAM)context
);
PostMessage(dialogHandle, WM_SHOWDIALOG, 0, 0);
while (result = GetMessage(&message, NULL, 0, 0))
{
if (result == -1)
break;
if (!IsDialogMessage(dialogHandle, &message))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
PhDrainAutoPool(&autoPool);
}
PhDeleteAutoPool(&autoPool);
FreeNetAdapterDetailsContext(context);
return STATUS_SUCCESS;
}
VOID ShowNetAdapterDetailsDialog(
_In_ PDV_NETADAPTER_SYSINFO_CONTEXT Context
)
{
HANDLE dialogThread = NULL;
PDV_NETADAPTER_DETAILS_CONTEXT context;
context = PhAllocate(sizeof(DV_NETADAPTER_DETAILS_CONTEXT));
memset(context, 0, sizeof(DV_NETADAPTER_DETAILS_CONTEXT));
context->ParentHandle = Context->WindowHandle;
PhSetReference(&context->AdapterName, Context->AdapterEntry->AdapterName);
CopyNetAdapterId(&context->AdapterId, &Context->AdapterEntry->Id);
if (dialogThread = PhCreateThread(0, ShowNetAdapterDetailsDialogThread, context))
NtClose(dialogThread);
else
FreeNetAdapterDetailsContext(context);
}