Windows驱动开发之获取系统时间

来源:互联网 发布:鼠标灵敏度测试软件 编辑:程序博客网 时间:2024/06/05 08:37

转载请注明来源:
enjoy5512的博客 : http://blog.csdn.net/enjoy5512
GitHub : https://github.com/whu-enjoy


1. 获取系统开机时间

  获得当前“滴答数”:
  获得系统日前和时间往往是为了写日志,获得启动毫秒数则很适合用来做一个随机数的种子。有时也使用时间相关的函数来寻找程序的性能瓶颈。
  在Win32开发中,我们使用GetTickCount()函数来返回系统自启动之后经历的毫秒数。在驱动开发中,对应的函数是 KeQueryTickCount():

VOID KeQueryTickCount(         OUT PLARGE_INTEGER TickCount         );

  需要注意的是,返回到TickCount中的并不是一个简单的毫秒数,而是一个“滴答”数,这个数在不同硬件环境中是不一样的,所以,我们需要结合使用另一个函数:

  ULONG KeQueryTimeIncrement(void);

2. 获取系统时间

获得当前系统时间:
使用KeQuerySystemTime()函数得到的当前时间是格林威治时间,接着使用ExSystemTimeToLocalTime()函数转换成当地时间:

VOID KeQuerySystemTime(         OUT PLARGE_INTEGER CurrentTime         );
VOID ExSystemTimeToLocalTime(         IN PLARGE_INTEGER SystemTime,         OUT PLARGE_INTEGER LocalTime         );

由于这两个函数使用的时间是长长整型,不便于阅读,因此,需通过函数RtlTimeToTimeFields转换成TIME_FIELDS:

VOID RtlTimeToTimeFields(         IN PLARGE_INTEGER Time,         IN PTIME_FIELDS TimeFields         );

3. 示例代码

//程序说明开始//==================================================================================//  功能 :  获取系统时间//  参数 :    //  (入口)  //  (出口)  无//  返回 :  VOID//  主要思路 : //  调用举例 : //  日期 : 20167622:58:19 - 20167623:42:41//==================================================================================//程序说明结束VOIDGetTime(){    LARGE_INTEGER TickCount = {0};    LARGE_INTEGER GelinTime = {0};    LARGE_INTEGER LocalTime = {0};    TIME_FIELDS NowFields;    ULONG Inc = 0;    ULONG Day = 0;    ULONG Hour = 0;    ULONG Minute = 0;    ULONG Second = 0;    Inc = KeQueryTimeIncrement();    KeQueryTickCount(&TickCount);    TickCount.QuadPart *= Inc;    TickCount.QuadPart /= 10000;    Day = TickCount.QuadPart / (1000*60*60*24);    Hour = TickCount.QuadPart % (1000*60*60*24) / (1000*60*60);    Minute = TickCount.QuadPart % (1000*60*60*24) % (1000*60*60) / (1000*60);    Second = TickCount.QuadPart % (1000*60*60*24) % (1000*60*60) % (1000*60) / 1000;    KdPrint(("系统启动了%2d%2d小时%2d分钟%2d秒\n", Day, Hour, Minute, Second));    KeQuerySystemTime(&GelinTime);    ExSystemTimeToLocalTime(&GelinTime, &LocalTime);    RtlTimeToTimeFields(&LocalTime, &NowFields);    KdPrint(("系统当前时间 : %4d%2d%2d%2d:%2d:%2d\n",        NowFields.Year,         NowFields.Month,        NowFields.Day,        NowFields.Hour,        NowFields.Minute,        NowFields.Second));}
0 0
原创粉丝点击