无法使用 Visual Studio 的空 WDM 驱动程序模板中的 NDIS 相关功能

Unable to use NDIS related functions from a Visual Studio's Empty WDM Driver template

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

下显示为灰色

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

要显示所有这些 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,但似乎经常更改,因此认为此答案已经过时)
  • link 对 ndis.lib
  • 添加一个不直接接触 DRIVER_OBJECTDriverEntry;让 NdisMRegisterMiniportDriver 这样做

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

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