Compartir a través de


Macro KeAcquireSpinLock (wdm.h)

La rutina KeAcquireSpinLock adquiere un bloqueo de giro 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 KSPIN_LOCK bloqueo de número 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

Ninguno

Observaciones

KeAcquireSpinLock restablece primero irQL a 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 libera el bloqueo de número con KeReleaseSpinLock.

La mayoría de los controladores usan una variable local para almacenar el valor 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 giro pueden causar problemas graves si no se usan con criterio. En concreto, no se realiza ninguna protección de interbloqueo y el envío se deshabilita mientras se mantiene el bloqueo de giro. Por lo tanto:

  • El código dentro 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 acceder 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 más rápido posible.
Se garantiza que al intentar adquirir un bloqueo de número recursiva se produce un interbloqueo. Para obtener más información sobre los bloqueos de número, consulte Bloqueos de número.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de 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(stor 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