Windows内核模式驱动调用inline assembly遭遇linker error的修复方法咨询
嘿,我看你在开发Windows内核模式驱动时,调用内联汇编碰到链接错误了,还特意做了个极简的测试项目来复现问题,挺细心的👍。从你给出的错误截图来看,链接器抛出了两个关键错误:
LNK2019:无法解析的外部符号
__imp_@__C_specific_handler@12,该符号在函数DriverEntry中被引用
LNK1120:1 个未解析的外部命令
针对这个问题,我给你几个可能的修复方向,你可以挨个试试:
调整异常处理相关的编译选项
内核模式驱动的异常处理模型和用户态差异很大,如果你开启了C异常或者某些结构化异常处理的选项,很可能会触发这个链接错误。你可以打开项目属性,找到C/C++ -> 代码生成,把**启用C异常**设置为「否」,同时检查是否有/EHsc这类用户态的异常处理开关,把它改成内核兼容的设置。校验内联汇编代码的合法性
内核环境下的内联汇编不能使用用户态特有的指令、操作或者隐含调用用户态函数。你要仔细检查自己的内联汇编代码,确保所有指令都是内核模式允许的,没有触发到需要用户态异常处理函数的逻辑。确认链接器的依赖库配置
一定要保证项目已经正确链接了内核驱动必备的系统库,比如ntoskrnl.lib、hal.lib这些。如果是用WDK模板创建的项目,默认配置应该是对的,但如果是手动改了设置,可能会漏掉这些依赖,导致符号无法解析。改用独立汇编文件替代内联汇编
要是内联汇编的编译链接兼容性问题一直解决不了,你可以把汇编代码单独写成.asm文件,用MASM工具编译后再和C/C++代码链接。这种方式在驱动开发中往往更稳定,能避开内联汇编带来的各种编译开关冲突。
备注:内容来源于stack exchange,提问作者Jules707

