如何检索网络adpater链接速度?

时间:2016-01-22 08:58:25

标签: ndis windows-embedded-compact

我想确定Windows CE环境中以太网适配器的链接速度。操作系统的实际版本是支持NDIS6的WEC2013。

微型端口驱动程序在MiniportQueryInformation函数中提供OID_GET_LINK_SPEED。但我无法从用户模式程序直接打开驱动程序。

如何在正常程序中查询微型端口驱动程序的信息?

1 个答案:

答案 0 :(得分:0)

如果你想要实现的只是获得网络适配器的链接速度,那么,GetIfEntry API可能是要走的路,而不是查询OID。返回的MIB_IFROW结构表示链接速度,链接状态以及与适配器关联的各种统计信息。

要直接从微型端口获取此信息,请使用标准Windows CE NDISUIO驱动程序。如果此驱动程序在您使用的设备上不可用,并且您无法修改操作系统映像(通过添加SYSGEN_NDISUIO并重建),则使用GetIfEntry,如上所述。

由于您的驱动程序支持OID_GEN_LINK_SPEED,它可能是NDIS5.x实现(WEC2013中的NDIS6堆栈也实现了NDIS5.x接口,允许使用NDIS5.x驱动程序)。另外,真正的NDIS6微型端口支持OID_GEN_LINK_STATE而不是OID_GEN_LINK_SPEED。

以下是演示如何通过直接查询OID_GEN_LINK_SPEED来获取链接速度的示例。请注意,返回的链接速度为100 bps单位。

#include <ndis.h>
#include <nuiouser.h>

// ...

void GetLinkSpeed()
{
    HANDLE hNdisUio = CreateFile(
        NDISUIO_DEVICE_NAME,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );

    NDISUIO_QUERY_OID query = { 0 };
    query.Oid = OID_GEN_LINK_SPEED;
    query.ptcDeviceName = L"NE20001"; // Adapter name

    DeviceIoControl(
        hNdisUio,
        IOCTL_NDISUIO_QUERY_OID_VALUE,
        &query,
        sizeof(query),
        &query,
        sizeof(query),
        NULL,
        NULL
    );

    CloseHandle(hNdisUio);

    DWORD speed = *((DWORD *)query.Data) * 100;
    RETAILMSG(1, (L"Link speed: %u bps\r\n", speed));
}