Windows内核编程基础篇之获取当前系统时间
2015-09-03 17:18
711 查看
我们通常对时间的理解包括了,年,月,日,时,分,秒 这些元素。当然,我们在做驱动开发,不能使用类似CTime 之类的函数。我们要是用与之对应的TIME_FIELDS,这个结构体中含有对应的时间要素。
给自己科普下,看看这个结构体:
我们使用函数KeQuerySystemTime() 获得系统当前时间。但是得到的并不是当地时间,还是,先看看函数原型:
ExSystemTimeToLocalTimne()转换成当地时间。再 看看这个 ExSystemTimeToLocalTimne()
函数的原型:
转换为TIME_FIELDS。而函数RtlTimeToFields()原型如下:
下面的代码演示了获取到当前时间:年、月、日、时、分、秒。比如:2015-09-03 16-13-14。
给自己科普下,看看这个结构体:
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 使得该函数不具备多线程安全性。。。。
相关文章推荐
- Qt C++中的关键字explicit
- #牛客#代码实现:字符串的匹配、字符串的交错组成、纸牌博弈、表达式组合
- 用了17年的Google Logo大改了
- Qt 中如何捕获窗口停用和激活的消息
- php小代码----curl模拟登录及登录后并通过多线程进行重复post数据提交
- 零基础学C语言 笔记八 二维数组
- C语言中文件包含#include使用尖括号和双引号的区别
- Spring注解@Scope("prototype") Spring在Action上面注解@Scope("prototype")
- 5、ASP.NET MVC入门到精通——NHibernate代码映射
- 用python写一个温度转换程序
- C++入门经典 笔记 (第九章)高级类
- c++中输入和输入语句
- #牛客#代码实现:二叉树的序列与反序、逆栈、链表回文、MaxTree
- c++ primer读书笔记之c++11(三)
- C语言实验题——三个数排序
- 检测出运动目标后提取边界 两个函数 cvFindContours和cvBoundingRect
- Windows内核编程基础篇之获得当前滴答数
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
- morose things go by
- C# 过滤特殊字符