DispatchReadWrite con I/O memorizzato nel buffer

Qualsiasi driver di dispositivo di livello più basso che configura gli oggetti dispositivo per I/O memorizzati nel buffer soddisfa una richiesta di lettura restituendo i dati trasferiti dal dispositivo in un buffer dello spazio di sistema bloccato in Irp-AssociatedIrp.SystemBuffer>. Soddisfa una richiesta di scrittura trasferendo i dati dallo stesso buffer al dispositivo.

Di conseguenza, la routine DispatchReadWrite di tale driver di dispositivo esegue in genere quanto segue alla ricezione di una richiesta di trasferimento:

  1. Chiama IoGetCurrentIrpStackLocation e determina la direzione della richiesta di trasferimento.

  2. Controlla la validità dei parametri per la richiesta.

    • Per una richiesta di lettura, la routine controlla in genere il valore IoStackLocation-Parameters.Read.Length> del driver per determinare se il buffer è sufficientemente grande da ricevere i dati trasferiti dal dispositivo.

      Ad esempio, il driver della classe della tastiera di sistema elabora le richieste di lettura provenienti solo dal thread di input utente Win32. Questo driver definisce una struttura, KEYBOARD_INPUT_DATA, in cui archiviare le sequenze di tasti dal dispositivo e, in qualsiasi momento, contiene un certo numero di queste strutture in un buffer circolare interno per soddisfare le richieste di lettura non appena arrivano.

    • Per una richiesta di scrittura, la routine controlla in genere il valore in Parameters.Write.Length e controlla i dati in Irp-AssociatedIrp.SystemBuffer> per la validità, se necessario, se il dispositivo accetta solo pacchetti di dati strutturati contenenti membri con intervalli di valori definiti.

  3. Se uno dei parametri non è valido, la routine DispatchReadWrite completa immediatamente l'IRP, come già descritto in Completamento dei runtime di integrazione. In caso contrario, la routine passa l'IRP su per un'ulteriore elaborazione da parte di altre routine del driver, come descritto in Passaggio di irP nello stack di driver.

I driver di dispositivo di livello più basso che usano operazioni di I/O memorizzate nel buffer devono in genere soddisfare una richiesta di trasferimento leggendo o scrivendo dati di una dimensione specificata dall'origine della richiesta. È probabile che un driver di questo tipo definiscano una struttura per i dati provenienti o inviati al dispositivo e che probabilmente memorizzano nel buffer i dati strutturati internamente, come avviene con il driver della classe della tastiera di sistema.

I driver che memorizzano i dati nel buffer internamente devono supportare IRP_MJ_FLUSH_BUFFERS richieste e possono supportare anche le richieste di IRP_MJ_SHUTDOWN .

Il driver di livello più alto in una catena è in genere responsabile del controllo dei parametri di Input IRP prima di passare una richiesta di lettura/scrittura a driver inferiori. Di conseguenza, molti driver di livello inferiore possono presupporre che le posizioni dello stack di I/O in un IRP di lettura/scrittura abbiano parametri validi. Se un driver di livello più basso in una catena riconosce vincoli specifici del dispositivo per i trasferimenti di dati, tale driver deve verificare la validità dei parametri nella posizione dello stack di I/O.