C- Windows驱动程序时间戳功能



我正在修改现有的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();
但是//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天,因此只能为您提供Milliseond的数量。

我知道这是一个10年的问题,但是...晚比没有好。我不同意OP的答案。

正确的解决方案:

// The KeQuerySystemTime routine obtains the current system time.
LARGE_INTEGER SystemTime;              
KeQuerySystemTime(&SystemTime);
// The ExSystemTimeToLocalTime routine converts a GMT system time value to the local system time for the current time zone.
LARGE_INTEGER LocalTime;
ExSystemTimeToLocalTime(&SystemTime, &LocalTime);
// The RtlTimeToTimeFields routine converts system time into a TIME_FIELDS structure.
TIME_FIELDS TimeFields;
RtlTimeToTimeFields(&LocalTime, &TimeFields);

相关内容

  • 没有找到相关文章

最新更新