如何在VS 2022中编译Windows打印筛选驱动及解决头文件冲突
解决打印筛选驱动头文件重复定义问题
核心结论
内核模式驱动绝对不要包含<Windows.h>,该头文件是为用户态程序设计的,与内核核心头文件<ntddk.h>存在大量重复定义冲突。<ntddk.h>已经包含了内核驱动所需的所有核心定义,完全可以替代<Windows.h>。
正确的头文件包含示例
修改你的Framework.h为以下内容,同时确保所有源文件只包含这个头文件(或通过它间接包含其他必要头):
#ifndef FRAMEWORK_H #define FRAMEWORK_H // 内核驱动无需WIN32_LEAN_AND_MEAN,ntddk.h本身就是精简的内核专属头文件 #include <ntddk.h> #include "Logger.h" // 必须声明所有驱动回调函数,避免编译时出现"未定义"错误 NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath); NTSTATUS PrintFilterCreate(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp); NTSTATUS PrintFilterClose(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp); NTSTATUS CleanupDispatch(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp); NTSTATUS PrintFilterWrite(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp); VOID PrintFilterUnload(_In_ PDRIVER_OBJECT DriverObject); #endif // FRAMEWORK_H
额外注意事项
移除多余的
DllMain
内核模式驱动的入口点是DriverEntry,不需要用户态DLL的DllMain,直接删除该函数,否则会引发编译或运行时错误。修复
Logger.h的C++类问题
内核环境不支持C++的构造/析构、异常等特性,不要用空类做日志工具,改用C风格的宏或函数:// Logger.h #ifndef LOGGER_H #define LOGGER_H #include <ntddk.h> // 封装DbgPrint的日志宏 #define LOG(format, ...) DbgPrint("Print Filter Driver: " format "\n", __VA_ARGS__) #endif // LOGGER_H检查项目配置
确认Visual Studio项目属性中:Configuration Properties -> Driver Settings设置为内核模式驱动Target Platform Version与你安装的DDK版本匹配- 未错误添加用户态相关的编译选项
内容的提问来源于stack exchange,提问作者user9778277
相关产品推荐
相关产品推荐

