Windows驱动程序时间戳function

我正在修改现有的Windows内核设备驱动程序,并在那里我需要捕获一个时间戳。 我打算使用time.h库并调用clock()函数来获取,但是在windows visual studio下,链接失败。 所以我把它作为一种手段,我需要在司机的图书馆工作。

我发现了下面的函数,KeInitializeTimer和KeSetTimerEx,但是如果我打算设置一个计时器并将其唤醒,则会使用这些函数。 我真正需要的是能给我一个时间戳的东西。

有任何想法吗?

Solutions Collecting From Web of "Windows驱动程序时间戳function"

我正在更新我的问题,其他人从我的发现中受益。

要得到一个时间戳,你可以使用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(); 

// 1sec是1,000,000,000纳秒,但是,由于KeQueryTimeIncrement的增量为100ns,所以除以10000000

 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天。