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

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

问题描述:

我想确定Windows CE环境中以太网适配器的链接速度。 OS的实际版本是支持NDIS6的WEC2013。如何检索网络adpater链接速度?

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

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

如果您只想获得网络适配器的链接速度,那么,而不是查询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)); 
} 
+0

所以用这种方法我必须改变设备并添加一个新的驱动程序NDISUIO它?有没有办法省略这个? – harper

+0

对不起,我不知道任何ndisuio的替代品。但是您确定它尚未包含在您的设备中?如果您可以修改操作系统映像,则只需在Platform Builder中添加SYSGEN_NDISUIO即可。 –

+0

不,不幸的是我没有修改操作系统的能力。我只是一个简单的应用程序,应该报告一些信息,包括链接速度。 – harper