如何使用 Windows Management Instrumentation (WMI) 机制查询微型端口驱动程序信息 (802.11 OID)
使用 WMI 机制查询 802.11 OID
引言
在我之前的文章中,我们已经了解了如何使用 DeviceIOControl
函数查询微型端口驱动程序。DeviceIOControl
函数使用 IOCTL_NDIS_QUERY_GLOBAL_STATS IOCTL
,许多开发人员都在滥用此 IOCTL
。因此,此 IOCTL
将在以后的操作系统版本中弃用。
可以使用 Windows Management Instrumentation (WMI) 接口来查询微型端口驱动程序信息,而不是使用 IOCTL_NDIS_QUERY_GLOBAL_STATS IOCTL
。 使用 Windows Management Instrumentation (WMI) 机制的客户端应用程序可以查询和设置由 NDIS 微型端口驱动程序维护的 OID。
背景
Windows Management Instrumentation (WMI) 是一种内核模式服务,驱动程序可以使用它来使用户模式应用程序可以使用测量和仪器数据。
NDIS 会自动将微型端口驱动程序的每个实例注册到 WMI 作为数据提供程序。 注册后,WMI 客户端可以查询和设置微型端口驱动程序支持的 OID。 NDIS 自动为标准微型端口驱动程序 OID 注册 GUID。 您可以使用 wbemtest.exe 工具检查标准 NDIS WMI 类。 从命令窗口运行 wbemtest.exe 并连接到“root\wmi
”命名空间。 现在,您可以使用“枚举类…”选项枚举所有 NDIS WMI 类。
Using the Code
本文演示了如何查询无线网络的信号强度。 无线网卡驱动程序公开各种 802.11 OID,并且许多这些 OID 都映射到各种 WMI 类中。
在下面给出的示例代码片段中,我正在使用 MSNdis_80211_ReceivedSignalStrength
WMI 类。 这是对应于 802.11 OID OID_802_11_RSSI 的 WMI 类。 此类的实例返回当前连接的无线网络的信号强度。 无论如何,我不打算深入解释 System.Management
命名空间类。 借助 System.Management
命名空间类,我们可以访问上述 WMI 类的实例。
/// <summary>
/// Print signal strength list
/// </summary>
public static void printSignalStrength(string wlanInterfaceName)
{
try
{
//WMI query for accessing signal strength of wireless network
ManagementScope ms = new ManagementScope("\\\\localhost\\root\\wmi");
string wmiquery = string.Format("SELECT Ndis80211ReceivedSignalStrength
FROM MSNdis_80211_ReceivedSignalStrength
where InstanceName=\"{0}\"", wlanInterfaceName);
//way to query object state
ObjectQuery oq = new ObjectQuery(wmiquery);
ManagementObjectSearcher query = new ManagementObjectSearcher(ms, oq);
ManagementObjectCollection moc = query.Get();
ManagementObjectCollection.ManagementObjectEnumerator moe = moc.GetEnumerator();
while (moe.MoveNext()) ;
//accessing received signal strength property
Int32 rssi = (Int32)moe.Current.GetPropertyValue
("Ndis80211ReceivedSignalStrength");
Console.WriteLine("Received Signal Strength : {0}", rssi);
}
catch (ManagementException e)
{
Console.WriteLine("Exception: {0}", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e.Message);
}
}
这里 MSNdis_80211_ReceivedSignalStrength
类提供了一个数据成员 'InstanceName
',它指定用于查询信号强度的卡名称。 在上面的示例中,我已将其硬编码为我的无线网卡名称。 您可以使用设备管理器->网络适配器检查无线适配器名称,并指定您的计算机中显示的卡名称。 由于 MSNdis_80211_ReceivedSignalStrength
需要有效的无线网络连接,请确保您的无线网卡已连接到网络。
System.Management
命名空间提供对有关系统、设备等的管理信息的访问。应用程序可以使用 ManagementObjectSearcher
、ManagementQuery
、ManagementScope
等类查询管理信息。 在上面的代码片段中,您已经看到了我是如何在 C# 应用程序中使用它的。
//WMI query for accessing signal strength of wireless network
ManagementScope ms = new ManagementScope("\\\\localhost\\root\\wmi");
ManagementScope 类指定管理操作的命名空间或范围。 下一条语句指定 WMI 查询。 在这里,我们尝试访问当前连接的无线网络的信号强度。 因此,在我们的例子中,信号强度是管理信息。
string wmiquery = string.Format("SELECT Ndis80211ReceivedSignalStrength FROM
MSNdis_80211_ReceivedSignalStrength where InstanceName=\"{0}\"", wlanInterfaceName);
//way to query object state
ObjectQuery oq = new ObjectQuery(wmiquery);
ManagementObjectSearcher query = new ManagementObjectSearcher(ms, oq);
ManagementObjectSearcher
类根据指定的查询检索系统上的管理对象。 它可以用于枚举系统中的任何管理对象,如网络适配器、进程等。
ManagementObjectCollection moc = query.Get();
ManagementObjectCollection.ManagementObjectEnumerator moe = moc.GetEnumerator();
while (moe.MoveNext()) ;
//accessing received signal strength property
Int32 rssi = (Int32)moe.Current.GetPropertyValue("Ndis80211ReceivedSignalStrength");
上面的代码显示了如何使用 ManagementObjectSearcher
类检索管理对象集合。 此外,我们可以直接从对象集合枚举器访问属性 'Ndis80211ReceivedSignalStrength
' 的值。
参考文献
结论
本文演示了如何使用 Windows Management Instrumentation (WMI) 机制访问信号强度。 在下一篇文章中,我将向您展示另一种使用本机 Wi-Fi API 访问微型端口驱动程序信息的方法。