2011年6月9日 星期四

[ Windows DDP ] 計時器 : 時間相關的其他內核函式

前言 : 
除了前面介紹的計時器, 等待函式外, DDK 中還提供了豐富的時間處理函式, 這裡將對一些常用的時間函式進行介紹. 

時間相關函式 : 
獲取當前系統時間的內核函式是 KeQuerySystemTime. 這個時間是從 1601 年 1 月 1 日起經過的時間, 單位是 100ns. 並且以格林威治時間計時為準. 該函式宣告如下 : 

- Syntax :
  1. VOID KeQuerySystemTime(  
  2.   __out  PLARGE_INTEGER CurrentTime  
  3. );  

第一個參數 CurrentTime 是返回當前的系統時間, 以格林威治計時. 
ExSystemTimeToLocalTime 函式將系統時間轉換為當前時區對應的時間, 當前時區可以在控制台中設置, 其函式宣告如下 : 

- Syntax :
  1. VOID ExSystemTimeToLocalTime(  
  2.   __in   PLARGE_INTEGER SystemTime,  
  3.   __out  PLARGE_INTEGER LocalTime  
  4. );  

第一個參數為輸入系統時間, 以格林威治時間為準. 第二個參數是當前時區的時間. 
ExLocalTimeToSystemTime 函式可以將當前時區的時間轉為系統時間, 即格林威治時間. 其函式宣告如下 : 

- Syntax :
  1. VOID ExLocalTimeToSystemTime(  
  2.   __in   PLARGE_INTEGER LocalTime,  
  3.   __out  PLARGE_INTEGER SystemTime  
  4. );  

第一個參數是當前時區時間, 以控制台中設置的時區為準, 第二個參數是輸出系統時間, 以格林威治時間為準. 
RtlTimeFieldsToTime 函式可以由當前的年月日得到系統時間, 其函式宣告如下 : 

- Syntax :
  1. BOOLEAN RtlTimeFieldsToTime(  
  2.   __in   PTIME_FIELDS TimeFields,  
  3.   __out  PLARGE_INTEGER Time  
  4. );  

第一個參數輸入年月日等資訊, 第二個參數為轉出的系統時間. 其中輸入的 TimeFields 是一個 TIME_FIELDS 的資料結構, 記錄年月日等資訊, 其宣告如下 : 

  1. typedef struct TIME_FIELDS {  
  2.     CSHORT Year;  
  3.     CSHORT Month;  
  4.     CSHORT Day;  
  5.     CSHORT Hour;  
  6.     CSHORT Minute;  
  7.     CSHORT Second;  
  8.     CSHORT Milliseconds;  
  9.     CSHORT Weekday;  
  10. } TIME_FIELDS;  
* 參數 Year : 年, 最小值是 1601 
* 參數 Month : 月, 取值範圍是 1-12 
* 參數 Day : 日期, 取值範圍是 1-31 
* 參數 Hour : 小時, 取值範圍是 0-23 
* 參數 Minute : 分鐘, 取值範圍是 0-59. 
* 參數 Second : s, 取值範圍是 0-59 
* 參數 Milliseconds : ms, 取值範圍從 0-999 
* 參數 Weekday : 禮拜幾, 取值範圍是 0-6, 代表周日到周六. 

RtlTimeToTimeFields 函式將系統時間轉成具體的月日年等資訊, 其宣告如下 : 

- Syntax :
  1. VOID RtlTimeToTimeFields(  
  2.   __in   PLARGE_INTEGER Time,  
  3.   __out  PTIME_FIELDS TimeFields  
  4. );  

第一個參數是輸入的系統時間, 第二個參數是輸出的年月日資訊, 由 TIME_FIELDS 資料結構表示. 

示例程式碼 : 
下面的程式碼演示如何在驅動程式中使用這些時間相關函式, 這個例子首先得到當前的系統時間, 然後將當前系統時間轉換後得到當前時區的時間, 然後再將時區時間得到具體的年月日等資訊 : 

- Driver.cpp : 系統時間函式操作範例
  1. VOID Time_Test()  
  2. {  
  3.     LARGE_INTEGER current_system_time;  
  4.     //得到當前系統時間  
  5.     KeQuerySystemTime(¤t_system_time);  
  6.   
  7.     LARGE_INTEGER current_local_time;  
  8.     //從系統時間轉換成當地時區時間  
  9.     ExSystemTimeToLocalTime(¤t_system_time,¤t_local_time);  
  10.   
  11.     TIME_FIELDS current_time_info;  
  12.     //由當地時區時間得到月日年資訊  
  13.     RtlTimeToTimeFields(¤t_local_time,¤t_time_info);  
  14.   
  15.     //顯示年月日等資訊  
  16.     KdPrint(("Current year:%d\n",current_time_info.Year));  
  17.     KdPrint(("Current month:%d\n",current_time_info.Month));  
  18.     KdPrint(("Current day:%d\n",current_time_info.Day));  
  19.     KdPrint(("Current Hour:%d\n",current_time_info.Hour));  
  20.     KdPrint(("Current Minute:%d\n",current_time_info.Minute));  
  21.     KdPrint(("Current Second:%d\n",current_time_info.Second));  
  22.     KdPrint(("Current Milliseconds:%d\n",current_time_info.Milliseconds));  
  23.     KdPrint(("Current Weekday:%d\n",current_time_info.Weekday));  
  24. }  

底下是執行結果 : 

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...