Condividi tramite


DispatchReadWrite nei driver Higher-Level

Ad eccezione dei driver del file system, un driver di livello superiore in genere non dispone di code di driver interne per i pacchetti richiesta I/O. La routine DispatchReadWrite di un driver di questo tipo può passare gli IRP con parametri validi a driver di livello inferiore, possibilmente dopo aver configurato la routine IoCompletion, come descritto in Passaggio degli IRP nello stack dei driver.

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 della funzione principale IRP_MJ_READ o IRP_MJ_WRITE alla coppia di driver porta/miniport SCSI. Per ulteriori informazioni, consultare la routine SplitTransferRequest del driver della classe di archiviazione.

Se un driver di livello superiore alloca uno o più pacchetti di richiesta I/O (IRP), che imposta per il driver di livello inferiore successivo nella sua routine DispatchReadWrite, per richiedere un certo numero di trasferimenti parziali, la routine DispatchReadWrite deve chiamare IoSetCompletionRoutine con ciascun IRP allocato 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, infine, completare la richiesta originale.

Se il driver sottostante controlla un dispositivo di memoria rimovibile, qualsiasi pacchetto di richiesta I/O (IRPs) allocato dal driver di livello superiore deve avere un contesto di thread. Per configurare un contesto di thread, il driver allocatore deve impostare il Irp-Tail.Overlay>.Thread in ogni nuovo IRP allocato allo stesso valore del corrispondente 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ò ritentare la richiesta di trasferimento parziale o completare l'IRP originale con il blocco di stato di I/O impostato con l'errore ricevuto, dopo aver liberato tutti gli IRP e la memoria allocati dal driver di livello superiore.

Se la routine DispatchReadWrite di un driver di livello superiore alloca memoria per le operazioni di trasferimento parziale e l'allocazione è accessibile tramite la routine IoCompletion del driver (o dal driver di dispositivo sottostante), la routine DispatchReadWrite deve allocare tale memoria dal pool non paginato.