这个问题可能会很无聊,而且觉得连这个题目都不好拟,但我还是以我的方式记下来了,觉得有用的朋友就尽管拿去用,不过我觉得可能性很小
问题的由来:
c源文件是以"c"为后缀的 ,而纯c语言都是在函数的开始就将所有用的变量全部定义好,然后在函数中使用,如果不按照这个规定,那么等待你的就是在编译的时候将你处以极刑,这个让我觉得非常郁闷,我就是想在使用的时候再定义一个变量,这样可以让我的程序更加让自己读懂,因此就产生了这个话题 "如何使用 C++ 方式来编写驱动"
问题的解决:
既然"c"后缀的不行,那么我改为"cpp"吧,这样就不是C++了吗(...呵呵..大家为我的聪明鼓掌吧),编译一下试试,你爷爷的,怎么这么多的unresolved external symbol哦,每个函数都跟我抗议了,(做出这么大的动作,有必要吗?)
当时想了很久,后来终于知道是C++重载机制捣蛋了,那好,我加extern "C"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
我把头文件前面加上extern "C",编译,果然成功了,原来就这么简单的说,不错不错,我现在终于可以在任何地方定义变量了...舒坦啊!!
紧急问题的出现:
编译通过了.上战场试试,晕啊,蓝屏,我以前好好的代码,这么拿过来就蓝屏了呢?到softice里面单步调,发现很奇怪的现象,在我调用PsLookupProcessByProcessId的时候就导致蓝屏了,这个就很奇怪了,这个函数是ntoskrnl导出的,声明不是就可以用了吗?这里会存在什么问题呢?想了很久想不通
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
拿出内核调试器看看PsLookupProcessByProcessId的地址,我靠,终于被我逮到,我程序里面的PsLookupProcessByProcessId的地址和内核调试器的地址完全不同,程序里面的PsLookupProcessByProcessId地址竟然在该程序模块里面
原来又是C++的重载机制搞的鬼啊,我声明的PsLookupProcessByProcessId由于C++和C编译的区别,导致无法在ntoskrnl中找到原型,因此它自立门户了,加个extern "C"试试,果然成功
说来说去还是extern "C"的问题,哦..了解了
谢谢阁下花时间看了这莫名其妙的文章..真的莫名堂啊