Tratamento de operações de E/S sobrepostas
A rotina DpcForIsr ou CustomDpc de um driver que sobrepõe operações em seu dispositivo não pode depender de uma correspondência um-para-um entre a entrada de solicitações para a rotina StartIo e as chamadas do ISR para IoRequestDpc ou KeInsertQueueDpc. O DpcForIsr ou CustomDpc de um driver não pode necessariamente usar os ponteiros de entrada para o contexto fornecido por IRP e ISR, ou o ponteiro CurrentIrp no objeto do dispositivo de destino, para concluir apenas esse IRP.
Em um determinado momento, o mesmo objeto DPC não pode ser enfileirado duas vezes. Se um ISR chamar IoRequestDpc ou KeInsertQueueDpc mais de uma vez antes da execução de DpcForIsr ou CustomDpc correspondente, a rotina DPC será executada apenas uma vez quando o IRQL em um processador ficar abaixo DISPATCH_LEVEL. Por outro lado, se o ISR chamar IoRequestDpc ou KeInsertQueueDpc enquanto o DpcForIsr ou CustomDpc correspondente estiver em execução em outro processador, a rotina DPC poderá ser executada em dois processadores simultaneamente.
Portanto, qualquer driver que sobreponha operações de E/S controladas por interrupção em seu dispositivo deve ter o seguinte:
Uma rotina DpcForIsr ou CustomDpc que pode concluir alguma contagem mantida pelo driver de solicitações pendentes sempre que for chamada
Um ISR que nunca substitui as informações de contexto que ele passa para uma rotina DpcForIsr ou CustomDpc , até que essa rotina tenha usado as informações de contexto e concluído o IRP ao qual as informações de contexto pertencem
Uma rotina SynchCritSection que acessa a área de contexto do ISR em nome da rotina DpcForIsr ou CustomDpc