787 lines
37 KiB
C
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);
|
|
} |