KeQueryTickCount正确用法

时间:2013-12-07 22:34:23

标签: c windows kernel

在我的驱动程序中,我需要它等待大约30秒。我想使用KeQueryTickCount来做到这一点。现在我想要做的就是从函数中获取一个我不能做的正确返回值。这是我尝试过的:

// this causes bsod
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
    PLARGE_INTEGER TickCount1 = NULL;
    KeQueryTickCount(TickCount1);
}

然后......

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
    PLARGE_INTEGER TickCount1 = NULL;
    KeQueryTickCount(&TickCount1);
}
// this generates compiler error:
//Left of '->HighPart' must point to struct/union

我能找到的唯一其他类似问题是:Windows Driver Timestamp function

所以我尝试了这个:

#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;
// This generates this error
//'_LARGE_INTEGER' : 'union' type redefinition

我的编译器是MS DDK 7600.16385.1 x86免费构建环境win 7

任何人都可以向我展示这个函数的完整工作代码示例,或者调用此API应该是什么样的完整代码?谢谢你的帮助。

编辑 - 以下是对此的正确答案:

for (i = 0; i < 30*1000*20; i++)
{
    KeStallExecutionProcessor(50);
}

1 个答案:

答案 0 :(得分:1)

调用它的正确方法如下: -

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
    LARGE_INTEGER TickCount1 = {};
    KeQueryTickCount(&TickCount1);
}
然而,@Martin James非常正确 - 通过旋转嘀嗒计数在驱动程序中等待30秒是一个坏主意。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff553071(v=vs.85).aspx是函数的文档