KeQueryTickCount正确使用

KeQueryTickCount正确使用,c,windows,kernel,C,Windows,Kernel,在我的驱动程序中,我需要它等待大约30秒。我想用KeQueryTickCount来做这件事。现在我想做的就是从函数中得到一个正确的返回值,而我不能这样做。以下是我尝试过的: // this causes bsod NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath) { PLARGE_INTEGER TickCount1 = NULL; KeQueryTickCount(T

在我的驱动程序中,我需要它等待大约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
我能找到的唯一其他类似问题是:

所以我试了一下:

#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);
}
for(i=0;i<30*1000*20;i++)
{
KeStallExecutionProcessor(50);
}

正确的调用方法如下:-

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
    LARGE_INTEGER TickCount1 = {};
    KeQueryTickCount(&TickCount1);
}
@然而,马丁·詹姆斯是对的——在车手的车里等30秒,在滴答声中旋转是个坏主意


该函数的文档是否要在驱动程序中等待30秒?如果您无法从msdn文档中找到如何调用该函数,那么我建议您在内核模式下工作时可能有点力不从心。我建议先做一些用户模式的Windows编程。@MartinJames:“你想在驱动程序中等待30秒吗?”这一定是我读过的最有趣的一句话了。:-)Stewart,在再次评论之前,您应该了解这些内核函数中的许多都没有可靠的文档。这在我的回答中是有联系的。如果一个内核模式函数没有可靠地记录在MSDN上(顺便说一句,这是非常好的),那么它可能不会被调用。他可能只是想在某个时间点记录滴答数,然后比较30秒是否已经过去。@HarryJohnston-完全正确。这仍然会导致崩溃,在我看到的每个使用此函数的完整程序中,都有一些依赖结构,您似乎没有包括在内。在我的主要问题中,我已经介绍了一种实际可行的方法,不仅仅是从某些地方复制/粘贴,还感谢您的尝试;)对不起,我一点也不明白你在说什么。我确实复制并粘贴了你问题中的代码,然后我修复了它。上面的代码没有问题。如果我没弄错的话,你的问题是“我怎么称呼KeQueryTickCount?”。您添加的是一些关于如何在驱动程序中旋转的无关代码,顺便说一下,这是一个糟糕的想法。