阅读:1718回复:10
一个关于2000DDK中64bit编译环境的问题或者是large_interger转换的问题,急!!!!各位大侠帮帮忙吧
我做的是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天,精度只要毫秒就可以了,能有什么方法呢?? 做这个程序这么久了,收,发包都搞好了,就是最后卡在这么一个时间变量的问题上,郁闷死了!!偶在北京,五一还不放假,老板催着要活,各位大侠,这篇文章说的有点长,不过偶想应该比较详细了,希望各位大侠给偶指一条路,不胜感激!!!!! |
|
最新喜欢:baoyib... |
沙发#
发布于:2003-05-02 14:56
没人理我么??
版主啊,各位老大们啊,出来帮帮忙啊 |
|
板凳#
发布于:2003-05-02 20:04
我记得DebugPrint里面有处理时间的源码。
就是WDM编程那本书。蓝颜色的。 |
|
地板#
发布于:2003-05-02 21:53
呵呵多谢啊,能不能详细告知那本书的名字啊^_^,蓝色这个冬冬比较模糊啊
|
|
地下室#
发布于: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进行运算就可以了。 |
|
5楼#
发布于:2003-05-02 21:57
就算你要表示的时间大于LowPart所能表示的范围,使用QuadPart进行运算也可以呀。
|
|
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] |
|
7楼#
发布于:2003-05-03 09:41
还有那个LONGLONG,我试了一下: 这段代码在我这里编译正常,没有什么提示!!! 不知道你怎么会碰到这个提示???并且也找不到出现提示的理由!!! |
|
8楼#
发布于:2003-05-03 12:35
呵呵,老兄能把你的ddk给我一份么,难道是我的ddk有问题?
|
|
9楼#
发布于:2003-05-03 12:43
搞定了,多谢,自己写错了一个地方 :P
那么这个LONGLONG类型是怎么运算的呢?他是一个普通的数据类型还是一个结构体? |
|
10楼#
发布于:2003-05-03 13:11
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG; ===== 你就当它是普通的数据类型就可以了,该怎么运算还是怎么运算。 |
|