Condividi tramite


DispatchReadWrite nei driver di Higher-Level

Ad eccezione dei driver di file system, in genere un driver di livello superiore non dispone di code di driver interne per i provider di accesso. Tale routine DispatchReadWrite di un driver può passare IP con parametri validi su driver inferiori, possibilmente dopo aver configurato la routine IoCompletion , come descritto in Passing IRPs down the Driver Stack.

Tuttavia, una routine DispatchReadWrite di un driver di classe SCSI è responsabile della suddivisione di richieste di trasferimento di grandi dimensioni, se necessario, prima di inviare un'IRP con il codice di funzione principale IRP_MJ_READ o IRP_MJ_WRITE alla coppia di driver porta/miniport SCSI. Per altre informazioni, vedere La routine SplitTransferRequest del driver di classe di archiviazione.

Se un driver di livello superiore alloca uno o più ip di integrazione, che configura per il driver inferiore successivo nella routine DispatchReadWrite , per richiedere un certo numero di trasferimenti parziali, la routine DispatchReadWrite deve chiamare IoSetCompletionRoutine con ogni IRP allocata dal driver. Il driver deve registrare la routine IoCompletion per tenere traccia della quantità di dati trasferiti in ogni operazione di trasferimento parziale in modo che la routine IoCompletion possa rilasciare tutti gli IRP allocati dal driver e, alla fine, completare la richiesta originale.

Se il driver sottostante controlla un dispositivo multimediale rimovibile, qualsiasi irP allocato dal driver di livello superiore deve avere un contesto di thread. Per configurare un contesto di thread, il driver di allocazione deve impostare Irp-Tail.Overlay>. Thread in ogni IRP appena allocato dallo stesso valore nell'IRP di trasferimento in ingresso. Per altre informazioni, vedere Supporto di supporti rimovibili.

Se il driver di dispositivo sottostante restituisce un'IRP per un trasferimento parziale con un errore, la routine IoCompletion può riprovare la richiesta di trasferimento parziale o completare l'IRP originale con il relativo blocco di stato di I/O impostato con l'errore restituito, dopo aver liberato eventuali IP e memoria che il driver di livello superiore ha allocato.

Se una routine DispatchReadWrite di livello superiore alloca la memoria per le operazioni di trasferimento parziale e la relativa allocazione verrà accessibile dalla routine IoCompletion del driver (o dal driver di dispositivo sottostante), la routine DispatchReadWrite deve allocare tale memoria dal pool non di pagina.