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

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

Синтаксис

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

Параметры

[in, out] Resource

Указатель на ресурс, который требуется получить для общего доступа.

[in] Wait

Указывает поведение подпрограммы всякий раз, когда ресурс не может быть получен немедленно. Если значение РАВНО TRUE, вызывающий объект переводится в состояние ожидания, пока ресурс не будет получен. Если значение РАВНО FALSE, подпрограмма немедленно возвращается независимо от того, можно ли получить ресурс.

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

ExAcquireSharedWaitForExclusive возвращает значение TRUE , если запрошенный доступ предоставлен или эксклюзивный владелец освобождает ресурс. Эта подпрограмма возвращает значение FALSE , если входной параметр Wait имеет значение FALSE и общий доступ не может быть предоставлен немедленно.

Комментарии

Большинство драйверов должны использовать ExAcquireResourceSharedLite вместо ExAcquireSharedWaitForExclusive.

Вызывающий объект может освободить ресурс, вызвав ExReleaseResourceLite или ExReleaseResourceForThreadLite.

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

Предоставляется ли вызывающему объекту общий доступ к данному ресурсу, или когда он получает общий доступ, зависит от следующих условий:

  • Если ресурс в настоящее время не является владельцем, общий доступ предоставляется немедленно к текущему потоку.
  • Если вызывающий объект уже имеет монопольный доступ к ресурсу, текущему потоку предоставляется тот же тип доступа рекурсивно.
  • Если ресурс в настоящее время принадлежит как общий и нет ожидающих попыток получить монопольный доступ, общий доступ предоставляется вызывающему объекту немедленно.
  • Если ресурс в настоящее время принадлежит как общий, но есть ожидающая попытка получить монопольный доступ, вызывающий объект либо переводится в состояние ожидания (ожидание имеет значение TRUE), либо ExAcquireSharedWaitForExclusive возвращает значение FALSE.

    Когда текущий поток ожидает получения ресурса до тех пор, пока не будет освобождена ожидающая монопольная собственность, ExAcquireSharedWaitForExclusive возвращает значение TRUE , когда текущему потоку предоставляется общий доступ к ресурсу и возобновляется выполнение.

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

Если вызывающий объект задает значение TRUE для параметра Wait , вызывающий объект блокируется до тех пор, пока другой поток не освободит ресурс от имени вызывающей стороны, используя ExReleaseResourceForThread. Средства записи драйверов должны быть осторожны, чтобы убедиться, что другой поток фактически освобождает ресурс; в противном случае вызывающий объект будет взаимоблокирован. ExAcquireResourceSharedLite не имеет этого свойства, поэтому драйверы должны использовать эту подпрограмму, если для них не требуется конкретное поведение ExAcquireSharedWaitForExclusive.

Обычная доставка APC ядра должна быть отключена перед вызовом этой подпрограммы. Отключите обычную доставку APC ядра, вызвав KeEnterCriticalRegion. Доставка должна оставаться отключенной до тех пор, пока ресурс не будет освобожден. После этого его можно повторно включить, вызвав KeLeaveCriticalRegion. Дополнительные сведения см. в разделе Отключение APC.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

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

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread