【问题标题】:Unable to use NDIS related functions from a Visual Studio's Empty WDM Driver template无法使用 Visual Studio 的 Empty WDM 驱动程序模板中的 NDIS 相关功能
【发布时间】:2020-11-28 05:00:24
【问题描述】:

我正在考虑尝试编写 NDIS 微型端口驱动程序,并在我的 VS2019 安装中创建了一个新项目,选择“Empty WDM 驱动程序”作为我的起始模板。我可以包含 ndis.h,但许多功能似乎不可用,包括无法使用 NDIS_MINIPORT_DRIVER_CHARACTERISTICSNdisMRegisterMiniportDriver 等重要内容。在实际的 ndis.h 文件中快速搜索这些显示它们在预处理器指令#if NDIS_SUPPORT_NDIS6下显示为灰色@

我克隆了驱动程序示例存储库,并且微型端口驱动程序示例工作正常,没有任何内容并使用相同的 WDK 安装。查看我的项目和示例之间的配置,“驱动程序设置”部分下的选项完全不同。我对这一切还是很陌生,所以我假设这是我的一些错误配置。在我的项目配置中我还有什么需要编辑的吗?到目前为止,我在确保链接器与 NDIS 库链接方面感到疯狂的唯一变化。对于这种类型的驱动程序,也许 WDM 驱动程序模板不是我想要的,但在这种情况下,我不确定如何正确设置我的项目。 VS 只有一个 NDIS 模板,用于过滤驱动。

【问题讨论】:

  • 查看ndis.h的顶部,看看需要设置哪些预处理器定义。

标签: c wdk ndis wdm


【解决方案1】:

要显示所有这些 API,您需要设置您的目标 NDIS 版本。例如,如果您的目标是 Windows 7 及更高版本,那将是 NDIS 6.20,因此您可以在包含 ndis.h 之前将其放在某处:

#define NDIS620_MINIPORT 1

这就是您必须定义的全部内容; ndis.h 将自动代表您填写其他版本控制宏。

要查看所有 NDIS 版本的列表,请查看 ndis.h 的顶部。

一般来说,您可以敲击“WDM 模板”甚至是完全空的 .C 文件,直到它成为 NDIS 驱动程序。如果您是从头开始,您应该确保:

  • 定义一个 NDIS 版本宏,如上面的/DNDIS620_MINIPORT=1
  • 使用/kernel 标志编译
  • 使用推荐的一组安全标志进行编译(目前包括 /GS /guard:cf /Qspectre,但似乎经常更改,因此认为此答案已经过时)
  • 链接到 ndis.lib
  • 添加一个不直接接触DRIVER_OBJECTDriverEntry;让NdisMRegisterMiniportDriver 这样做吧

如果您使用的是通用 WDM 模板,请注意您必须替换任何 DriverUnload(NDIS 有自己的风格)并删除任何 AddDevice(NDIS 代表您处理)。您可能希望删除任何提及 IRP 的内容。虽然 NDIS 允许您使用通过 NdisRegisterDeviceEx 创建的控制设备对象 (CDO) 来处理 IRP_MJ_DEVICE_CONTROL,但这并不是绝对必要的,而且许多现实世界的微型端口根本不使用 IRP。

一旦您填写了NdisMRegisterMiniportDriver 要求的所有回调,您将拥有一个 NDIS 微型端口驱动程序的骨架。这是一个有价值的教育练习,我建议从头开始构建一个驱动程序,这样你就会看到所有部分是如何组合在一起的。但是,如果您赶时间,您不必自己执行此操作。我们有一个示例微型端口here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2017-08-09
    • 2020-09-24
    • 2012-05-30
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多