我正在修改现有的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() –
假设作品(我认为它应该)请张贴此作为未来访问者的答案。 –