Quale tipo di DPC è consigliabile usare?

A seconda della progettazione di un driver, può avere uno dei seguenti elementi:

  • Un singolo DpcForIsr per completare tutte le operazioni di I/O basate su interruzioni

  • Set di routine CustomDpc .

  • Sia un DpcForIsr che un set di routine CustomDpc specifiche dell'operazione

Se un driver ha una singola routine DpcForIsr , un set di routine CustomDpc o entrambi, dipende dalla natura del dispositivo sottostante e dal set di richieste di I/O che deve supportare.

La maggior parte dei driver di dispositivo di livello più basso ha una singola routine DpcForIsr per completare l'elaborazione di I/O per ogni IRP che richiede una o più operazioni nei rispettivi dispositivi. L'uso di un singolo DpcForIsr per completare le operazioni di I/O basate su interruzioni in un dispositivo che esegue un'operazione alla volta è relativamente facile. Per ogni operazione di I/O basata sull'interruzione è necessaria solo una chiamata di IoRequestDpc .

Pochi driver di livello più basso hanno routine CustomDpc , a meno che i dispositivi non richiedano più DPC per completare un set di operazioni di I/O basate su interruzioni.

L'uso di un singolo DpcForIsr per completare operazioni di I/O sovrapposte in un dispositivo che può eseguire operazioni simultanee è possibile con un'attenta progettazione, ma può essere relativamente difficile. Oltre a o anziché accodare una DpcForIsr, un ISR può accodare un set di routine CustomDpc specifiche dell'operazione, fornite dal driver chiamando KeInsertQueueDpc.

Si consideri, ad esempio, alcune delle sfide di progettazione coinvolte nella scrittura di un driver seriale. Come driver di un dispositivo full-duplex, un driver seriale non può basarsi su una corrispondenza uno-a-uno tra l'ordine in cui gli IRP vengono accodati a una routine StartIo e la sequenza di interruzioni dal suo dispositivo in un sistema multiprocessore multiprocessore. Inoltre, i driver seriali devono gestire le richieste di timeout e le richieste generate dall'utente asincrone per annullare le operazioni richieste in precedenza, per eliminare i dati memorizzati nel buffer e così via.

Di conseguenza, un driver seriale potrebbe mantenere code interne per la lettura, la scrittura, l'eliminazione e le operazioni di attesa che le applicazioni di porta COM in modalità utente possono richiedere. Può anche mantenere i conteggi dei riferimenti o usare un altro meccanismo di rilevamento, ad esempio un set di flag, per gli IRP nelle code interne. L'ISR chiamerebbe KeInsertQueueDpc con qualsiasi oggetto DPC allocato dal driver e inizializzato, ognuno associato a una routine CustomDpc fornita dal driver.