johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1896回复:17

2000到xp的问题,高手请入,开发环境问题。

楼主#
更多 发布于:2004-03-26 17:05
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教!
cpprt.h和cpprt.cpp是为支持运行库的。但是,xp ddk支持运行库,支持C++编程。我的程序中有一个自己写的class。我曾在source中指定msvcrt.lib库,这样不会出现找不到函数的错误,但是,有一个警告提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。

帮我解决次问题者,本人送20分。

最新喜欢:

flyingflying
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-03-26 17:49
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教!
cpprt.h和cpprt.cpp是为支持运行库的。但是,xp ddk支持运行库,支持C++编程。我的程序中有一个自己写的class。我曾在source中指定msvcrt.lib库,这样不会出现找不到函数的错误,但是,有一个警告提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。

帮我解决次问题者,本人送20分。

 


驱动不能连接msvcrt.lib(C++运行库), 因为驱动运行在Ring0,而C++运行库运行在Ring3.
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-26 20:25
注意,这个程序已经在WIN 2000 DDK下编译链接运行通过。所以,您所说的不完全对,但也可能对,就是说,它是否可以用C运行库呢?请您仔细看一下我的描述。cpprt这两个文件你看过没?Numega的东西。先谢了!
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-26 20:45
为了表示诚意,先送5分,请高人详细指明原由和解决办法。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-26 21:15
楼上那位,您到将QQ号码给我留下呀。我的是15962986
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-27 02:18
“.CRT section exists;there may be unhandled static initializor and teminator”这句话已经说得很清楚了,如果你定义了静态的类实例,程序在加载的时候需要自动调用你的那个类的构造子,cpprt.h和cpprt.cpp好象刚好就是干这事的,你去掉当然不行了。

另外,你不可以使用msvcrt.lib,它会链到msvcrt.dll去,你认为可以在Kernel Mode里加载dll吗?

C++编程跟操作系统无关,不能说XP就怎么怎么样,我写9x/2k/xp的驱动都用C++,但我从来不去定义静态的类实例,这不好掌握,建议你还是使用new吧(重载new操作符你总会吧?)

class X
{
public:
  static X* CreateInstance()
  {
    return new X;
  }
};
X *x = NULL;

DriverEntry(...)
{
  x = X::CreateInstance();
  ... ...
}

明白我的意思?呵呵。:)
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-27 12:17
您所说的肯定是对的。我问个问题。如何用C++写驱动程序?
如果我们要写WIN98操作系统下的驱动程序,想用C++语言,一般都是安装VToolsD等工具编写代码。反正都是用Numega的东西来编写。如果我们直接用98DDK,不用Numega,能用C++写驱动程序吗?写出来的代码能编译过吗?
如果,我们写WIN 2000下驱动程序的代码,我们能用C++语言写吗?或者说2000DDK支持C++语言吗?(不安装Numega的东西)
如果,我们写WIN XP的驱动程序,我们可以直接用C++语言吗?我的意思是XP DDK是直接支持C++语法的吗?(不安装Numega的东西)

对于WIN 2000下的驱动,我用的是2000DDK,在我的驱动程序里加上Numega的两个文件(cpprt.h和cpprt.cpp),我就可以直接用C++语法来编写代码,并且代码运行正常。现在,我想将这个驱动程序移植到XP下,我用XP DDK按照在2000DDK下同样的方式重新编译它,但是,编译无法通过。请指教!

[编辑 -  3/27/04 by  johnchang]
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-27 12:54
我想给楼上兄弟点分,可是,却不能给了。为什么?
那个给分的按钮怎么不见了呢?难道不能重复给分吗?
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-27 16:34
>> 如果我们要写WIN98操作系统下的驱动程序,想用C++语言,一般
>> 都是安装VToolsD等工具编写代码。反正都是用Numega的东西来
>> 编写。如果我们直接用98DDK,不用Numega,能用C++写驱动程序
>> 吗?写出来的代码能编译过吗?
没问题,我说了,我写VxD或WDM或KMD的时候都用C++,但我从来没
有用过Numega的东西。

>> 如果,我们写WIN 2000下驱动程序的代码,我们能用C++语言写
>> 吗?或者说2000DDK支持C++语言吗?(不安装Numega的东西)
>> 如果,我们写WIN XP的驱动程序,我们可以直接用C++语言吗?
>> 我的意思是XP DDK是直接支持C++语法的吗?(不安装Numega的
>> 东西)
C++跟你说的这些东西都没什么关系,如果你写VxD,大约应该要使用
Visual C++ 5.0或6.0编译,既然它是个C++编译器,那当然必须支持
C++语法。DDK本身的大多数头和库都为C定义的,C++是C的超集,
99.87%在C里能用的东西在C++中一样能用,反正我还没遇到过DDK在
C++里编译不过的情况。
你说的Numega本身只是把DDK里的东东封装后行成一套类库而已,你
可以这样想:Numega的东东到你手里的时候是一堆C++的Source,最
终你要把它变成Lib以致于到可执行的代码的时候,你不是一样得用
DDK环境吗?如果DDK环境里不能用C++,Numega一样不能用。

>> 对于WIN 2000下的驱动,我用的是2000DDK,在我的驱动程序里加
>> 上Numega的两个文件(cpprt.h和cpprt.cpp),我就可以直接用
>> C++语法来编写代码,并且代码运行正常。现在,我想将这个驱动
>> 程序移植到XP下,我用XP DDK按照在2000DDK下同样的方式重新编
>> 译它,但是,编译无法通过。请指教!
呵呵,一定要记住,你可以使用C++语法写驱动并不是Numega的功劳
而是你的编译器的功劳。
你说的移植问题我需要更多的信息才能判断,比如:
1、在XP Build Env里,你把cpprt.h和cpprt.cpp去掉了吗?
2、编译出错的信息是什么?
3、如果加上cpprt.h和cpprt.cpp编译也不能过?出错信息又是什么?
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
wuyanfeng
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2011-05-06
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望127点
  • 贡献值0点
  • 好评度103点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-27 19:43
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教!
cpprt.h和cpprt.cpp是为支持运行库的。但是,xp ddk支持运行库,支持C++编程。我的程序中有一个自己写的class。我曾在source中指定msvcrt.lib库,这样不会出现找不到函数的错误,但是,有一个警告提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。

帮我解决次问题者,本人送20分。

 


编驱动用 C++ 很简单。你只要  

#ifdef __cplusplus
extern "C"{
#endif
#include <NTDDK.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);
#ifdef __cplusplus
}
#endif
就可以。不用 DS
你可以看看 vc 2003.net 中的 crt 源代吗。自己实现一个就可以了 crt 启动代码。就可以搞定 全局类的初始化问题。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-29 09:45
去掉cpprt.h和cpprt.cpp编译通过,但链接有问题,说找不到_atexit这个符号,就是说链接不到这个函数。为什么?(我想原因是析构函数需要用它。)
加上那两个文件,提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-03-29 10:56
在我的代码里确实有静态全局变量。这个可能是问题所在,我将它改了试试。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-03-29 11:05
wuyanfeng ,您能不能将启动CRT说的具体一点呢?比如找哪个文件?哪段代码?等等。非常感谢。
所有有价值回复,我都将送分。我会另外开一个送分的主题。我将送分给wuyanfeng和cool-net。二位请留意新贴!其他人的回复,我也将酌情送分。
johnchang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-03-29 12:56
我现在可以用C++编写代码了,编译过程中没有使用CPPRT等文件(即,cpprt.h和cpprt.cpp等两个Numega的文件)。编译链接都没有大问题。但是,我还不明白如何才可以用全局变量?这涉及CRT的问题。
如果在栈里创建类实例(即,局部变量),没有任何问题。
但如果在全局命名空间创建(即,全局变量),编译通过,在链接时提示无法链接atexit函数。
如果在堆里创建类实例(即,用new操作),编译通过,在链接时无法链接。
在VC的帮助里讲,需要#include <stdlib.h>和libc.lib的支持。DDK中没有关于这个函数的说明。但是,DDK提供<stdlib.h>和libc.lib。
根据以上情况,推断是CRT,即C运行库没有用上,如何使用它呢?请高手指导!
请高手指导,有分奉送!
如果使用cpprt.h和cpprt.cpp两个文件,new操作可以正常,可是,全局还是不行。请高手指点。

[编辑 -  3/29/04 by  johnchang]
hp_song
驱动牛犊
驱动牛犊
  • 注册日期2003-10-15
  • 最后登录2007-09-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-03-30 15:31
楼主问题搞定了吗?CRT或全局变量,到底是怎样一个关系?

我现在用XPDDK也遇到了同样问题,我的源程序是供应商提供的,里面定义了CRT.CPP,我想会不会是这里的CRT与VC(或DDK)的CRT冲突?如果去掉原来的CRT?
本人第一次接触驱动,不知道问题是不是很菜,还请楼主和其他高手帮忙。
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
15楼#
发布于:2004-03-30 18:03
我现在可以用C++编写代码了,编译过程中没有使用CPPRT等文件(即,cpprt.h和cpprt.cpp等两个Numega的文件)。编译链接都没有大问题。但是,我还不明白如何才可以用全局变量?这涉及CRT的问题。
如果在栈里创建类实例(即,局部变量),没有任何问题。
但如果在全局命名空间创建(即,全局变量),编译通过,在链接时提示无法链接atexit函数。
如果在堆里创建类实例(即,用new操作),编译通过,在链接时无法链接。
在VC的帮助里讲,需要#include <stdlib.h>和libc.lib的支持。DDK中没有关于这个函数的说明。但是,DDK提供<stdlib.h>和libc.lib。
根据以上情况,推断是CRT,即C运行库没有用上,如何使用它呢?请高手指导!
请高手指导,有分奉送!
如果使用cpprt.h和cpprt.cpp两个文件,new操作可以正常,可是,全局还是不行。请高手指点。

[编辑 -  3/29/04 by  johnchang]


new delete atexit都需要自己实现。
全局变量需要atexit(),可以参照见DriverStudio的stcinit.cpp文件
new delete可以见cpprt.h
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
force_eagle
驱动小牛
驱动小牛
  • 注册日期2002-05-06
  • 最后登录2009-02-26
  • 粉丝0
  • 关注0
  • 积分387分
  • 威望61点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-03-31 18:55

学习!!!!!!!!!!!!!!!!!!! :D
gantleman
驱动小牛
驱动小牛
  • 注册日期2003-10-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望127点
  • 贡献值1点
  • 好评度18点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-03 11:59
我在DDK的MAKFILE.def里看到过c++特性的一些变量的定义,在W2KDDK的包里没有CL。EXE他用的就是C++6。0的CL。EXE
用VC编译和DDK也没有太多不同,都是在LINK上加一个/DRVIER的选项就可以编译。我认为核心的编程和普通编程没有太多的区别。用VC++也应该可行。 :)
游客

返回顶部