Gestione delle operazioni di I/O sovrapposte

La routine DpcForIsr o CustomDpc di un driver che si sovrappone alle operazioni sul dispositivo non può basarsi su una corrispondenza uno-a-uno tra le richieste di input alla routine StartIo e le chiamate dell'ISR a IoRequestDpc o KeInsertQueueDpc. Tale DpcForIsr o CustomDpc di un driver non può necessariamente usare i puntatori di input al contesto fornito da IRP e ISR o il puntatore CurrentIrp nell'oggetto dispositivo di destinazione, per completare solo tale IRP.

In qualsiasi momento, lo stesso oggetto DPC non può essere accodato due volte. Se un ISR chiama IoRequestDpc o KeInsertQueueDpc più volte prima dell'esecuzione di DpcForIsr o CustomDpc , la routine DPC viene eseguita una sola volta quando irQL in un processore scende sotto DISPATCH_LEVEL. D'altra parte, se l'ISR chiama IoRequestDpc o KeInsertQueueDpc mentre il DpcForIsr o CustomDpc corrispondente è in esecuzione su un altro processore, la routine DPC può essere eseguita contemporaneamente su due processori.

Pertanto, qualsiasi driver che si sovrappone alle operazioni di I/O basate sull'interruzione nel dispositivo deve avere quanto segue:

  • Routine DpcForIsr o CustomDpc che può completare il numero di richieste in sospeso ogni volta che viene chiamato

  • ISR che non sovrascrive mai le informazioni di contesto che passa a una routine DpcForIsr o CustomDpc , fino a quando tale routine non ha usato le informazioni di contesto e completato l'IRP a cui appartengono le informazioni di contesto

  • Routine SynchCritSection che accede all'area di contesto dell'ISR per conto della routine DpcForIsr o CustomDpc