Beispiel #1
0
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);
}
Beispiel #2
0
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);
}