Condividi tramite


Scrittura di routine DPC

Le responsabilità principali delle routine DpcForIsr e CustomDpc garantiscono che l'operazione di I/O del dispositivo successiva venga avviata tempestivamente e completando l'IRP corrente.

Il lavoro aggiuntivo eseguito da qualsiasi routine DpcForIsr o CustomDpc dipende dalla progettazione del driver e dalla natura del dispositivo. Ad esempio, una routine DpcForIsr o CustomDpc può anche eseguire una delle operazioni seguenti:

  • Riprovare a un'operazione che ha eseguito il timeout o l'errore.

  • Chiamare IoAllocateErrorLogEntry, configurare un pacchetto di log degli errori per segnalare un errore di I/O del dispositivo e chiamare IoWriteErrorLogEntry.

    Per altre informazioni sulla gestione degli errori di I/O, vedere Registrazione degli errori.

  • Se il driver usa l'I/O con buffer o se l'IRP specifica un'operazione di controllo del dispositivo, trasferire i dati letti dal dispositivo al buffer di sistema in Irp-AssociatedIrp.SystemBuffer> prima di completare l'IRP.

  • Se il driver usa l'I/O diretto e deve interrompere i trasferimenti di grandi dimensioni in pezzi più piccoli, salvare lo stato di ogni operazione di trasferimento parziale appena completata, calcolare l'intervallo di trasferimento parziale successivo e usare una routine SynchCritSection fornita dal driver per programmare il dispositivo per l'operazione di trasferimento parziale successivo.

    Anche un driver che usa l'I/O memorizzato nel buffer potrebbe dover suddividere una richiesta di trasferimento se il dispositivo ha funzionalità di trasferimento limitate.

  • Se il driver usa DMA basato su pacchetti, chiamare FlushAdapterBuffers dopo ogni operazione di trasferimento del dispositivo e chiamare FreeAdapterChannel o FreeMapRegisters quando viene eseguita una sequenza di trasferimenti parziali e la richiesta di trasferimento completa viene soddisfatta.

    Se un trasferimento richiesto è soddisfatto solo in parte da una singola operazione DMA, la routine DpcForIsr o CustomDpc è in genere responsabile della configurazione di una o più operazioni DMA fino al numero specificato di byte dell'IRP.

    Per altre informazioni sull'uso di DMA, vedere Oggetti adapter e DMA.

  • Se il driver usa l'I/O programmato (PIO), chiamare KeFlushIoBuffers alla fine di ogni operazione di trasferimento se l'IRP corrente richiede una lettura.

    Se un trasferimento richiesto è soddisfatto solo in parte da una singola operazione PIO, la routine DpcForIsr o CustomDpc è in genere responsabile della configurazione di una o più operazioni di trasferimento fino al completamento del trasferimento del numero specificato di byte dell'IRP.

    Per altre informazioni sull'uso di PIO, vedere Uso di I/O diretto.

  • Se un driver non WDM ha una routine ControllerControl , chiamare IoFreeController al termine di un'operazione richiesta.

Si noti che una routine DpcForIsr o CustomDpc esegue in genere la maggior parte dell'elaborazione di I/O del dispositivo del driver per soddisfare gli INDIRIZZI DI accesso. Queste routine condividono anche alcune delle responsabilità per l'accodamento degli indirizzi IP al dispositivo con le routine di invio del driver.

Prendere in considerazione le linee guida generali per la progettazione.

  • Qualsiasi routine DpcForIsr o CustomDpc deve chiamare IoStartNextPacket non appena può effettuare questa chiamata in modo sicuro: ovvero senza causare un conflitto di risorse o una condizione di gara con la routine StartIo del driver o con qualsiasi altra routine la routine StartIo causa l'esecuzione.

  • Se un driver gestisce la propria accodamento di indirizzi IP, la routine DpcForIsr o CustomDpc deve notificare al driver non appena è sicuro dequeuere l'IRP successivo e configurare il dispositivo per la richiesta successiva.

Una routine DpcForIsr o CustomDpc deve chiamare IoStartNextPacket oppure inviare una notifica alla routine del driver appropriata quando è possibile avviare l'elaborazione di I/O del dispositivo per la richiesta successiva. A seconda del driver e del relativo dispositivo, questo può verificarsi correttamente prima che la routine DpcForIsr o CustomDpc completa l'IRP corrente con IoCompleteRequest oppure può verificarsi immediatamente prima che questa routine completa l'IRP corrente e restituisce il controllo.