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


Функция NdisAcquireReadWriteLock (ndis.h)

Функция NdisAcquireReadWriteLock получает блокировку, которую вызывающий объект использует для записи или чтения к ресурсам, общим для потоков драйверов.

Примечание Интерфейс блокировки чтения и записи устарел для драйверов NDIS 6.20 и более поздних версий, которые должны использовать NdisAcquireRWLockRead или NdisAcquireRWLockWrite вместо 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)

См. также

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx

NdisReleaseReadWriteLock