Sleep[Ex] 内部调用NtDelayExecution - 未记录但存在于所有 Windows nt 版本(从 nt 4 到 win 10) - 由 ntdll.dll 导出 - 使用 ntdll.lib 或来自 wdk 的 ntdllp.lib。由于内核中的此调用将被称为记录函数KeDelayExecutionThread
//extern "C"
NTSYSAPI
NTSTATUS
NTAPI
NtDelayExecution(
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Interval );
如果等待是可警告的,则指定 TRUE。较低级别的驱动程序应该
指定 FALSE。
指定绝对时间或相对时间,以 100 纳秒为单位,
等待发生。负值表示相对
时间。绝对过期时间跟踪系统时间的任何变化;
相对过期时间不受系统时间变化的影响。
Sleep[Ex] 是 win32 shell,通过这个原生 api,限制间隔值(从 64 位到 32 位)不能设置绝对时间(NtDelayExecution 可能)并忽略警报(我们可以通过警报线程退出 NtDelayExecution如果等待警报)
所以你可以直接调用这个api而不是通过Sleep[Ex]间接调用
所以Sleep(dwMilliseconds) 是调用Sleep(dwMilliseconds, false)
SleepEx(dwMilliseconds, bAlertable)
打电话
LARGE_INTEGER Interval;
Interval.QuadPart = -(dwMilliseconds * 10000);
NtDelayExecution(bALertable, &Interval);
请注意,如果警报等待,它可以通过 apc(api 返回 STATUS_USER_APC)或警报(将返回 STATUS_ALERTED。我们可以通过 NtAlertThread 警报线程来破坏。 SleepEx 检查返回的状态,如果STATUS_ALERTED - 再次开始等待更新间隔。所以 SleepEx 等待不能通过警报 (NtAlertThread) 打破,但 NtDelayExecution 可以