如何使用 C++ 方式来编写驱动

本文探讨了使用C++风格编写Windows驱动程序时遇到的问题及解决方案,重点介绍了如何正确处理C++与C混合编程中的链接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题可能会很无聊,而且觉得连这个题目都不好拟,但我还是以我的方式记下来了,觉得有用的朋友就尽管拿去用,不过我觉得可能性很小

问题的由来:
        c源文件是以"c"为后缀的 ,而纯c语言都是在函数的开始就将所有用的变量全部定义好,然后在函数中使用,如果不按照这个规定,那么等待你的就是在编译的时候将你处以极刑,这个让我觉得非常郁闷,我就是想在使用的时候再定义一个变量,这样可以让我的程序更加让自己读懂,因此就产生了这个话题 "如何使用 C++ 方式来编写驱动"

问题的解决:
        既然"c"后缀的不行,那么我改为"cpp"吧,这样就不是C++了吗(...呵呵..大家为我的聪明鼓掌吧),编译一下试试,你爷爷的,怎么这么多的unresolved external symbol哦,每个函数都跟我抗议了,(做出这么大的动作,有必要吗?)
        当时想了很久,后来终于知道是C++重载机制捣蛋了,那好,我加extern "C"

#ifdef __cplusplus 
extern "C" 

#endif 

#include 
"ntddk.h"

#ifdef __cplusplus 
}
 
#endif

我把头文件前面加上extern "C",编译,果然成功了,原来就这么简单的说,不错不错,我现在终于可以在任何地方定义变量了...舒坦啊!!

紧急问题的出现:
        编译通过了.上战场试试,晕啊,蓝屏,我以前好好的代码,这么拿过来就蓝屏了呢?到softice里面单步调,发现很奇怪的现象,在我调用PsLookupProcessByProcessId的时候就导致蓝屏了,这个就很奇怪了,这个函数是ntoskrnl导出的,声明不是就可以用了吗?这里会存在什么问题呢?想了很久想不通

NTSTATUS PsLookupProcessByProcessId(
     IN ULONG ulProcId, 
     OUT PEPROCESS 
* pEProcess
     );

        拿出内核调试器看看PsLookupProcessByProcessId的地址,我靠,终于被我逮到,我程序里面的PsLookupProcessByProcessId的地址和内核调试器的地址完全不同,程序里面的PsLookupProcessByProcessId地址竟然在该程序模块里面
       原来又是C++的重载机制搞的鬼啊,我声明的PsLookupProcessByProcessId由于C++和C编译的区别,导致无法在ntoskrnl中找到原型,因此它自立门户了,加个extern "C"试试,果然成功

说来说去还是extern "C"的问题,哦..了解了

谢谢阁下花时间看了这莫名其妙的文章..真的莫名堂啊

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值