Macro KeAcquireSpinLock (wdm.h)

La rutina KeAcquireSpinLock adquiere un bloqueo de número para que el autor de la llamada pueda sincronizar el acceso a los datos compartidos de forma segura mediante la generación de IRQL.

Sintaxis

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Parámetros

SpinLock

Puntero a un bloqueo de número de KSPIN_LOCK inicializado para el que el autor de la llamada proporciona el almacenamiento.

OldIrql

Puntero a una variable KIRQL que se establece en el IRQL actual cuando se produce esta llamada.

Valor devuelto

None

Observaciones

KeAcquireSpinLock restablece primero irQL para DISPATCH_LEVEL y, a continuación, adquiere el bloqueo. El IRQL anterior se escribe en OldIrql después de adquirir el bloqueo.

El valor OldIrql debe especificarse cuando se libere el bloqueo de número con KeReleaseSpinLock.

La mayoría de los controladores usan una variable local para almacenar el valor de IRQL antiguo. Un controlador también puede usar una ubicación de memoria compartida, como una variable global, pero el controlador no debe usar la misma ubicación para dos bloqueos diferentes. De lo contrario, se puede producir una condición de carrera.

Los bloqueos de número pueden causar problemas graves si no se usan con criterio. En concreto, no se realiza ninguna protección de interbloqueo y se deshabilita el envío mientras se mantiene el bloqueo de giro. Por lo tanto:

  • El código de una región crítica protegida por un bloqueo de número no debe ser paginable ni hacer referencias a datos paginables.
  • El código dentro de una región crítica protegida por un bloqueo de número no puede llamar a ninguna función externa que pueda tener acceso a datos paginables o generar una excepción, ni puede generar ninguna excepción.
  • El autor de la llamada debe liberar el bloqueo de número con KeReleaseSpinLock lo antes posible.
Se garantiza que el intento de adquirir un bloqueo de número recursiva provoca un interbloqueo. Para obtener más información sobre los bloqueos de número, consulte Bloqueos de número.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library Hal.lib
IRQL <= DISPATCH_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm)

Consulte también

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock