64位精度睡眠功能?

AnA*_*ons 0 c winapi sleep timer

目前Sleep需要一个 DWORD(32 位)作为时间。有没有需要 DWORDLONG(64 位)的替代方案?

我正在使用 RNG,其中每增加一个字节,整体等待时间就会增加。使用 32 位整数,总时间为 5 分钟,我想增加它。

RbM*_*bMm 5

Sleep[Ex]内部调用NtDelayExecution- 未记录但存在于所有 Windows nt 版本(从 nt 4 到 win 10) - 由ntdll.dll导出- 使用wdk 的ntdll.libntdllp.lib。由于内核中的此调用将被称为文档化函数KeDelayExecutionThread

//extern "C"
NTSYSAPI 
NTSTATUS
NTAPI
NtDelayExecution(
  IN BOOLEAN              Alertable,
  IN PLARGE_INTEGER       Interval );
Run Code Online (Sandbox Code Playgroud)
  • 可警觉的

如果等待是可警告的,则指定TRUE。低级驱动程序应指定FALSE

  • 间隔

指定等待发生的绝对或相对时间(以 100 纳秒为单位)。负值表示相对时间。绝对过期时间跟踪系统时间的任何变化;相对过期时间不受系统时间更改的影响。

Sleep[Ex]是win32 shell,在这个原生api上,它限制间隔值(从64位到32位)不能设置绝对时间(可以用NtDelayExecution)并忽略警报(如果等待警报,我们可以通过警报线程退出NtDelayExecution)

所以你可以直接调用这个api而不是通过间接调用 Sleep[Ex]

所以Sleep(dwMilliseconds)是通话Sleep(dwMilliseconds, false)

SleepEx(dwMilliseconds, bAlertable) 
Run Code Online (Sandbox Code Playgroud)

称呼

LARGE_INTEGER  Interval;
Interval.QuadPart = -(dwMilliseconds * 10000);
NtDelayExecution(bALertable, &Interval);
Run Code Online (Sandbox Code Playgroud)

请注意,如果警报等待可以通过 apc (api return STATUS_USER_APC) 或通过 alert (STATUS_ALERTED将被返回。我们可以通过警报线程NtAlertThread)被破坏。在SleepEx检查返回状态,并在情况下STATUS_ALERTED-重新开始等待与更新的时间间隔。所以SleepEx等待不能通过警报(NtAlertThread)打破,但NtDelayExecution可以