Condividi tramite


Uso né di I/O con buffering né diretto

Se un driver non usa né l'I/O con buffering né diretto, il gestore di I/O passa gli indirizzi virtuali dello spazio utente originali nei provider di integrazione inviati al driver. Per accedere a questi buffer in modo sicuro, il driver deve essere in esecuzione nel contesto del thread chiamante. In genere, solo i driver di livello più alto, ad esempio FSD, possono usare questo metodo per accedere ai buffer.

Un driver intermedio o di livello più basso non può sempre soddisfare questa condizione. Ad esempio, se un thread richiedente attende il completamento di una richiesta di I/O o se un driver di livello superiore viene sovrapposto al driver intermedio o di livello più basso, è improbabile che le routine del driver di livello inferiore vengano chiamate nel contesto del thread richiedente.

Il gestore di I/O determina che un'operazione di I/O non usa né il buffering né l'I/O diretto, come indicato di seguito:

Quando un driver riceve un IRP che specifica un'operazione di I/O che non usa né i/o memorizzati nel buffer né diretto, deve eseguire le operazioni seguenti:

  1. Controllare la validità dell'intervallo di indirizzi del buffer utente e verificare se è consentito l'accesso in lettura o scrittura appropriato, usando le routine di supporto probeForRead e ProbeForWrite . Il driver deve racchiudere gli accessi all'intervallo di indirizzi del buffer all'interno di un gestore eccezioni fornito dal driver, in modo che un thread utente non possa modificare i diritti di accesso per il buffer mentre il driver accede alla memoria. Se il probe genera un'eccezione, il driver deve restituire un errore. Il driver deve chiamare queste routine all'interno del contesto del thread che ha effettuato la richiesta di I/O; pertanto, solo un driver di livello superiore può eseguire questa attività.

  2. Gestire buffer e operazioni di memoria in uno dei modi seguenti:

    • Eseguire le proprie operazioni di doppio buffering, in quanto il gestore di I/O esegue per i driver che usano operazioni di I/O memorizzate nel buffer. Per altre informazioni, vedere Uso dell'I/O memorizzato nel buffer.
    • Creare i propri MDLs e bloccare il buffer chiamando le routine di supporto del gestore della memoria, in quanto il gestore di I/O esegue per i driver che usano operazioni di I/O dirette. Per altre informazioni, vedere Uso dell'I/O diretto.
    • Eseguire tutte le operazioni necessarie nel buffer utente direttamente nel contesto del thread chiamante. Il driver deve eseguire il wrapping dell'accesso al buffer all'interno di un gestore eccezioni fornito dal driver, nel caso in cui un thread utente modifica i diritti di accesso per il buffer o i dati nel buffer mentre il driver accede alla memoria. Per altre informazioni, vedere Gestione delle eccezioni.

In effetti, il driver deve scegliere in base all'IRP se eseguire il buffering di I/O, I/O diretto o I/O nel contesto del thread chiamante e deve gestire eventuali eccezioni che potrebbero verificarsi in un contesto di thread in modalità utente. Il driver deve gestire i propri accessi al buffer utente, le operazioni a doppio buffering e i mapping di memoria, se necessario, invece di consentire al gestore di I/O di gestire queste operazioni per il driver.