Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Поведение, описанное на этой странице для пользователя APC, применяется к обычным API в режиме пользователя, а также к специальным api-интерфейсам пользовательского режима.
Потоки, ожидающие объекта диспетчера от имени вызывающего объекта в пользовательском режиме, должны быть подготовлены к прерыванию этого ожидания, либо пользователем APC, либо завершением потока. Когда поток вызывает KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject или KeDelayExecutionThread, операционная система может поместить поток в состояние ожидания. Как правило, поток остается в состоянии ожидания, пока операционная система не сможет завершить операцию, которую вызывает вызывающий объект. Однако если вызывающий объект указывает WaitMode = UserMode , операционная система может прервать ожидание. В этом случае подпрограмма завершает работу со значением NTSTATUS STATUS_USER_APC.
Любой драйвер, вызывающий одну из предыдущих четырех подпрограмм с WaitMode = UserMode , должен быть готов к получению возвращаемого значения STATUS_USER_APC. Драйвер должен завершить текущую операцию с STATUS_USER_APC и вернуть управление в пользовательский режим.
Точные ситуации, в которых операционная система прерывает ожидание, зависит от значения параметра оповещения подпрограммы. Если Alertable = TRUE, ожидание является оповещаемым. В противном случае ожидание является необрабатываемым. Операционная система прерывает оповещение только для доставки пользовательского APC. Операционная система прерывает оба типа ожиданий, чтобы завершить поток.
В следующей таблице объясняется связь между различными параметрами, ожиданиями и доставкой APC пользователю.
Параметры | Ожидание прервано? | Пользователь APC доставил? |
---|---|---|
Оповещение = TRUEWaitMode UserMode = | Да | Да |
Оповещение = TRUEWaitMode KernelMode = | Да | нет |
Alertable = FALSEWaitMode = UserMode | Да, для завершения потока. Нет, для пользовательских APCs. | нет |
Alertable = FALSEWaitMode = KernelMode | нет | нет |
Вы можете отключить аппаратные вызовы ядра для потока. При отключении APC ядра для потока, также отключается доставка пользовательских APC и завершение потока. Дополнительные сведения об отключении API см. в разделе "Отключение API".
Оповещения, редко используемый механизм, встроенный в операционную систему, также могут прерывать прерываемые состояния ожидания. Оповещение может прервать ожидание, если в режиме оповещения = значение равно TRUE, независимо от значения параметра WaitMode. Подпрограмма ожидания возвращает значение STATUS_ALERTED.
Обратите внимание, что APC ядра работают с прерыванием и не вызывают возврата KeWaitForXxx или KeDelayExecutionThread. Система внутренне прерывает и возобновляет ожидание. Драйверы обычно не затрагиваются этим процессом, но возможно, что драйвер может пропустить сигнал объекта диспетчера в случае переходного состояния, например, при вызове KePulseEvent.