Функция NdisDprAcquireReadWriteLock (ndis.h)
Функция NdisDprAcquireReadWriteLock получает блокировку, которую вызывающий объект использует для записи или чтения к ресурсам, общим для потоков драйверов.
Синтаксис
void NdisDprAcquireReadWriteLock(
[in, out] PNDIS_RW_LOCK Lock,
[in] BOOLEAN fWrite,
[out] PLOCK_STATE LockState
);
Параметры
[in, out] Lock
Указатель на непрозрачную переменную, представляющую блокировку. Вызывающий объект может использовать эту блокировку для доступа к общим ресурсам.
[in] fWrite
Логическое значение. Если значение равно TRUE, эта функция предоставляется с доступом на запись к общим ресурсам; Если значение равно FALSE, эта функция предоставляется с доступом на чтение.
[out] LockState
Указатель на непрозрачную переменную, которая отслеживает состояние блокировки. Эта переменная существует в интервале между временем, когда вызывающий объект получает и освобождает блокировку. Вызывающий объект должен использовать другую переменную типа LOCK_STATE для каждой попытки получить блокировку из одного потока драйвера, отличного от ISR.
Возвращаемое значение
Никакой
Замечания
Драйвер должен инициализировать переменную типа NDIS_RW_LOCK с помощью функцию NdisInitializeReadWriteLock перед вызовом любой другой функции NdisXxxReadWriteLock. Драйвер должен предоставить хранилище резидентов для блокировок, которые он использует.
После получения блокировки с помощью NdisDprAcquireReadWriteLockвызывающий объект должен освободить блокировку, вызвав функцию NdisDprReleaseReadWriteLock. Для уменьшения количества ссылок блокировки драйвер должен вызвать
NdisDprReleaseReadWriteLock один раз для каждого вызова NdisDprAcquireReadWriteLock.
Безопасно использовать NdisDprAcquireReadWriteLock и NdisDprAcquireReadWriteLock в одной блокировке. Однако вызовы должны быть сбалансированы таким образом, чтобы при получении блокировки с NdisDprAcquireReadWriteLockон должен быть выпущен с NdisDprReleaseReadWriteLock. Аналогичным образом, если блокировка приобретается с NdisAcquireReadWriteLock, она должна быть выпущена с помощью NdisReleaseReadWriteLock.
При использовании некоторых архитектур NdisDprAcquireReadWriteLock выполняется быстрее, чем NdisAcquireReadWriteLock. Драйверы могут использовать NdisDprAcquireReadWriteLock, а не NdisAcquireReadWriteLock, если уверены, что текущий IRQL уже DISPATCH_LEVEL. Однако это не обязательно. Затраты на вызов функции KeGetCurrentIrql больше, чем преимущество производительности вызова NdisDprAcquireReadWriteLock, а не NdisAcquireReadWriteLock.
Чтобы изменить ресурсы, общие для потоков драйверов, поток драйвера должен получить блокировку записи. Чтобы просто отслеживать эти ресурсы, поток драйвера должен получить блокировку только для чтения. Доступ на чтение не требует переблокировок или конфликтов для блокировок спина. Использование доступа только для чтения помогает поддерживать хорошую производительность операционной системы и драйвера.
Поток драйвера никогда не должен содержать блокировку записи для более чем 25 микросекунд. Хранение блокировки записи в течение длительного периода снижает производительность операционной системы и драйвера.
Драйвер не может использовать блокировку для защиты ресурсов от доступа на чтение или запись, которыми совместно используются другие функции с MiniportInterrupt и/или
функции MiniportDisableInterruptEx. Вместо этого драйвер должен вызывать NdisMSynchronizeWithInterruptEx, чтобы его
MiniportSynchronizeInterrupt функция обращается к таким общим ресурсам в том же DIRQL, по которому он
MiniportInterrupt и/или
функции MiniportDisableInterruptEx.
Дополнительные сведения о получении и выпуске блокировок спина NDIS см. в синхронизации и уведомлений в сетевых драйверах.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Устаревшие драйверы NDIS 6.20 и более поздних версий, которые должны использовать NdisAcquireRWLockRead или NdisAcquireRWLockWrite вместо NdisDprAcquireReadWriteLock. Поддерживается в NDIS 6.0 и 6.1. |
целевая платформа | Всеобщий |
заголовка | ndis.h (include Ndis.h) |
библиотеки | Ndis.lib |
IRQL | = DISPATCH_LEVEL |