Функция ExAcquireSharedWaitForExclusive (wdm.h)
Подпрограмма ExAcquireSharedWaitForExclusive получает указанный ресурс для общего доступа, если общий доступ можно предоставить, и нет эксклюзивных официантов.
BOOLEAN ExAcquireSharedWaitForExclusive(
[in, out] PERESOURCE Resource,
[in] BOOLEAN Wait
);
[in, out] Resource
Указатель на ресурс, который необходимо получить для общего доступа.
[in] Wait
Указывает поведение подпрограммы всякий раз, когда ресурс не может быть получен немедленно. Если TRUE, вызывающий объект помещается в состояние ожидания до получения ресурса. Если FALSE, подпрограмма немедленно возвращается независимо от того, можно ли получить ресурс.
ExAcquireSharedWaitForExclusive возвращает TRUE, если запрошенный доступ предоставлен или монопольный владелец освобождает ресурс. Эта подпрограмма возвращает FALSE, если входной ожиданииfalse и общий доступ не может быть предоставлен немедленно.
Большинство драйверов должны использовать ExAcquireResourceSharedLite вместо ExAcquireSharedWaitForExclusive.
Вызывающий объект может освободить ресурс, вызвав ExReleaseResourceLite или ExReleaseResourceForThreadLite.
Если общий доступ не удается предоставить немедленно, вызывающий объект может ожидать получения и выпуска монопольного владения ресурсом других потоков.
Независимо от того, предоставляется ли вызывающий объект общий доступ к указанному ресурсу, зависит от следующего:
- Если ресурс в настоящее время не является владельцем, общий доступ предоставляется немедленно текущему потоку.
- Если вызывающий объект уже имеет эксклюзивный доступ к ресурсу, текущий поток предоставляется тот же тип доступа рекурсивно.
- Если ресурс в настоящее время принадлежит как общий, и нет ожидающих попыток получить монопольный доступ, общий доступ предоставляется вызывающему объекту немедленно.
-
Если ресурс в настоящее время принадлежит как общий, но существует ожидающая попытка получить монопольный доступ, вызывающий объект либо помещается в состояние ожидания (ожидании установлено значение TRUE) или ExAcquireSharedWaitForExclusive возвращает FALSE.
Когда текущий поток ожидает получения ресурса до тех пор, пока не будет освобожден ожидающий монопольной собственности, ExAcquireSharedWaitForExclusive возвращает TRUE, когда текущий поток предоставляет общий доступ к ресурсу и возобновляет выполнение.
Если вызывающий объект указывает TRUE для параметра Wait, вызывающий блок блокируется, пока другой поток не освобождает ресурс от имени вызывающего объекта, используя ExReleaseResourceForThread. Записи драйверов должны быть осторожны, чтобы убедиться, что другой поток фактически освобождает ресурс; в противном случае вызывающий объект заблокирован. ExAcquireResourceSharedLite не имеет этого свойства, поэтому драйверы должны использовать эту подпрограмму, если они не требуют конкретного поведения ExAcquireSharedWaitForExclusive.
Перед вызовом этой процедуры необходимо отключить обычную доставку APC ядра. Отключите обычную доставку APC ядра, вызвав KeEnterCriticalRegion. Доставка должна оставаться отключенной до тех пор, пока ресурс не будет освобожден, в какой момент его можно повторно включить, вызвав KeLeaveCriticalRegion. Дополнительные сведения см. в разделе Отключение API.
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 2000. |
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
правил соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), InCriticalRegion(storport), InCriticalRegion(storport), InCriticalRegion(wdm) |
ExAcquireSharedStarveExclusive
ExConvertExclusiveToSharedLite
ExIsResourceAcquiredExclusiveLite