Windows内核编程基础篇之获取当前系统时间

来源:互联网 发布:淘宝怎查被隐形降权 编辑:程序博客网 时间:2024/04/29 20:17

     我们通常对时间的理解包括了,年,月,日,时,分,秒  这些元素。当然,我们在做驱动开发,不能使用类似CTime 之类的函数。我们要是用与之对应的TIME_FIELDS,这个结构体中含有对应的时间要素。

   给自己科普下,看看这个结构体:

ypedef struct _TIME_FIELDS{     SHORT Year;     SHORT Month;     SHORT Day;     SHORT Hour;     SHORT Minute;     SHORT Second;     SHORT Milliseconds;     SHORT Weekday;} TIME_FIELDS, *PTIME_FIELDS;
 ----------------------------接着说---------------------------------

    我们使用函数KeQuerySystemTime() 获得系统当前时间。但是得到的并不是当地时间,还是,先看看函数原型:

VOID KeQuerySystemTime(  _Out_ PLARGE_INTEGER CurrentTime);
    这个函数得到的是一个格林威治时间。我们可以调用函数ExSystemTimeToLocalTimne()转换成当地时间。再 看看这个 ExSystemTimeToLocalTimne()
  函数的原型:

VOID ExSystemTimeToLocalTime(  _In_  PLARGE_INTEGER SystemTime,  _Out_ PLARGE_INTEGER LocalTime);
    上面的这2个函数使用的 “时间”都是长长整型数据结构。通过调用函数RtlTimeToFields()转换为TIME_FIELDS。而函数RtlTimeToFields()原型如下:

VOID RtlTimeToTimeFields(  _In_  PLARGE_INTEGER Time,  _Out_ PTIME_FIELDS   TimeFields);
    ------------------------ 代码区  ---------------------------------

下面的代码演示了获取到当前时间:年、月、日、时、分、秒。比如:2015-09-03 16-13-14。

void myGetTickCount(PULONG msec){LARGE_INTEGER tick_count;ULONG myInc = KeQueryTimeIncrement();KeQueryTickCount(&tick_count);tick_count.QuadPart *= myInc;tick_count.QuadPart /= 10000;*msec = tick_count.LowPart;}PWCHAR MyCurentTimeStr(){LARGE_INTEGER snow, now;TIME_FIELDS now_fields;static WCHAR time_str[32] = { 0 };//---获取标准时间KeQuerySystemTime(&snow);//---转换为当地时间ExSystemTimeToLocalTime(&snow, &now);//---整理出年,月,日,时,分,秒 这些元素RtlTimeToFields(&now, &now_fields);//---输出到字符串中RtlStringCchPrintfW(time_str,32*2,L"%4d-%2d-%2d %2d-%2d-%2d",now_fields.Year,now_fields.Month,now_fields.Day,now_fields.Hour,now_fields.Minute,now_fields.Second);//----return time_str;}
    静态变量time_str 使得该函数不具备多线程安全性。。。。

1 0
原创粉丝点击