Control de operaciones de E/S superpuestas
La rutina DpcForIsr o CustomDpc de un controlador que se superpone a las operaciones de su dispositivo no puede depender de una correspondencia uno a uno entre las solicitudes de entrada a la rutina StartIo y las llamadas de ISR a IoRequestDpc o KeInsertQueueDpc. Dicho controlador DpcForIsr o CustomDpc no puede usar necesariamente los punteros de entrada para el contexto proporcionado por IRP e ISR, o el puntero CurrentIrp en el objeto de dispositivo de destino, para completar solo ese IRP.
En un momento dado, el mismo objeto DPC no se puede poner en cola dos veces. Si un ISR llama a IoRequestDpc o KeInsertQueueDpc más de una vez antes de que se ejecute el DpcForIsr o CustomDpc correspondiente, la rutina DPC solo se ejecuta una vez cuando el IRQL en un procesador cae por debajo de DISPATCH_LEVEL. Por otro lado, si el ISR llama a IoRequestDpc o KeInsertQueueDpc mientras el DpcForIsr o CustomDpc correspondiente se ejecuta en otro procesador, la rutina DPC se puede ejecutar simultáneamente en dos procesadores.
Por lo tanto, cualquier controlador que se superponga a las operaciones de E/S controladas por interrupciones en su dispositivo debe tener lo siguiente:
Una rutina DpcForIsr o CustomDpc que puede completar un recuento mantenido por el controlador de solicitudes pendientes cada vez que se llama
Isr que nunca sobrescribe la información de contexto que pasa a una rutina DpcForIsr o CustomDpc , hasta que esa rutina haya usado la información de contexto y haya completado el IRP al que pertenece la información de contexto.
Rutina SynchCritSection que accede al área de contexto del ISR en nombre de la rutina DpcForIsr o CustomDpc