Поделиться через


Функция KeWaitForSingleObject (wdm.h)

Подпрограмма 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 г. Отрицательное значение указывает интервал относительно текущего времени. Абсолютное время истечения срока действия отслеживает любые изменения системного времени; Изменения системного времени не влияют на относительный срок действия.

Если время ожидания = 0, подпрограмма возвращается без ожидания. Если вызывающий объект предоставляет указатель NULL , подпрограмма ожидает неограниченное время, пока объект диспетчера не перейдет в состояние сигнала. Дополнительные сведения см. в разделе "Примечания".

Возвращаемое значение

KeWaitForSingleObject может возвращать одно из следующих элементов.

Макрос NT_SUCCESS распознает все эти значения состояния как "успешно".

Код возврата Описание
STATUS_SUCCESS Объект диспетчера, заданный параметром Object , выполнил ожидание.
STATUS_ALERTED Ожидание было прервано, чтобы доставить оповещение в вызывающий поток.
STATUS_USER_APC Ожидание прервано для доставки пользовательского асинхронного вызова процедур (APC) в вызывающий поток.
STATUS_TIMEOUT Время ожидания истекло до того, как объект был установлен в состояние сигнала. Это значение может быть возвращено, если указанный набор условий ожидания не может быть немедленно выполнен, а время ожидания равно нулю.

Комментарии

Текущее состояние указанного объекта проверяется, чтобы определить, можно ли выполнить ожидание немедленно. Если это так, на объекте выполняются необходимые побочные эффекты. В противном случае текущий поток переводится в состояние ожидания и выбирается новый поток для выполнения на текущем процессоре.

Параметр Alertable определяет, когда поток может быть оповещен, и его состояние ожидания, следовательно, прервано. Дополнительные сведения см. в разделе Ожидание и APC.

Особое внимание следует учитывать, если параметр Object , передаваемый в KeWaitForSingleObject , является мьютексом. Если объект диспетчера, ожидающий, является мьютексом, доставка APC будет такой же, как и для всех остальных объектов диспетчера во время ожидания. Однако после возврата KeWaitForSingleObject с STATUS_SUCCESS, а поток фактически содержит мьютекс, доставляются только специальные APC в режиме ядра. Доставка всех остальных APC, как в режиме ядра, так и в пользовательском режиме, отключена. Это ограничение на доставку APC сохраняется до тех пор, пока мьютекс не будет освобожден.

Объект диспетчера, на который указывает параметр Object, должен находиться в непагрегированной системной памяти.

Если параметр WaitMode имеет значение UserMode, стек ядра можно переключить во время ожидания. Следовательно, вызывающий объект не должен пытаться передать параметры в стеке при вызове KeWaitForSingleObject с помощью аргумента UserMode . При выделении события в стеке необходимо задать для параметра WaitModeзначение KernelMode.

Особенно важно проверка возвращаемое значение KeWaitForSingleObject, если параметр WaitMode имеет значение UserMode или Alertable имеет значение TRUE, так как KeWaitForSingleObject может вернуться рано с состоянием STATUS_USER_APC или STATUS_ALERTED.

Все долгосрочные ожидания, которые могут быть прерваны пользователем, должны иметь значение UserMode waits, а параметр Alertable должен иметь значение FALSE.

По возможности параметру Alertable должно быть присвоено значение FALSE , а параметру WaitMode — значение KernelMode, чтобы снизить сложность драйвера. Основным исключением из этого является то, что ожидание является долгосрочным.

Если для параметра Timeout указан указатель NULL, вызывающий поток остается в состоянии ожидания, пока объект не будет передан сигнал.

Нулевое значение времени ожидания позволяет проверить набор условий ожидания и условную производительность любых побочных эффектов, если ожидание может быть немедленно выполнено, как при приобретении мьютекса.

Интервалы времени ожидания измеряются относительно системных часов, а точность, с которой операционная система может определить окончание интервала времени ожидания, ограничена степенью детализации системных часов. Дополнительные сведения см. в разделе Точность таймера.

Мьютекс можно рекурсивно получить только раз MINLONG. Если это ограничение превышено, подпрограмма вызывает исключение STATUS_MUTANT_LIMIT_EXCEEDED.

Вызывающие объекты KeWaitForSingleObject должны выполняться в среде IRQL <= DISPATCH_LEVEL. Однако если время ожидания = равно NULL или время ожидания != 0, вызывающий объект должен выполняться в irQL <= APC_LEVEL и в контексте неарбитарного потока. Если timeout != NULL и Timeout = 0, вызывающий объект должен выполняться в IRQL <= DISPATCH_LEVEL.

KeWaitForMutexObject — это макрос , который преобразуется в KeWaitForSingleObject, который можно использовать вместо него.

Для повышения производительности используйте быстрые мьютексы или защищенные мьютексы. Дополнительные сведения см. в статье Альтернатива объектам мьютекса.

Дополнительные сведения об объектах мьютексов см. в разделе Объекты мьютекса.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".
Правила соответствия DDI CompleteRequestStatusCheck(wdm), HwStorPortProhibitedDIs(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)

См. также раздел

ExInitializeFastMutex

KeBugCheckEx

KeInitializeEvent

KeInitializeMutex

KeInitializeSemaphore

KeInitializeTimer

KeWaitForMultipleObjects