La verificación de errores SPIN_LOCK_ALREADY_OWNED tiene un valor de 0x0000000F. Esto indica que se inició una solicitud de bloqueo de giro cuando el bloqueo de giro ya era propiedad.
Causa
Normalmente, este error se debe a una solicitud recursiva de un bloqueo de giro. También puede ocurrir si se ha iniciado algo similar a una solicitud recursiva para un bloqueo de giro, por ejemplo, cuando un hilo ha adquirido un bloqueo de giro y luego ese mismo hilo llama a una función, que también intenta adquirir un giro. cerrar con llave. El segundo intento de adquirir un bloqueo de giro no se bloquea en este caso porque hacerlo resultaría en un punto muerto irrecuperable. Si las llamadas se realizan en más de un procesador, entonces un procesador será bloqueado hasta que el otro procesador libere el bloqueo.
Este error también puede ocurrir, sin recursión explícita, cuando a todos los subprocesos y todos los bloqueos de giro se les asigna un IRQL. Los IRQL de bloqueo de giro siempre son mayores o iguales que el nivel de DPC, pero esto no es cierto para los subprocesos. Sin embargo, un subproceso que mantiene un bloqueo de giro debe mantener un IRQL mayor o igual al del bloqueo de giro. Disminuir el IRQL del subproceso por debajo del nivel IRQL del bloqueo de giro que mantiene permite programar otro subproceso en el procesador. Este nuevo hilo podría intentar adquirir el mismo bloqueo de giro.
Resolución
Asegúrese de no adquirir el bloqueo de forma recursiva. Y, para los subprocesos que mantienen un bloqueo de giro, asegúrese de no disminuir el IRQL del subproceso a un nivel por debajo del IRQL del bloqueo de giro que mantiene.