zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:6724回复:24

==在内核中如何获得系统的日期和时间==

楼主#
更多 发布于:2005-01-24 16:14
在内核中如何获得系统当前日期和时间以及是星期几?谢谢先了!

最新喜欢:

aasa2aasa2
pursuer_zhao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-24 17:32
2k和XP下用ZwQuerySystemTime?
98下用VTD_Get_Date_And_Time或IFSMgr_Get_DOSTime?
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-24 19:38
但是ZwQuerySystemTime没有被ntoskrnl.exe导出呀,如何使用?请老大们告知呀.............
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-24 23:10
pursuer_zhao:
  快告诉小弟呀,谢谢了
pursuer_zhao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-25 09:01
ZwQuerySystemInformation也可以吧?你试一下

另外,KeQuerySystemTime和ExSystemTimeToLocalTime
函数应该也可以
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-25 11:11
但是ZwQuerySystemTime没有被ntoskrnl.exe导出呀,如何使用?请老大们告知呀.............

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime( OUT PLARGE_INTEGER SystemTime );

这是一个未公开的内部函数,你自己加个声明即可
在交流中学习。。。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-25 15:40
[quote]但是ZwQuerySystemTime没有被ntoskrnl.exe导出呀,如何使用?请老大们告知呀.............

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime( OUT PLARGE_INTEGER SystemTime );

这是一个未公开的内部函数,你自己加个声明即可
 [/quote]
正确
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-25 15:42
但是我按照您说法,做了下面函数声明:

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime( OUT PLARGE_INTEGER SystemTime );

可是,我在程序中调用这个函数时,编译通过了,但是连接有如下问题:
filehook.obj() : error LNK2001: unresolved external symbol __imp__ZwQuerySystemTime@4
objchki386blocknt.sys() : error LNK1120: 1 unresolved externals
这是什么错误?

同时,我想请教:未文档但是被ntoskrnl导出的函数(如:ZwQuerySystemInformation),声明后在程序中即可使用;但对于那些未文档且未被ntoskrnl导出的函数(例如:ZwQuerySystemTime),仅在程序中声明一下就能使用吗?如果不能,如何才能使用?

谢谢!!!


[编辑 -  1/25/05 by  zxwqd]
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-25 15:48
我再试试pursuer_zhao的方法
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-25 15:53
在内核里直接调是可以的,在应用层则不行,
你得像下面这样处理一下

typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMTIME ) ( OUT PLARGE_INTEGER SystemTime );

static ZWQUERYSYSTEMTIME ZwQuerySystemTime = NULL;

ZwQuerySystemTime = (ZWQUERYSYSTEMTIME)GetProcAddress( ntdll_dll, "ZwQuerySystemTime" );
然后试试看。

[编辑 -  1/25/05 by  fslife]
在交流中学习。。。
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-26 16:47
fslife,你好!
   我在内核中对ZwQuerySystemTime做了如下声明:
NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime( OUT PLARGE_INTEGER SystemTime );

并且在sources文件中添加了如下的宏:
TARGETLIBS=$(SDK_LIB_PATH)\ntdll.lib 后,使用ddk能编译、连接都正确,可是我使用softice的DriverMonitor装载驱动程序时发生如下错误:
ERROR (127): An unexpected error occurred.

在我把调用ZwQuerySystemTime行注释掉后,驱动程序就能正常加载了。这是什么错误,如何解决?
谢谢!!
Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-27 04:53
KeQuerySystemTime
The KeQuerySystemTime routine obtains the current system time.

VOID
  KeQuerySystemTime(
    OUT PLARGE_INTEGER  CurrentTime
    );
Parameters
CurrentTime
Pointer to the current time on return from KeQuerySystemTime.
Return Value
None

Headers
Declared in wdm.h and ntddk.h. Include wdm.h or ntddk.h.

Comments
System time is a count of 100-nanosecond intervals since January 1, 1601. System time is typically updated approximately every ten milliseconds. This value is computed for the GMT time zone. To adjust this value for the local time zone use ExSystemTimeToLocalTime.

Callers of KeQuerySystemTime can be running at any IRQL.

DDK里面不是写得很清楚吗?只不过要自己转换一下。


[编辑 -  1/27/05 by  Odyssey]
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
12楼#
发布于:2005-01-27 10:58
WDM驱动中可以按照以下步骤:

1. 用 KeQuerySystemTime() 获得当前的 GMT System Time. 这是一个从 1601-01-01 以来的计数(单位是 100ns)。

2. 调用 ExSystemTimeToLocalTime() 将 GMT System Time 值转换成当前时区的 Local System Time.

3. 用 RtlTimeToTimeFields() 将 System Time 值转换成 年:月:日:时:分:秒 的形式,保存在一个 TIME_FIELDS 结构中。

typedef struct TIME_FIELDS
{
    CSHORT Year;
    CSHORT Month;
    CSHORT Day;
    CSHORT Hour;
    CSHORT Minute;
    CSHORT Second;
    CSHORT Milliseconds;
    CSHORT Weekday;
} TIME_FIELDS;
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-01-27 12:02
对了,看了你的编译过程,ZwQuerySystemTime由ntdll.dll引出,ntdll.dll在应用层,只能由应用层调用。KeQuerySystemTime()由ntoskrnl.exe导出,而且前面是Ke-Kernel,应该可以在核心调用
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-01-27 13:23
fslife,你好!
   我在内核中对ZwQuerySystemTime做了如下声明:
NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemTime( OUT PLARGE_INTEGER SystemTime );

并且在sources文件中添加了如下的宏:
TARGETLIBS=$(SDK_LIB_PATH)ntdll.lib 后,使用ddk能编译、连接都正确,可是我使用softice的DriverMonitor装载驱动程序时发生如下错误:
ERROR (127): An unexpected error occurred.

在我把调用ZwQuerySystemTime行注释掉后,驱动程序就能正常加载了。这是什么错误,如何解决?
谢谢!!
 

改成:
ZwQuerySystemTime = (ZWQUERYSYSTEMTIME)GetProcAddress( "ntdll.dll", "ZwQuerySystemTime" );
在交流中学习。。。
zxwqd
驱动牛犊
驱动牛犊
  • 注册日期2004-09-20
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-01-27 18:29
非常感谢各位的热心帮助,再次表示感谢!
分实在太少了,以后多拿点儿来孝敬各位老大!
Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-01-28 13:37
WDM驱动中可以按照以下步骤:

1. 用 KeQuerySystemTime() 获得当前的 GMT System Time. 这是一个从 1601-01-01 以来的计数(单位是 100ns)。

2. 调用 ExSystemTimeToLocalTime() 将 GMT System Time 值转换成当前时区的 Local System Time.

3. 用 RtlTimeToTimeFields() 将 System Time 值转换成 年:月:日:时:分:秒 的形式,保存在一个 TIME_FIELDS 结构中。

typedef struct TIME_FIELDS
{
    CSHORT Year;
    CSHORT Month;
    CSHORT Day;
    CSHORT Hour;
    CSHORT Minute;
    CSHORT Second;
    CSHORT Milliseconds;
    CSHORT Weekday;
} TIME_FIELDS;
 


晕啊,原来还有这个函数,找了半天没有找到,最后只好自己写一个函数来转换  :(
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-01-28 15:30
WDM驱动中可以按照以下步骤:

1. 用 KeQuerySystemTime() 获得当前的 GMT System Time. 这是一个从 1601-01-01 以来的计数(单位是 100ns)。

2. 调用 ExSystemTimeToLocalTime() 将 GMT System Time 值转换成当前时区的 Local System Time.

3. 用 RtlTimeToTimeFields() 将 System Time 值转换成 年:月:日:时:分:秒 的形式,保存在一个 TIME_FIELDS 结构中。

typedef struct TIME_FIELDS
{
    CSHORT Year;
    CSHORT Month;
    CSHORT Day;
    CSHORT Hour;
    CSHORT Minute;
    CSHORT Second;
    CSHORT Milliseconds;
    CSHORT Weekday;
} TIME_FIELDS;
 


非常正确。不过,嘿嘿,其实一般不需要打印出系统时间,因为debugview,里面有时间的哦。
I will do the best with what the God gave me.
smyuuu
驱动牛犊
驱动牛犊
  • 注册日期2007-01-13
  • 最后登录2011-07-15
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望63点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-08-21 09:47
dddddddddd
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2007-08-22 15:43
人不靓仔心灵美,版头不正红花仔!
上一页
游客

返回顶部