在我的驱动程序中,我需要它等待大约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);
}
答案 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是函数的文档