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

﹏ヽ暗。殇╰゛Y 2022-08-04 14:53 558阅读 0赞

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

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

  1. ypedef struct _TIME_FIELDS
  2. {
  3. SHORT Year;
  4. SHORT Month;
  5. SHORT Day;
  6. SHORT Hour;
  7. SHORT Minute;
  8. SHORT Second;
  9. SHORT Milliseconds;
  10. SHORT Weekday;
  11. } TIME_FIELDS, *PTIME_FIELDS;

-—————————————-接着说————————————————-

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

  1. VOID KeQuerySystemTime(
  2. _Out_ PLARGE_INTEGER CurrentTime
  3. );

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

  1. VOID ExSystemTimeToLocalTime(
  2. _In_ PLARGE_INTEGER SystemTime,
  3. _Out_ PLARGE_INTEGER LocalTime
  4. );

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

  1. VOID RtlTimeToTimeFields(
  2. _In_ PLARGE_INTEGER Time,
  3. _Out_ PTIME_FIELDS TimeFields
  4. );

-———————————- 代码区 ————————————————-

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

  1. void myGetTickCount(PULONG msec)
  2. {
  3. LARGE_INTEGER tick_count;
  4. ULONG myInc = KeQueryTimeIncrement();
  5. KeQueryTickCount(&tick_count);
  6. tick_count.QuadPart *= myInc;
  7. tick_count.QuadPart /= 10000;
  8. *msec = tick_count.LowPart;
  9. }
  10. PWCHAR MyCurentTimeStr()
  11. {
  12. LARGE_INTEGER snow, now;
  13. TIME_FIELDS now_fields;
  14. static WCHAR time_str[32] = { 0 };
  15. //---获取标准时间
  16. KeQuerySystemTime(&snow);
  17. //---转换为当地时间
  18. ExSystemTimeToLocalTime(&snow, &now);
  19. //---整理出年,月,日,时,分,秒 这些元素
  20. RtlTimeToFields(&now, &now_fields);
  21. //---输出到字符串中
  22. RtlStringCchPrintfW(
  23. time_str,
  24. 32*2,
  25. L"%4d-%2d-%2d %2d-%2d-%2d",
  26. now_fields.Year,
  27. now_fields.Month,
  28. now_fields.Day,
  29. now_fields.Hour,
  30. now_fields.Minute,
  31. now_fields.Second);
  32. //----
  33. return time_str;
  34. }

静态变量time_str 使得该函数不具备多线程安全性。。。。

发表评论

表情:
评论列表 (有 0 条评论,558人围观)

还没有评论,来说两句吧...

相关阅读