Sleep[Ex]
внутренний вызов NtDelayExecution
- не документирован, но существует во всех версиях Windows NT (от NT 4 до Win 10) - экспортируется ntdll.dll - использовать ntdll.lib или ntdllp.lib из wdk.В результате этого вызова в ядре будет вызываться документированная функция KeDelayExecutionThread
//extern "C"
NTSYSAPI
NTSTATUS
NTAPI
NtDelayExecution(
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Interval );
Указывает ИСТИНА , если ожидание оповещено.Драйверы нижнего уровня должны указывать FALSE .
Указывает абсолютное или относительное время в единицах 100наносекунды, для которых должно произойти ожидание.Отрицательное значение указывает относительное время.Абсолютное время истечения отслеживает любые изменения системного времени;относительное время истечения не зависит от изменения системного времени.
Sleep[Ex]
- оболочка win32, поверх этого собственного 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 return STATUS_USER_APC
) или через оповещение (STATUS_ALERTED
будет возвращен. Мы можем предупредить поток через NtAlertThread
).SleepEx
проверяет возвращенное состояние, а в случае STATUS_ALERTED
- снова начинает ожидание с обновленным интервалом.поэтому SleepEx
ожидание не может быть прервано с помощью оповещения (NtAlertThread
), но NtDelayExecution
может