我们通常对时间的理解包括了,年,月,日,时,分,秒 这些元素。当然,我们在做驱动开发,不能使用类似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 使得该函数不具备多线程安全性。。。。