Condividi tramite


DispatchReadWrite con I/O diretto

Qualsiasi driver di dispositivo di livello inferiore che configura gli oggetti dispositivo per I/O diretto soddisfa una richiesta di lettura restituendo i dati trasferiti dal dispositivo alla memoria fisica di sistema, descritta da MDL in Irp-MdlAddress>. Soddisfa una richiesta di scrittura trasferendo i dati dalla memoria fisica del sistema al dispositivo.

I driver di livello inferiore devono gestire le richieste di lettura/scrittura in modo asincrono. Pertanto, ogni routine DispatchReadWrite del driver di livello inferiore deve passare IRP_MJ_READ e IRP_MJ_WRITE IRP con parametri validi in altre routine driver, come descritto in Passaggio di irP verso il basso nello stack di driver.

Per i runtime di integrazione di lettura/scrittura inviati a driver di livello inferiore, la memoria fisica di paging descritta da MDL in Irp-MdlAddress> è già stata sottoposta a probe per i diritti di accesso corretti per eseguire il trasferimento richiesto ed è già stata bloccata dal driver di livello più alto nella catena o dal gestore di I/O. Qualsiasi driver intermedio o di livello più basso che configura gli oggetti dispositivo per I/O diretto non deve chiamare MmProbeAndLockPages perché questa operazione è già stata eseguita. Un driver di livello più basso chiama MmGetSystemAddressForMdlSafe. I driver per Windows 98 chiamano invece MmGetSystemAddressForMdl . I driver per Windows Me, Windows 2000 e versioni successive di Windows devono usare MmGetSystemAddressForMdlSafe.

Qualsiasi routine DispatchReadWrite del driver di dispositivo intermedio o di livello più basso deve convalidare i parametri nel percorso dello stack I/O dei runtime di integrazione di lettura/scrittura se non è in grado di considerare attendibile un driver di livello superiore per passare solo i runtime di integrazione con parametri validi. Se la routine DispatchReadWrite rileva un errore di parametro, deve completare l'IRP con un errore appropriato STATUS_XXX come già descritto in Completamento dei runtime di integrazione. Se i parametri sono validi, la routine DispatchReadWrite di un driver intermedio deve passare la richiesta per un'ulteriore elaborazione, in base alle linee guida in DispatchReadWrite in Higher-Level Driver.

La routine DispatchReadWrite di un driver di dispositivo di livello più basso deve chiamare IoMarkIrpPending con la richiesta di trasferimento, passare l'IRP su per un'ulteriore elaborazione da parte di altre routine driver e restituire STATUS_PENDING, come descritto in Passaggio di irP nello stack di driver.

Si noti che la routine DispatchReadWrite di un driver di dispositivo può controllare l'ordine in cui gli IRP vengono accodati al dispositivo per una velocità effettiva di I/O più veloce chiamando IoStartPacket con un valore chiave determinato dal driver. Un'altra routine nel driver esegue la coda dell'IRP in un secondo momento, determina se la lunghezza richiesta deve essere suddivisa in operazioni di trasferimento parziale e programma il dispositivo per trasferire i dati.

In generale, un driver di dispositivo che deve suddividere le richieste di trasferimento di grandi dimensioni in base alle limitazioni del dispositivo deve posticipare queste operazioni fino a quando non appena prima di configurare il dispositivo per una determinata richiesta di trasferimento. Tale routine DispatchReadWrite del driver di dispositivo non deve controllare la posizione dello stack di I/O dei runtime di integrazione in ingresso per eventuali vincoli di trasferimento specifici del dispositivo, né tentare di calcolare intervalli di trasferimento parziale, quando il driver può posticipare questi controlli fino a quando il relativo StartIo (o altra routine driver) programma il dispositivo per un'operazione di trasferimento.