首页
论坛
课程
招聘
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

[系统底层] [原创]时间间隔问题

2008-10-19 00:53 4295

[系统底层] [原创]时间间隔问题

2008-10-19 00:53
4295
我现在想在驱动中实现,每间隔10分钟调用一个函数,用KeQuerySystemTime获得,Large_interge格式的时间,不能直接相减,用它的QuadPart可以直接向减,但是他的单位是100ns,10分钟就是10000000×600,判断if(time.QuadPart-time2.QuadPart>10000000×600)
会报 constant interge overflow,用time_field方式也没法直接求时间差?哪位兄弟有好方法吗?谢谢

[公告]看雪论坛2020激励机制上线了!多多参与讨论可以获得积分快速升级?

最新回复 (8)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
athlor 活跃值 2008-10-19 09:12
2
0
呃.. 期待答案,我也想知道.
雪    币: 2058
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 活跃值 6 2008-10-19 14:26
3
0
试试10000000L × 600

我没做过内核开发,不太清楚LargeInteger是多少位的,所以不知道对不对。

你试过了要告诉我啊。

当然,我现在要查一查相关的资料。如果有新发现,也会发上来的。
雪    币: 2058
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 活跃值 6 2008-10-19 14:42
4
0
我查了一下MSDN,union LARGE_INTEGER 是64位整形,在VC60中可以这样写。

    LARGE_INTEGER        l;

    // initialize, do something

    if ( l.QuadPart < 10000000I64 * 600 )
    {
        // do something .
    }

这样就不会有错误了。注意是大写字母I加上数字64.

不过我没做过驱动开发,手头也没有WDK,不知道内核中LARGE_INTEGER是不是64位,也不知道WDK用的编译器如何表示64位整型的常量。你试一下,试过了记得告诉我啊。
雪    币: 223
活跃值: 活跃值 (10)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
XPoy 活跃值 3 2008-10-19 17:07
5
0
l.QuadPart/10000000 <600

PS:我是来追看雪第一美女的
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
adwardwang 活跃值 2008-10-20 08:15
6
0
多谢,多谢,加上I64可以,但是这种方法的原理是什么?能讲讲吗?
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
adwardwang 活跃值 2008-10-20 08:51
7
0
l.QuadPart/10000000 <600也行,都怪自己计算机原理的数的基本知识没学好啊
雪    币: 2058
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 活跃值 6 2008-10-20 13:22
8
0
加上I64,表明 10000000这个常量是64位整型,这样编译器就会按64位值对待它。

如果字面值常量不回来后缀,将使用默认后缀,整数常量默认为int,小数常量默认为double,等等,这是语言本身规定的。但后缀在不同的编译器可能不同,比如VC6和GCC

如果你不加后缀I64,编译器将按一个int型(32位,在32位平台来说)来求常量表达式的值,而10000000 * 600 这个值超过了32位整数的表示范围,发生了溢出。

在用户态下,这被当作一条警告,而在核心态下,可能要求更严格,当作错误。

另外,l.QuadPart/10000000 <600 这种写法也正确,其实就是非常简单的数学上的等价变换,把右边的10000000除到左边。这样就不会超出整数的表示范围了。
不过这会给编译结果多引入一个除法运算,因为左边的除法运算符的操作数之一是变量,而不是常量。

如果用I64这种做法,乘法运算符是在两个常量之间,因此乘法运算是在编译时刻求值,只相当于一个常量,所以编译的结果中只有比较,没有乘(除)法。

我不是叫真,因为这点效率不算什么,两种都正确。
我只是想说要弄清楚原因。

另外,说点题外的,这是C/C++的一个初级问题,楼主最好到C++社区去寻找答案。
虽然这里的人对这样的问题完全有能力解答,但看雪是以逆向技术为主的技术论坛,这是技术特色。
到C++社区多看看,对编程技术的提高有很大的帮助。
推荐USENET的comp.lang.c++新闻组,以及microsoft.public.vc和microsoft.public.windows,绝对会有帮助。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
athlor 活跃值 2008-10-20 13:38
9
0
终于看到有人开始重视我了..
好感动..
游客
登录 | 注册 方可回帖
返回