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


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

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

Синтаксис

void NdisAcquireRWLockWrite(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

Параметры

[in] Lock

Указатель на непрозрачную переменную NDIS_RW_LOCK_EX , представляющую блокировку. Вызывающий объект может использовать эту блокировку для получения доступа на запись или чтение к ресурсам, которые совместно используются потоками, не относящиеся к драйверу ISR.

[out] LockState

Указатель на непрозрачную переменную LOCK_STATE_EX , которая отслеживает состояние блокировки. Эта переменная существует в интервале между временем, когда вызывающий объект получает и снимает блокировку. Вызывающий объект должен использовать другую переменную типа LOCK_STATE_EX для каждой попытки получить блокировку из одного потока драйвера, отличного от ISR.

[in] Flags

Значение ULONG , содержащее флаги блокировки. Задайте для этого параметра значение NDIS_RWL_AT_DISPATCH_LEVEL , если текущий IRQL вызывающего объекта DISPATCH_LEVEL. В противном случае задайте для этого параметра значение 0. Дополнительные сведения об отправке отслеживания IRQL см. в разделе Dispatch IRQL Tracking.

Примечание Если вызывающий объект знает, что текущий код IRQL DISPATCH_LEVEL, задайте для этого параметра значение NDIS_RWL_AT_DISPATCH_LEVEL. Этот флаг делает блокировку еще более эффективной, за счет чего она пропускает проверка для текущего IRQL. Если текущий IRQL неизвестен, не тестируйте текущий IRQL с помощью KeGetCurrentIrql только для определения того, следует ли устанавливать этот флаг, так как более эффективно разрешить функции NdisAcquireRWLockWrite проверять сам IRQL.
 

Возвращаемое значение

None

Remarks

Драйверы NDIS вызывают функцию NdisAcquireRWLockWrite для изменения ресурсов, которые совместно используются потоками драйвера.

Драйвер должен выделить переменную типа NDIS_RW_LOCK_EX с помощью функции NdisAllocateRWLock , прежде чем драйвер вызовет функцию NdisAcquireRWLockWrite . Драйвер должен предоставить дескриптор NdisAllocateRWLock для резидентного хранилища для блокировок, которые он использует.

После того как драйвер вызывает NdisAllocateRWLock, он может вызвать NdisAcquireRWLockWrite или NdisAcquireRWLockRead , чтобы получить доступ на запись или чтение к ресурсу. Доступ на запись к ресурсу может получить только один поток драйвера, отличный от ISR. Если один поток, отличный от ISR, имеет доступ на запись, все доступы на чтение и запись других потоков, не относящихся к ISR, должны дождаться, пока владелец доступа для записи спустит блокировку. Однако если поток, отличный от ISR, имеет доступ на чтение, другие потоки, не относящиеся к ISR, могут одновременно получать доступ на чтение.

Блокировка NDIS_RW_LOCK_EX не поддерживает переход от чтения к записи. После получения обработчиком NDIS_RW_LOCK_EX для доступа на чтение (путем вызова NdisAcquireRWLockRead) тот же процессор не должен пытаться получить доступ на запись (путем вызова NdisAcquireRWLockWrite), пока не будет освобожден предыдущий доступ на чтение.

Блокировка записи NDIS_RW_LOCK_EX может быть получена рекурсивно на том же процессоре. Для каждого вызова NdisAcquireRWLockWrite должен быть соответствующий вызов NdisReleaseRWLock. Блокировка освобождается только после последнего вызова NdisReleaseRWLock.

Поток драйвера никогда не должен удерживать блокировку записи более чем на несколько микросекунд. Удержание блокировки записи в течение длительного периода времени снижает производительность операционной системы и драйвера.

Драйвер не может использовать блокировку для защиты ресурсов от доступа на чтение или запись, которые его другие функции совместно используют с MiniportInterrupt или Функции MiniportDisableInterruptEx или и то, и другое. Вместо этого драйвер должен вызвать NdisMSynchronizeWithInterruptEx , чтобы его Функция MiniportSynchronizeInterrupt обращается к таким общим ресурсам в том же DIRQL, что и его MiniportInterrupt или Функции MiniportDisableInterruptEx или и то, и другое.

NdisAcquireRWLockWRite вызывает IRQL до DISPATCH_LEVEL путем получения спин-блокировки.

Требования

Требование Значение
Минимальная версия клиента Поддерживается в NDIS 6.20 и более поздних версиях.
Целевая платформа Универсальное
Верхняя часть ndis.h (включая Ndis.h)
Библиотека Ndis.lib
IRQL <= DISPATCH_LEVEL

См. также раздел

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock