Windows驱动程序时间戳功能

Amr*_*nes 1 c windows kernel driver device-driver

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

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

有任何想法吗?

Amr*_*nes 5

我正在更新我的问题并回答其他人从我的发现中获益.

要获取时间戳,可以使用KeQueryTickCount().此例程将为您提供自系统引导以来发生的间隔中断计数.但是,如果您需要查找自上次捕获的时间戳以来已经过了X个时间,您还需要查询系统以确定每个间隔时钟中断所需的时间.

ULONG KeQueryTimeIncrement()为您提供100纳秒单位的数量.

例:

PLARGE_INTEGER timeStamp;

KeQueryTickCount(&timeStamp);
Run Code Online (Sandbox Code Playgroud)

请注意,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;
Run Code Online (Sandbox Code Playgroud)

所以,比方说,您想看看自上次采用时间戳后是否已经过了30秒,您可以执行以下操作:

ULONG tickIncrement, ticks;
LARGE_INTEGER waitTillTimeStamp;
tickIncrement = KeQueryTimeIncrement();
Run Code Online (Sandbox Code Playgroud)

// 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...>
}
Run Code Online (Sandbox Code Playgroud)

另一个帮助您理解这一点的示例,如果您想将时间戳转换为时间值(如毫秒),该怎么办?

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;
Run Code Online (Sandbox Code Playgroud)

请记住,此示例仅用于演示目的,mSec不是当前时间(以毫秒为单位).基于上面使用的API,它仅仅是自系统启动以来经过的毫秒数.

您也可以使用GetTickCount(),但这会返回一个DWORD,因此只能为您提供自系统启动以来最多49.7天的毫秒数.