Compartir a través de


Llamadas a rutinas de soporte técnico que usan bloqueos de número

La llamada a KeAcquireSpinLock o KeAcquireInStackQueuedSpinLock establece el IRQL en el procesador actual para DISPATCH_LEVEL hasta que una llamada correspondiente a KeReleaseSpinLock o KeReleaseInStackQueuedSpinLock restaura el IRQL anterior. Por lo tanto, los controladores deben ejecutarse en IRQL <= DISPATCH_LEVEL cuando llaman a KeAcquireSpinLock o KeAcquireInStackQueuedSpinLock.

Los autores de llamadas de KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel y KeReleaseSpinLockFromDpcLevel se ejecutan más rápido porque ya se ejecutan en IRQL = DISPATCH_LEVEL por lo que estas rutinas de soporte técnico no necesitan restablecer IRQL en el procesador actual. Por lo tanto, es un error irrecuperable en la mayoría de las plataformas Windows llamar a KeAcquireSpinLockAtDpcLevel o KeAcquireInStackQueuedSpinLockAtDpcLevel mientras se ejecuta en IRQL menor que DISPATCH_LEVEL. También es un error liberar un bloqueo de número que se adquirió con KeAcquireSpinLock llamando a KeReleaseSpinLockFromDpcLevel porque el IRQL original del autor de la llamada no se restaura.

Rutinas que contienen un bloqueo de giro ejecutivo, como exInterlockedXxx, normalmente se ejecutan en IRQL = DISPATCH_LEVEL hasta que liberan el bloqueo de giro y devuelven el control al autor de la llamada. Sin embargo, es posible que las rutinas InterruptService y SynchCritSection de un controlador (que se ejecutan en DIRQL) llamen a determinadas rutinas ExInterlockedXxx, como las rutinas ExInterlockedXxxList, siempre y cuando el bloqueo de número pasado a la rutina se use exclusivamente por las rutinas ISR y SynchCritSection.

Cada rutina que contiene un bloqueo de número de interrupciones se ejecuta en el DIRQL de un conjunto asociado de objetos de interrupción. Por lo tanto, un controlador no debe llamar a KeAcquireSpinLock y KeReleaseSpinLock ni a ninguna otra rutina que use un bloqueo de giro ejecutivo de sus rutinas ISR o SynchCritSection . Esta llamada es un error que puede provocar un interbloqueo del sistema, lo que requiere que el usuario reinicie su máquina. Tenga en cuenta que si la rutina ISR o SynchCritSection de un controlador llama a una rutina exInterlockedXxxList, el controlador no puede volver a usar el bloqueo de número que pasa a las rutinas de lista Xxx de ExInterlocked en las llamadas a las rutinas de compatibilidad de KeXxxSpinLock o KeXxxSpinLockXxxDpcLevel.

Si un controlador tiene un ISR multivector o más de un ISR, sus rutinas pueden llamar a KeSynchronizeExecution mientras se ejecuta en cualquier IRQL hasta el valor SynchronizeIrql especificado para los objetos de interrupción asociados cuando estaban conectados.