Sleep[Ex]内部调用NtDelayExecution- 未记录但存在于所有 Windows nt 版本(从 nt 4 到 win 10) - 由ntdll.dll导出- 使用wdk 的ntdll.lib或ntdllp.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可以