Windows内核编程基础篇之获取当前系统时间
我们通常对时间的理解包括了,年,月,日,时,分,秒 这些元素。当然,我们在做驱动开发,不能使用类似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 使得该函数不具备多线程安全性。。。。
还没有评论,来说两句吧...