您的位置:首页 > 编程语言

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

2015-09-03 17:18 711 查看
我们通常对时间的理解包括了,年,月,日,时,分,秒 这些元素。当然,我们在做驱动开发,不能使用类似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 使得该函数不具备多线程安全性。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: