You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

额外注意事项

  1. 移除多余的DllMain
    内核模式驱动的入口点是DriverEntry,不需要用户态DLL的DllMain,直接删除该函数,否则会引发编译或运行时错误。

  2. 修复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
    
  3. 检查项目配置
    确认Visual Studio项目属性中:

    • Configuration Properties -> Driver Settings设置为内核模式驱动
    • Target Platform Version与你安装的DDK版本匹配
    • 未错误添加用户态相关的编译选项

内容的提问来源于stack exchange,提问作者user9778277

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:24:53