我正在修改現有的Windows內核設備驅動程序,並在那裏需要捕獲時間戳。我打算使用time.h庫並調用clock()函數來獲取它,但是在windows visual studio中,鏈接失敗。所以我把它作爲一種手段,我需要在司機的圖書館工作。Windows驅動程序時間戳功能
我發現了下面的函數KeInitializeTimer和KeSetTimerEx,但是如果我打算設置一個計時器並喚醒它,這些函數會被使用。我真正需要的是能給我一個時間戳的東西。
任何想法?
我正在修改現有的Windows內核設備驅動程序,並在那裏需要捕獲時間戳。我打算使用time.h庫並調用clock()函數來獲取它,但是在windows visual studio中,鏈接失敗。所以我把它作爲一種手段,我需要在司機的圖書館工作。Windows驅動程序時間戳功能
我發現了下面的函數KeInitializeTimer和KeSetTimerEx,但是如果我打算設置一個計時器並喚醒它,這些函數會被使用。我真正需要的是能給我一個時間戳的東西。
任何想法?
我正在更新我的問題,其他人可以從我的發現中受益。
要獲得時間戳,可以使用KeQueryTickCount()。這個例程會給你自啓動系統以來發生的間隔中斷的計數。但是,如果您需要查找自上次捕獲的時間戳以來已經過去了X個時間段,則還需要查詢系統以確定每個間隔時鐘中斷所花費的時間。
ULONG KeQueryTimeIncrement()給你的數量爲100納秒單位。
例子:
PLARGE_INTEGER timeStamp;
KeQueryTickCount(&timeStamp);
請注意,PLARGE_INTEGER的定義是這樣的:
#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
struct {
ULONG LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
ULONG LowPart;
LONG HighPart;
} u;
#endif //MIDL_PASS
LONGLONG QuadPart;
} LARGE_INTEGER;
因此,可以說,你想看看如果有30秒鐘過去了,因爲您最後一次的時間戳,您可以請執行以下操作:
ULONG tickIncrement, ticks;
LARGE_INTEGER waitTillTimeStamp;
tickIncrement = KeQueryTimeIncrement();
// 1秒是1,000,000,000納秒,但是,因爲KeQueryTimeIncreme NT是 // 100ns的增量除以你的常數爲10,000,000
ticks = ((30 * 10,000,000)/tickIncrement);
KeQueryTickCount(&waitTillTimeStamp);
waitTillTimeStamp.QuadPart += ticks;
<.....Some code and time passage....>
KeQueryTickCount(&currTimeStamp);
if (waitTillTimeStamp.QuadPart < currTimeStamp.QuadPart) {
<...Do whatever...>
}
另一個例子,以幫助您瞭解這一點,如果你想翻譯你坐進一個時間值,例如毫秒的時間戳什麼。
LARGE_INTEGER mSec, currTimeStamp;
ULONG timeIncrement;
timeIncrement = KeQueryTimeIncrement();
KeQueryTickCount(&currTimeStamp);
// 1 millisecond is 1,000,000 nano seconds, but remember divide by 100 to account for
// KeQueryTickCount granularity.
mSec.QuadPart = (currTimeStamp.QuadPart * timeIncrement)/10000;
記住這個例子是爲了演示的目的,mSec不是當前時間,以毫秒爲單位。基於上面使用的API,它僅僅是自系統啓動以來經過的毫秒數。
您也可以使用GetTickCount(),但是這會返回一個DWORD,因此將只能夠爲您提供自系統啓動達到49.7天以來的毫秒數。
我想我找到了自己的問題的答案。我發現這兩個內核API應該滿足我的需求,KeQueryTickCount()和KeQuerySystemTime() –
假設作品(我認爲它應該)請張貼此作爲未來訪問者的答案。 –