Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подпрограмма KeWaitForSingleObject помещает текущий поток в состояние ожидания, пока заданный объект диспетчера не установлен в сигнальное состояние или (при необходимости) до истечения времени ожидания.
Синтаксис
NTSTATUS
KeWaitForSingleObject (
PVOID Object,
KWAIT_REASON WaitReason,
KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Timeout
);
Параметры
[in] Object
Указатель на инициализированный объект диспетчера (событие, мьютекс, семафор, поток или таймер), для которого вызывающий объект предоставляет хранилище. Объект диспетчера должен находиться в неупакованной системной памяти. Дополнительные сведения см. в подразделе "Примечания".
[in] WaitReason
Указывает причину ожидания. Драйвер должен задать значение Executive, если он не выполняет работу от имени пользователя и работает в контексте потока пользователя, в этом случае он должен задать это значение в UserRequest.
[in] WaitMode
Указывает, ожидает ли вызывающий объект в KernelMode или UserMode. Для наименьшего уровня и промежуточных драйверов следует указать KernelMode. Если данный объект является мьютексом, вызывающий объект должен указать KernelMode.
[in] Alertable
Указывает логическое значение, которое имеет значение TRUE , если ожидание оповещается и false в противном случае.
[in, optional] Timeout
Указатель на значение времени ожидания, указывающее абсолютное или относительное время в 100-наносекундах единиц, в которых ожидается завершение ожидания.
Положительное значение указывает абсолютное время относительно 1 января 1601 года. Отрицательное значение указывает интервал относительно текущего времени. Абсолютное время истечения срока действия отслеживает любые изменения в системном времени; относительные сроки действия не влияют на изменения системного времени.
Если *Timeout = 0, подпрограмма возвращается без ожидания. Если вызывающий объект предоставляет указатель NULL , подпрограмма ожидает неограниченное время, пока объект диспетчера не будет задано сигнальное состояние. Дополнительные сведения см. в следующем разделе "Примечания".
Возвращаемое значение
KeWaitForSingleObject может вернуть одно из следующих элементов.
Макрос NT_SUCCESS распознает все эти значения состояния как "успешно".
| Код возврата | Description |
|---|---|
| STATUS_SUCCESS | Объект диспетчера, указанный параметром Object , удовлетворяет ожиданию. |
| STATUS_ALERTED | Ожидание было прервано для доставки оповещения в вызывающий поток. |
| STATUS_USER_APC | Ожидание было прервано для доставки вызова асинхронной процедуры пользователя (APC) в вызывающий поток. |
| STATUS_TIMEOUT | Время ожидания произошло до того, как объект был задан в сигнальном состоянии. Это значение можно вернуть, если указанный набор условий ожидания не может быть немедленно выполнен, а время ожидания равно нулю. |
Замечания
Текущее состояние указанного объекта проверяется, может ли ожидание быть удовлетворено немедленно. В этом случае необходимые побочные эффекты выполняются на объекте. В противном случае текущий поток помещается в состояние ожидания, а новый поток выбирается для выполнения на текущем процессоре.
Параметр alertable определяет, когда поток может быть оповещен и его состояние ожидания, следовательно, прервано. Дополнительные сведения см. в разделе "Ожидание" и "API".
Особое внимание следует учитывать, когда параметр Object , переданный в KeWaitForSingleObject , является мьютексом. Если объект диспетчера ждал мьютекса, доставка APC совпадает со всеми другими объектами диспетчера во время ожидания. Однако после возвращения KeWaitForSingleObject с STATUS_SUCCESS и потоком фактически содержит мьютекс, доставляются только специальные API режима ядра. Доставка всех остальных API, как в режиме ядра, так и в пользовательском режиме, отключена. Это ограничение на доставку API сохраняется до тех пор, пока мьютекс не будет освобожден.
Объект диспетчера, на который указывает параметр Object , должен находиться в непагрепленной системной памяти.
Если параметр WaitMode является UserMode, стек ядра можно переключить во время ожидания. Следовательно, вызывающий объект никогда не должен пытаться передавать параметры в стеке при вызове KeWaitForSingleObject с помощью аргумента UserMode . Если вы выделяете событие в стеке, необходимо задать для параметра WaitMode значение KernelMode.
Особенно важно проверить возвращаемое значение KeWaitForSingleObject , если параметр WaitMode — UserMode или Alertable имеет значение TRUE, так как KeWaitForSingleObject может вернуться рано с состоянием STATUS_USER_APC или STATUS_ALERTED.
Все долгосрочные ожидания, которые могут быть прерваны пользователем, должны быть ожиданием UserMode и оповещения должны иметь значение FALSE.
По возможности для уменьшения сложности драйвера необходимо задать значениеFALSE и WaitMode. Основное исключение заключается в том, что ожидание является долгосрочным ожиданием.
Если указатель NULL предоставляется для timeout, вызывающий поток остается в состоянии ожидания, пока объект не будет сигнализировать.
Значение времени ожидания равно нулю позволяет проверять набор условий ожидания и для условной производительности любых побочных эффектов, если ожидание может быть немедленно удовлетворено, как при приобретении мьютекса.
Интервалы времени ожидания измеряются относительно системных часов, а точность, с которой операционная система может обнаруживать конец интервала времени ожидания, ограничивается степенью детализации системных часов. Дополнительные сведения см. в разделе "Точность таймера".
Мьютекс может быть рекурсивно приобретен только во время MINLONG. Если это ограничение превышено, подпрограмма вызывает исключение STATUS_MUTANT_LIMIT_EXCEEDED.
Вызывающие объекты KeWaitForSingleObject должны работать в IRQL <= DISPATCH_LEVEL. Однако если значение timeout = NULL или *Timeout != 0, вызывающий объект должен выполняться в IRQL <= APC_LEVEL и в контексте непарбитарного потока. Если время ожидания != NULL и *Timeout = 0, вызывающий объект должен работать в IRQL <= DISPATCH_LEVEL.
KeWaitForMutexObject — это макрос, который преобразуется в KeWaitForSingleObject, который можно использовать вместо этого.
Для повышения производительности используйте быстрые мьютекси или защищенные мьютексы. Дополнительные сведения см. в разделе "Альтернатива объектам Мьютекса".
Дополнительные сведения об объектах мьютекса см. в разделе "Объекты Мьютекса".
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | универсальный |
| Header | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
| Library | NtosKrnl.lib |
| DLL | NtosKrnl.exe |
| IRQL | См. раздел "Примечания". |
| правил соответствия DDI |
CompleteRequestStatusCheck(wdm), HwStorPortProhibitedDDIs(storport), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoBuildDeviceControlWait(wdm), IoBuildDeviceControlWaitTimeout(wdm), IoBuildFsdIrpSignalEventInCompletionTimeout(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), IrpProcessingComplete(wdm),IrqlKeWaitForMutexObject(wdm), LowerDriverReturn(wdm), MarkIrpPending2(wdm), PendedCompletedRequest(wdm), PendedCompletedRequest2(wdm), PendedCompletedRequest3(wdm), PendedCompletedRequestEx(wdm), RemoveLockForwardDeviceControl(wdm), RemoveLockForwardDeviceControlInternal(wdm), RemoveLockForwardRead(wdm), RemoveLockForwardWrite(wdm), SpNoWait(storport), StartDeviceWait(wdm), StartDeviceWait2(wdm), StartDeviceWait3(wdm), StartDeviceWait4(wdm) |