我正在更新我的问题并提供答案,以便其他人从我的发现中受益。
要获取时间戳,可以使用 KeQueryTickCount()。该例程将为您提供自系统启动以来发生的间隔中断的计数。但是,如果您需要查明自上次捕获的时间戳以来已经过去了 X 时间,您还需要查询系统以确定每个间隔时钟中断所需的时间。
ULONG KeQueryTimeIncrement() 给出 100 纳秒单位的数量。
Example:
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 增量,除以该值,常数就是 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 天的毫秒数。