static VOID NetAdapterUpdatePanel( _Inout_ PPH_NETADAPTER_SYSINFO_CONTEXT Context ) { ULONG64 inOctets = 0; ULONG64 outOctets = 0; ULONG64 xmitLinkSpeed = 0; NDIS_MEDIA_CONNECT_STATE mediaState = MediaConnectStateUnknown; PPH_STRING linkSpeed = NULL; if (Context->DeviceHandle) { NDIS_STATISTICS_INFO interfaceStats; NDIS_LINK_STATE interfaceState; if (NT_SUCCESS(NetworkAdapterQueryStatistics(Context->DeviceHandle, &interfaceStats))) { inOctets = interfaceStats.ifHCInOctets; outOctets = interfaceStats.ifHCOutOctets; } else { // The above code should return statistics however some drivers bypassed Microsoft driver testing requirements... // NDIS handles these two OIDs for all miniport drivers reguardless. inOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_RCV); outOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_XMIT); } if (NT_SUCCESS(NetworkAdapterQueryLinkState(Context->DeviceHandle, &interfaceState))) { mediaState = interfaceState.MediaConnectState; xmitLinkSpeed = interfaceState.XmitLinkSpeed; } linkSpeed = NetworkAdapterQueryLinkSpeed(Context->DeviceHandle); } else { if (Context->GetIfEntry2_I) { MIB_IF_ROW2 interfaceRow; interfaceRow = QueryInterfaceRowVista(Context); inOctets = interfaceRow.InOctets; outOctets = interfaceRow.OutOctets; mediaState = interfaceRow.MediaConnectState; xmitLinkSpeed = interfaceRow.TransmitLinkSpeed; } else { MIB_IFROW interfaceRow; interfaceRow = QueryInterfaceRowXP(Context); inOctets = interfaceRow.dwInOctets; outOctets = interfaceRow.dwOutOctets; xmitLinkSpeed = interfaceRow.dwSpeed; if (interfaceRow.dwOperStatus == IF_OPER_STATUS_OPERATIONAL) mediaState = MediaConnectStateConnected; else mediaState = MediaConnectStateDisconnected; } } if (linkSpeed) { SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_SPEED, linkSpeed->Buffer); PhDereferenceObject(linkSpeed); } else { SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_SPEED, PhaFormatSize(xmitLinkSpeed / BITS_IN_ONE_BYTE, -1)->Buffer); } if (mediaState == MediaConnectStateConnected) SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_STATE, L"Connected"); else SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_STATE, L"Disconnected"); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BSENT, PhaFormatSize(outOctets, -1)->Buffer); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BRECIEVED, PhaFormatSize(inOctets, -1)->Buffer); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BTOTAL, PhaFormatSize(inOctets + outOctets, -1)->Buffer); }
static VOID NetAdapterUpdatePanel( _Inout_ PPH_NETADAPTER_SYSINFO_CONTEXT Context ) { ULONG64 inOctets = 0; ULONG64 outOctets = 0; ULONG64 linkSpeed = 0; NDIS_MEDIA_CONNECT_STATE mediaState = MediaConnectStateUnknown; if (Context->DeviceHandle) { NDIS_STATISTICS_INFO interfaceStats; NDIS_LINK_STATE interfaceState; if (NT_SUCCESS(NetworkAdapterQueryStatistics(Context->DeviceHandle, &interfaceStats))) { if (!(interfaceStats.SupportedStatistics & NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV)) inOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_RCV); else inOctets = interfaceStats.ifHCInOctets; if (!(interfaceStats.SupportedStatistics & NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT)) outOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_XMIT); else outOctets = interfaceStats.ifHCOutOctets; } else { // Note: The above code fails for some drivers that don't implement statistics (even though statistics are mandatory). // NDIS handles these two OIDs for all miniport drivers and we can use these for those special cases. // https://msdn.microsoft.com/en-us/library/ff569443.aspx inOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_RCV); // https://msdn.microsoft.com/en-us/library/ff569445.aspx outOctets = NetworkAdapterQueryValue(Context->DeviceHandle, OID_GEN_BYTES_XMIT); } if (NT_SUCCESS(NetworkAdapterQueryLinkState(Context->DeviceHandle, &interfaceState))) { mediaState = interfaceState.MediaConnectState; linkSpeed = interfaceState.XmitLinkSpeed; } else { NetworkAdapterQueryLinkSpeed(Context->DeviceHandle, &linkSpeed); } } else if (GetIfEntry2_I) { MIB_IF_ROW2 interfaceRow; interfaceRow = QueryInterfaceRowVista(Context->AdapterEntry); inOctets = interfaceRow.InOctets; outOctets = interfaceRow.OutOctets; mediaState = interfaceRow.MediaConnectState; linkSpeed = interfaceRow.TransmitLinkSpeed; } else { MIB_IFROW interfaceRow; interfaceRow = QueryInterfaceRowXP(Context->AdapterEntry); inOctets = interfaceRow.dwInOctets; outOctets = interfaceRow.dwOutOctets; linkSpeed = interfaceRow.dwSpeed; if (interfaceRow.dwOperStatus == IF_OPER_STATUS_OPERATIONAL) mediaState = MediaConnectStateConnected; else mediaState = MediaConnectStateDisconnected; } if (mediaState == MediaConnectStateConnected) SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_STATE, L"Connected"); else SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_STATE, L"Disconnected"); SetDlgItemText(Context->PanelWindowHandle, IDC_LINK_SPEED, PhaFormatString(L"%s/s", PhaFormatSize(linkSpeed / BITS_IN_ONE_BYTE, -1)->Buffer)->Buffer); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BSENT, PhaFormatSize(outOctets, -1)->Buffer); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BRECIEVED, PhaFormatSize(inOctets, -1)->Buffer); SetDlgItemText(Context->PanelWindowHandle, IDC_STAT_BTOTAL, PhaFormatSize(inOctets + outOctets, -1)->Buffer); }