KMDF驱动TRACE_DRIVER未定义及tmh文件使用问题求助
KMDF驱动开发中tmh文件问题与TRACE_DRIVER未定义的解决方法
一、TRACE_DRIVER未定义的解决方法
虽然当前能正常编译,但该警告说明跟踪宏未正确关联,后续可能导致跟踪日志无法输出,建议按以下步骤排查修复:
- 检查WPP跟踪配置:打开项目属性,进入「配置属性 -> WPP跟踪」,确认「运行WPP」已设为「是」,且「扫描配置数据」指向正确的配置文件(默认模板生成的配置无需手动修改,确保未被误删)。每个使用WPP宏的源文件,需单独确认该属性是否启用(项目级启用会自动继承)。
- 验证WPP初始化代码:在
DriverEntry函数中必须调用WPP_INIT_TRACING(DriverObject, RegistryPath),在DriverUnload中调用WPP_CLEANUP(DriverObject),这是WPP跟踪宏生效的必要前提。 - 强制重新生成项目:先执行「清理解决方案」,再「重新生成解决方案」,确保WPP预处理器优先生成tmh文件,避免编译顺序导致的依赖滞后问题。
- 检查tmh文件内容:查看生成的
Driver.tmh文件,确认是否包含TRACE_DRIVER的宏定义。如果没有,说明WPP预生成失败,可检查源文件中是否有正确的WPP标记(如//WPP_INIT_TRACING注释),或重置项目的WPP配置。
二、tmh文件的包含规则与差异解释
tmh文件是WPP预处理器自动生成的跟踪宏定义文件,仅用于解析WPP跟踪宏(如TRACE_DRIVER),核心规则如下:
- 源文件包含逻辑
- 若源文件需要使用自定义的函数声明、结构体、全局变量等,必须包含对应的头文件(如
Driver.c需要Driver.h来获取驱动入口的原型定义)。 - 若源文件中使用了WPP跟踪宏,必须包含同名小写的tmh文件(如
Queue.c用了WPP宏,所以包含Queue.tmh)。 - 包含顺序建议:先包含自定义头文件,再包含tmh文件,避免宏定义冲突。
- 若源文件需要使用自定义的函数声明、结构体、全局变量等,必须包含对应的头文件(如
- 不同源文件的差异原因
Queue.c仅包含Queue.tmh:说明该文件未用到Queue.h中的自定义内容(或Queue.h已被其他文件间接包含),仅需WPP跟踪宏支持。Driver.c同时包含Driver.h和Driver.tmh:Driver.h是驱动核心逻辑的声明载体(比如DriverEntry原型),必须包含才能编译;Driver.tmh是跟踪宏的定义载体,因为Driver.c中使用了TRACE_DRIVER等宏,所以需要包含。
- 新建文件的规范流程
- 新建
Xxx.h:存放公共声明(函数、结构体、宏),添加头文件保护(#ifndef XXX_H #define XXX_H ... #endif),不要包含tmh文件。 - 新建
Xxx.c:先包含Xxx.h(如果需要用到其中的内容),再包含Xxx.tmh(如果需要使用WPP跟踪宏)。 - 确保
Xxx.c的WPP跟踪属性已启用,编译时会自动生成Xxx.tmh。
- 新建
内容的提问来源于stack exchange,提问作者IgnoreExeption
相关产品推荐
相关产品推荐

