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