编译Windows驱动报C2146错误:PDRIVER_OBJECT前缺少')'如何解决
问题根因
你遇到的编译错误是由不兼容的SAL注解版本导致的:你的编译环境是Win7 WDK 7600,自带的是VS2008配套的SAL 1.0注解规范,仅支持大写开头的_In_/_Out_注解,你代码里用的小写_in_是SAL 2.0的语法,编译器无法识别,把_in_判定为未知标识符打乱了参数列表的语法解析逻辑,因此抛出缺少)的错误。
解决方案
任选以下一种即可:
- 把
driver.c中DriverEntry函数参数前的小写_in_替换为大写的_In_,修改后代码如下:
NTSTATUS DriverEntry ( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath )
- 直接删除两个
_in_注解,WDK自带的DRIVER_INITIALIZE函数类型声明已经携带了标准注解,自定义实现时可以省略参数注解 - 如果你需要兼容SAL 2.0语法,可以在
lectouch.h最开头加入以下宏定义做向下兼容:
#if (NTDDI_VERSION < NTDDI_WIN8) #define _In_ __in #define _Out_ __out #define _In_opt_ __in_opt #define _Out_opt_ __out_opt #endif
额外排查点(若修改注解后仍有错误)
检查你的项目Sources文件是否已经正确配置KMDF版本,Win7 WDK 7600编译KMDF驱动必须加入以下配置,避免WDF相关宏未定义导致后续类型解析错误:
KMDF_VERSION_MAJOR = 1 KMDF_VERSION_MINOR = 9
内容的提问来源于stack exchange,提问作者David Partridge
相关产品推荐
相关产品推荐

