zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1718回复:10

一个关于2000DDK中64bit编译环境的问题或者是large_interger转换的问题,急!!!!各位大侠帮帮忙吧

楼主#
更多 发布于:2003-04-30 10:23
我做的是passthru改的程序,系统是2000,中间要用到系统时间,并且要对系统时间做加减。
因为NdisGetSystemTime这个函数得到的是一个LARGE_INTERGER类型的变量,为了做运算,我想到了两个方法(以下都是在正常checked build环境下编译的)
1.我想把他转化成long,想利用RtlTimetoTimeFields函数,但是尽管我include<ntddk.h>,编译仍然对这个函数说undefined。
2.我想直接用LARGE_INTERGER做加减运算,仍然需要用到配套的rtl函数,依然没有办法。

于是我想是不是32bit编译环境的问题,就试了一下64bit编译环境,令我高兴的是,编译竟然通过了!! :)
但是在链接的时候提示找不到ia64的library库!我进DDK的安装目录查了一下,发现确实没有ia64的库,我又重新安装DDK,发现在选项的时候Build Environment中64 bit ia64 libraries一项是不可选的!
这好办,我就把32 bit x86 libraries库改了个名字,复制了一份,这一步算是过去了,不过最后还是生成不了.obj文件,也就生成不了.sys文件。保险起见,我又用这种环境编译了一下默认的passthru函数,发现一样的结果,我又在网上找了两个ddk,发现都不包含64bit的库。

我不知道是自己的编译方法有问题还是DDK有问题,为什么64bits的编译不能用呢?

其实我最着急的是要想办法把系统时间做运算,最好能转换成long,这样运算方便。
我倒是发现有一个函数可以把LARGE_INTERGER转换成两个long,一个高位一个地位,但是想象系统时间是以10^-9second作为量级的,一个long也就是10^10,就是说表示低位那个long变量循环一遍也就是10秒的功夫,但是我需要的时间长度至少要1天,精度只要毫秒就可以了,能有什么方法呢??

做这个程序这么久了,收,发包都搞好了,就是最后卡在这么一个时间变量的问题上,郁闷死了!!偶在北京,五一还不放假,老板催着要活,各位大侠,这篇文章说的有点长,不过偶想应该比较详细了,希望各位大侠给偶指一条路,不胜感激!!!!!

最新喜欢:

baoyibao99baoyib...
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-02 14:56
没人理我么??

版主啊,各位老大们啊,出来帮帮忙啊
gx_kyw
驱动牛犊
驱动牛犊
  • 注册日期2003-01-23
  • 最后登录2011-04-13
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-02 20:04
我记得DebugPrint里面有处理时间的源码。

就是WDM编程那本书。蓝颜色的。

zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-02 21:53
呵呵多谢啊,能不能详细告知那本书的名字啊^_^,蓝色这个冬冬比较模糊啊
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-02 21:55
为什么不去看LARGE_INTEGER是如何定义的???

===============

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    };
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

============

一天的毫秒数等于:1*24*60*60*1000 = 86400000 ,远远小于ULONG类型可以表示的最大值,直接使用LowPart进行运算就可以了。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-02 21:57
就算你要表示的时间大于LowPart所能表示的范围,使用QuadPart进行运算也可以呀。
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-02 23:52
LARGE_INTERGER的最小量级不是毫秒吧,100-nanosecond应该是10^-7second吧,也就是说low part的总长也就是数千秒,几十分钟而已,这个肯定是不够的。

还有那个LONGLONG,我试了一下:
LARGE_INTEGER SystemTime;
LONGLONG MyTime;
NdisGetCurrentSystemTime(&SystemTime);
MyTime = SystemTime.QuadPart;

用32bit编译的时候他提示“convention from _int64 to unsigned long, possible loss of data”,应该是把LONGLONG处理成了普通的unsigned long吧。

我又看了一下关于_LARGE_INTERGER的定义,里面说LONGLONG的使用同样要在编译环境支持64bit的情况下,所以用64bit编译这里也是可以没有问题的通过的,但是这又回到我问的问题上面了,我得DDK64bit编译根本不能用,不知道slwqw老兄如何搞定这个问题的?

多谢!

[编辑 -  5/3/03 by  zuozi]
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-03 09:41
还有那个LONGLONG,我试了一下:
LARGE_INTEGER SystemTime;
LONGLONG MyTime;
NdisGetCurrentSystemTime(&SystemTime);
MyTime = SystemTime.QuadPart;

用32bit编译的时候他提示“convention from _int64 to unsigned long, possible loss of data”,应该是把LONGLONG处理成了普通的unsigned long吧。


[编辑 -  5/3/03 by  zuozi]


这段代码在我这里编译正常,没有什么提示!!!

不知道你怎么会碰到这个提示???并且也找不到出现提示的理由!!!
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-03 12:35
呵呵,老兄能把你的ddk给我一份么,难道是我的ddk有问题?
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-03 12:43
搞定了,多谢,自己写错了一个地方 :P

那么这个LONGLONG类型是怎么运算的呢?他是一个普通的数据类型还是一个结构体?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-03 13:11
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

=====

你就当它是普通的数据类型就可以了,该怎么运算还是怎么运算。
游客

返回顶部