Ожидание и API

Примечание.

Поведение, описанное на этой странице для пользователя APC, применяется к обычным API в режиме пользователя, а также к специальным api-интерфейсам пользовательского режима.

Потоки, ожидающие объекта диспетчера от имени вызывающего объекта в пользовательском режиме, должны быть подготовлены к прерыванию этого ожидания, либо пользователем APC, либо завершением потока. Когда поток вызывает KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject или KeDelayExecutionThread, операционная система может поместить поток в состояние ожидания. Как правило, поток остается в состоянии ожидания, пока операционная система не сможет завершить операцию, которую вызывает вызывающий объект. Однако если вызывающий объект указывает WaitMode = UserMode , операционная система может прервать ожидание. В этом случае подпрограмма завершает работу со значением NTSTATUS STATUS_USER_APC.

Любой драйвер, вызывающий одну из предыдущих четырех подпрограмм с WaitMode = UserMode , должен быть готов к получению возвращаемого значения STATUS_USER_APC. Драйвер должен завершить текущую операцию с STATUS_USER_APC и вернуть управление в пользовательский режим.

Точные ситуации, в которых операционная система прерывает ожидание, зависит от значения параметра оповещения подпрограммы. Если оповещается = true, ожидание является оповещаемым. В противном случае ожидание не оповещается. Операционная система прерывает оповещение только для доставки пользовательского APC. Операционная система прерывает оба типа ожиданий завершения потока.

В следующей таблице описывается связь между различными параметрами параметров, ожиданиями и доставкой APC пользователем.

Параметры Подождите прервано? Доставлен пользователь APC?
Оповещение = TRUE WaitMode UserMode = Да Да
Оповещение = TRUE WaitMode KernelMode = Да Нет
Оповещение = FALSE WaitMode UserMode = Да, для завершения потока. Нет, для пользовательских API. No
Оповещение FALSE WaitMode = KernelMode = No No

Вы можете отключить API ядра для потока. При отключении API ядра для потока также отключены обе службы доставки APC пользователя и завершения потока для этого потока. Дополнительные сведения об отключении API см. в разделе "Отключение API".

Оповещения, редко используемый механизм, внутренний в операционной системе, также может прерывать оповещения о состоянии ожидания. Оповещение может прервать ожидание, если оповещаемое = значение TRUE, независимо от значения параметра WaitMode. Подпрограмма ожидания возвращает значение STATUS_ALERTED.

Обратите внимание, что API ядра выполняются предварительно и не вызывают возврата KeWaitForXxx или KeDelayExecutionThread . Система прерывает и возобновляет внутреннее ожидание. Драйверы обычно не влияют на этот процесс, но драйвер может пропустить сигнал объекта диспетчера для временного состояния, например вызов KePulseEvent.