Compartilhar via


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