Ожидание и 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.