【问题标题】:How to retrieve the network adapter link speed?如何检索网络适配器链接速度?
【发布时间】:2016-04-28 19:28:54
【问题描述】:

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

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

如何在普通程序中从微型端口驱动程序中查询信息?

【问题讨论】:

    标签: ndis windows-embedded-compact


    【解决方案1】:

    如果您只想获得网络适配器的链接速度,那么与其查询 OID,不如使用GetIfEntry API。返回的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));
    }
    

    【讨论】:

    • 那么用这种方法我必须改变设备并添加一个新的驱动程序 NDISUIO 到它?有没有办法省略这个?
    • 对不起,我不知道 ndisuio 的任何替代品。但是您确定它尚未包含在您的设备中吗?如果您能够修改操作系统映像,您只需在 Platform Builder 中添加 SYSGEN_NDISUIO。
    • 不,不幸的是我没有修改操作系统的可能性。我只有一个简单的应用程序,它应该报告一些信息,包括链接速度。
    • NDISUIO 是标准的 Windows CE 组件,因此设备制造商可能已经将它包含在操作系统映像中。
    • 是的,我是。它肯定不在里面。 NDISUIO 需要设备上的 DLL 和注册表项来加载它。两者都不在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多