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


Структура и подпрограммы ERESOURCE

В этой статье описывается структура ERESOURCE и системные подпрограммы, которые работают с ним. Структуры ERESOURCE можно использовать для реализации блокировки чтения и записи в драйвере.

Структура ERESOURCE

Структура ERESOURCE используется для управления доступом к общим ресурсам. Он предоставляет механизм синхронизации доступа к ресурсам, которые можно совместно использовать между несколькими потоками.

Структура ERESOURCE непрозрачна; то есть ее члены зарезервированы для системного использования.

Хранилище для ERESOURCE должно быть выделено из непагрегированного пула.

Рутинные операции ERESOURCE

Система предоставляет подпрограммы для получения и выпуска структур ERESOURCE и проверки их текущего состояния.

Получение и освобождение структуры ERESOURCE

Драйверы могут использовать структуры ERESOURCE для реализации эксклюзивной и общей синхронизации. Монопольная и общая синхронизация работает следующим образом:

  • Любое количество потоков может получить ERESOURCE в качестве общего ресурса.

  • Только один поток может эксклюзивно получить ERESOURCE. ERESOURCE можно получить исключительно в том случае, если ни один поток еще не приобрел его как общий.

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

Обычное использование эксклюзивной или общей синхронизации заключается в реализации блокировки чтения и записи. Блокировка чтения и записи позволяет нескольким потокам выполнять операцию чтения, но одновременно может записывать только один поток. Этот сценарий можно реализовать непосредственно в рамках получения ERESOURCE.

Драйвер выделяет хранилище для ERESOURCE и инициализирует его с помощью ExInitializeResourceLite. Система поддерживает список всех используемых структур ERESOURCE. Если драйвер больше не требует определенного ERESOURCE, он должен вызвать ExDeleteResourceLite , чтобы удалить его из списка системы. Драйвер также может повторно использовать ERESOURCE, вызвав ExReinitializeResourceLite.

Драйверы могут выполнять следующие основные операции с ERESOURCE:

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

  • Получите ERESOURCE исключительно с помощью ExAcquireResourceExclusiveLite. Эта подпрограмма получает ресурс, если он не был ранее захвачен эксклюзивно или в режиме совместного доступа.

  • Преобразуйте эксклюзивное приобретение в общее приобретение с помощью ExConvertExclusiveToSharedLite.

  • Выпуск приобретенного ресурса с помощью ExReleaseResourceLite.

Параметр Wait в функциях ExAcquireResourceSharedLite и ExAcquireResourceExclusiveLite определяет, будет ли текущий поток ожидать получения ERESOURCE. Если указать значение FALSE и ERESOURCE не удается получить, подпрограмма возвращает значение FALSE. Если указать значение TRUE, текущий поток помещается в соответствующий список ожидания для ERESOURCE.

Изучение состояния структуры ERESOURCE

Драйвер также может определить текущее состояние ERESOURCE следующим образом:

  • Используйте ExIsResourceAcquiredLite или ExIsResourceAcquiredSharedLite, чтобы определить, был ли ERESOURCE уже захвачен в режиме общего или эксклюзивного доступа. Используйте ExIsResourceAcquiredExclusiveLite , чтобы проверить, был ли ERESOURCE специально приобретен исключительно.

  • Используйте ExGetSharedWaiterCount , чтобы определить количество общих официантов для ERESOURCE и использовать ExGetExclusiveWaiterCount , чтобы определить количество эксклюзивных официантов для ERESOURCE.