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

转载请注明来源:
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
//==================================================================================
//程序说明结束
VOID
GetTime()
{
    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));
}

你可能感兴趣的:(驱动开发,获取系统时间)