无法使用 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_CHARACTERISTICS
和 NdisMRegisterMiniportDriver
等重要功能。在实际 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_OBJECT
的 DriverEntry
;让 NdisMRegisterMiniportDriver
这样做
如果您使用的是通用 WDM 模板,请注意您必须替换任何 DriverUnload
(NDIS 有它自己的风格)并删除任何 AddDevice
(NDIS 处理代表你)。您可能希望删除任何提及 IRP 的内容。虽然 NDIS 允许您使用通过 NdisRegisterDeviceEx
创建的控制设备对象 (CDO) 来处理 IRP_MJ_DEVICE_CONTROL
,但这并不是绝对必要的,而且许多 real-world 微型端口根本不使用 IRP。
填写完 NdisMRegisterMiniportDriver
要求的所有回调后,您将拥有 NDIS 微型端口驱动程序的骨架。这是一个有价值的教育练习,我确实建议从头开始构建一个驱动程序,这样你就会看到所有的部分是如何组合在一起的。但如果您赶时间,则不必自己执行此操作。我们有一个示例微型端口 here.
我正在尝试编写一个 NDIS 微型端口驱动程序,并在我的 VS2019 安装中创建了一个新项目,选择“空 WDM 驱动程序”作为我的起始模板。我可以包含 ndis.h,但许多功能似乎不可用,包括无法使用 NDIS_MINIPORT_DRIVER_CHARACTERISTICS
和 NdisMRegisterMiniportDriver
等重要功能。在实际 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_OBJECT
的DriverEntry
;让NdisMRegisterMiniportDriver
这样做
如果您使用的是通用 WDM 模板,请注意您必须替换任何 DriverUnload
(NDIS 有它自己的风格)并删除任何 AddDevice
(NDIS 处理代表你)。您可能希望删除任何提及 IRP 的内容。虽然 NDIS 允许您使用通过 NdisRegisterDeviceEx
创建的控制设备对象 (CDO) 来处理 IRP_MJ_DEVICE_CONTROL
,但这并不是绝对必要的,而且许多 real-world 微型端口根本不使用 IRP。
填写完 NdisMRegisterMiniportDriver
要求的所有回调后,您将拥有 NDIS 微型端口驱动程序的骨架。这是一个有价值的教育练习,我确实建议从头开始构建一个驱动程序,这样你就会看到所有的部分是如何组合在一起的。但如果您赶时间,则不必自己执行此操作。我们有一个示例微型端口 here.