Sincronización y DPC con subprocesos
Para sincronizar el acceso a una ubicación de memoria a la que se accede desde dentro y fuera de una rutina CustomThreadedDpc , un controlador puede usar bloqueos de giro normales o bloqueos de giro en cola. Al hacerlo, el controlador debe cumplir ciertas reglas para sincronizarse correctamente en IRQL = PASSIVE_LEVEL y en IRQL = DISPATCH_LEVEL, ya que una rutina CustomThreadedDpc puede ejecutarse en ambas IRQL.
En el caso de un bloqueo de número normal, se aplican las siguientes reglas:
Para adquirir y liberar el bloqueo de giro, el controlador puede llamar a KeAcquireSpinLock y KeReleaseSpinLock desde dentro y fuera de la rutina CustomThreadedDpc .
El controlador puede llamar a KeAcquireSpinLockForDpc y KeReleaseSpinLockForDpc desde dentro de la rutina CustomThreadedDpc . Tenga en cuenta que la rutina CustomThreadedDpc no debe llamar a KeAcquireSpinLockAtDpcLevel o KeReleaseSpinLockFromDpcLevel, ya que estas rutinas solo se pueden llamar de forma segura en IRQL = DISPATCH_LEVEL.
Las reglas de bloqueos de número en cola son similares:
Para adquirir y liberar el bloqueo de giro, el controlador puede llamar a KeAcquireInStackQueuedSpinLock y KeReleaseInStackQueuedSpinLock desde dentro y fuera de la rutina CustomThreadedDpc .
El controlador puede llamar a KeAcquireInStackQueuedSpinLockForDpc y KeReleaseInStackQueuedSpinLockForDpc desde la rutina CustomThreadedDpc . Tenga en cuenta que la rutina CustomThreadedDpc no debe llamar a KeAcquireInStackQueuedSpinLockAtDpcLevel o KeReleaseInStackQueuedSpinLockFromDpcLevel, ya que estas rutinas solo se pueden llamar de forma segura en IRQL = DISPATCH_LEVEL.
Dado que KeAcquireSpinLockForDpc y KeAcquireInStackQueuedSpinLockForDpc no restablecen el IRQL cuando se llama en DISPATCH_LEVEL, se ejecutan más rápido que KeAcquireSpinLock y KeAcquireInStackQueuedSpinLock, respectivamente.
Para obtener más información sobre los bloqueos de número, consulte Bloqueos de número.