原创  如何使用 C++ 方式来编写驱动 收藏

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

问题的由来:
        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"的问题,哦..了解了

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

发表于 @ 2007年08月06日 03:09:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:用户态轻松调用ntdll中的native api | 新一篇:卸载其他进程中的模块/dll

  • 发表评论
  • 评论内容:
  •  
Copyright © galihoo
Powered by CSDN Blog