【问题标题】:How to programmatically access the 'netsh' API via Windows SDK如何通过 Windows SDK 以编程方式访问“netsh”API
【发布时间】:2017-02-20 18:52:12
【问题描述】:

有没有办法访问netsh API(例如 WIN32 API、WDK)?
例如,我正在尝试使用以下命令通过netsh 获取移动宽带信息:

netsh mbn show interfaces  

所以我猜真正的问题是:netsh mbn show interfaces 使用 Windows SDK 方法的实际编程表示是什么?

伪代码中的示例:

MBN_DEVICE mbn;
GetMbnDev(&mbn);
char* Name = mbn.Name;
char* IMEI = mbn.IMEI;
char* DeviceId = mbn.DevId;
float signal = mbn.Signal;

我必须调用哪些 API (Win32/.Net/.Core) 才能在 数据结构 中获得与上述命令相同的结果?

【问题讨论】:

  • 是的,有一种方法可以使用与 netsh 相同的 API。
  • netsh.exe 是一个可执行文件,不提供直接的 c++ API。您可能可以使用管道与 c++ 程序中的可执行文件进行交互。更常用的方法是直接访问 winsocks API(或通过一些抽象,如boost::asio)。
  • @πάνταῥεῖ 在这种情况下,netsh.exe 实际上导出了 C 函数,这些函数由 NAPMONTR.DLL 调用
  • 谢谢,@theB 非常有用的信息。

标签: c++ windows winapi networking netsh


【解决方案1】:

一些 Microsoft 工具使用内部/未记录的 API 来执行其工作,因此克隆它们通常需要进行一些调查。

第一步是下载Dependency Walker,看看netsh导入的函数。在这种情况下,它看起来不像导入很多与网络相关的东西(在我的 Windows 8 机器上),但它确实导入了 CoCreateInstanceGetProcAddress 所以你可以在调试器中设置断点,这应该允许你来确定最终调用的函数/接口。

即使在您到达那一步之前,您也可以简单地通过 Google 搜索“移动宽带 API”,它应该会引导您到 this MSDN page。你应该看看那些接口,看看它们是否提供了你想要的信息......

【讨论】:

  • CoCreateInstance 上设置断点几乎没用。当然,它会返回一个接口指针。到一些接口。然后继续调用 一些 未知方法,这些方法仅由 v-table 中的索引标识。
  • 它必须调用的第一件事是IUnknown::QueryInterface,并且您知道它在 vtable 中的位置(因为否则 COM 将无法工作),因此您至少可以弄清楚它是否使用记录在案的COM 接口(或至少有编组信息的接口)。
  • @IInspectable 肯定不是没用,可以从第一个参数中找到CLSID。如果你很幸运,调试器知道这个 CLSID,如果没有,你可以尝试在注册表或 Internet 中查找它。如果这没有帮助,您可以按照它对返回的界面所做的任何操作。在最初的调查中,您只是想弄清楚它是否使用了记录在案的东西。
  • 假设 CLSID 确实已注册。对于免注册 COM,这通常不是这种情况。
【解决方案2】:

我在这个链接上找到了答案:https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d810752-f647-41f6-9299-27b6adddd536/how-to-get-the-signal-strength-from-a-mobile-broadband-network-adapter-in-windows-7-using-c?forum=csharpgeneral

  • mbnapi_uuid.lib 添加到您的 C++ 项目(链接器->输入->附加 依赖项)。
  • 为 C# 项目添加对 COM 选项卡的引用:'定义:UCM 扩展 MBN 类型库的 API'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2011-12-12
    • 2013-10-22
    • 2013-04-24
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多