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.
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) |