Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Il gestore di I/O offre a ogni driver in una catena di driver a più livelli una posizione dello stack di I/O per ogni IRP configurato. Ogni posizione dello stack di I/O è costituita da una struttura IO_STACK_LOCATION .
Il gestore di I/O crea una matrice di percorsi di stack di I/O per ogni IRP, con un elemento di matrice corrispondente a ogni driver in una catena di driver a più livelli. Ogni driver possiede una delle posizioni dello stack nel pacchetto e chiama IoGetCurrentIrpStackLocation per ottenere informazioni specifiche del driver sull'operazione di I/O.
Ogni driver in una catena di questo tipo è responsabile della chiamata a IoGetNextIrpStackLocation, quindi alla configurazione della posizione dello stack I/O del driver inferiore successivo. È anche possibile usare la posizione dello stack di I/O di qualsiasi driver di livello superiore per archiviare il contesto di un'operazione in modo che la routine IoCompletion del driver possa eseguire le operazioni di pulizia.
La figura Elaborazione di IRP nei driver stratificati mostra due posizioni nello stack di I/O nell'IRP originale perché mostra due driver, un driver di file system e un driver di dispositivo di archiviazione di massa. Gli IRP allocati dal driver nella figura Elaborazione degli IRP nei driver a più livelli non hanno una posizione nello stack per il FSD (File System Driver) che li ha creati. Qualsiasi driver di livello superiore che alloca IRP per i driver di livello inferiore stabilisce anche quante posizioni nello stack I/O devono avere i nuovi IRP, in base al valore StackSize dell'oggetto dispositivo del driver subito inferiore.
Nella figura seguente viene illustrato il contenuto dell'IRP in modo più dettagliato.
Come illustrato nella figura, ogni percorso dello stack di I/O specifico del driver in un IRP contiene le informazioni generali seguenti:
Codice della funzione principale (IRP_MJ_XXX), che indica l'operazione di base che il driver deve eseguire
Per alcuni codici di funzione principali gestiti da FSD, driver SCSI di livello superiore e tutti i driver PnP, un codice di funzione secondario (IRP_MN_XXX), che indica quale sottocase dell'operazione di base il driver deve eseguire
Set di argomenti specifici dell'operazione, ad esempio la lunghezza e la posizione iniziale di un buffer in cui o da cui il driver trasferisce i dati
Puntatore all'oggetto dispositivo creato dal driver, che rappresenta il dispositivo di destinazione (fisico, logico o virtuale) per l'operazione richiesta
Puntatore all'oggetto file, che rappresenta un file aperto, un dispositivo, una directory o un volume
Un driver del file system accede all'oggetto file tramite la sua posizione nello stack di I/O nelle IRP. Altri driver in genere ignorano l'oggetto file.
Il set di codici di funzione principali e secondari dell'IRP che un determinato driver gestisce può essere specifico per tipo di dispositivo. Tuttavia, i driver di livello più basso e i driver intermedi (incluse le funzioni PnP e i driver di filtro) gestiscono in genere il set di richieste di base seguente:
IRP_MJ_CREATE : aprire l'oggetto dispositivo di destinazione, a indicare che è presente e disponibile per le operazioni di I/O
IRP_MJ_READ : trasferire i dati dal dispositivo
IRP_MJ_WRITE : trasferire i dati al dispositivo
IRP_MJ_DEVICE_CONTROL : configurare (o reimpostare) il dispositivo, in base a un codice di controllo I/O specifico del tipo di dispositivo (IOCTL) definito dal sistema
IRP_MJ_CLOSE : chiudere l'oggetto dispositivo di destinazione
IRP_MJ_PNP : eseguire un'operazione Plug and Play nel dispositivo. Una richiesta di IRP_MJ_PNP viene inviata dal manager PnP tramite il gestore di I/O.
IRP_MJ_POWER : eseguire un'operazione di alimentazione nel dispositivo. Una richiesta di IRP_MJ_POWER viene inviata dal gestore energia tramite il gestore di I/O.
Per altre informazioni sui principali codici di funzione IRP necessari per gestire i driver, vedere Codici di funzione principali IRP.
In generale, il gestore di I/O invia IRP con almeno due posizioni nello stack di I/O ai driver di dispositivo di archiviazione di massa perché un file system si sovrappone ad altri driver per i dispositivi di archiviazione di massa. Il gestore di I/O invia i pacchetti di richiesta I/O con una singola posizione nello stack a qualsiasi driver che non abbia altri driver sovrapposti sopra di esso.
Tuttavia, gestione I/O fornisce supporto per l'aggiunta di un nuovo driver a qualsiasi catena di driver esistenti nel sistema. Ad esempio, un driver mirror intermedio che esegue il backup dei dati in una determinata partizione del disco potrebbe essere inserito tra una coppia di driver, ad esempio il driver del file system e il driver di livello più basso mostrato nella figura Elaborazione IRP nei Driver a Livelli. Quando questo nuovo driver si collega allo stack di dispositivi, il gestore di I/O regola il numero di posizioni nello stack di I/O in tutti i pacchetti di richieste I/O inviati al file system, al mirror e ai driver di livello più basso. Ogni IRP che il file system nella figura Elaborazione degli IRP nei driver stratificati ha allocato conterrebbe anche un'altra posizione dello stack di I/O per un nuovo driver mirror di questo tipo.
Si noti che questo supporto per l'aggiunta di nuovi driver a una catena esistente implica determinate restrizioni per l'accesso di qualsiasi driver alle posizioni dello stack di I/O negli IRP:
Un driver di livello superiore in una catena di driver a più livelli può accedere in modo sicuro solo ai propri e alle posizioni dello stack I/O del driver di livello inferiore successivo in qualsiasi IRP. Un driver di questo tipo deve impostare il livello dello stack di I/O per il driver di livello inferiore successivo negli IRP. Tuttavia, quando si progetta un driver di livello superiore, non è possibile prevedere quando (o se) un nuovo driver verrà aggiunto alla catena esistente appena sotto il driver.
Pertanto, è consigliabile presupporre che qualsiasi driver aggiunto successivamente gestirà gli stessi codici di funzione principali di IRP (IRP_MJ_XXX) del driver di livello successivo spostato.
Il driver di livello più basso in una catena di driver a più livelli può accedere in modo sicuro solo alla propria posizione dello stack di I/O in qualsiasi IRP. Quando si progetta un driver di questo tipo, non è possibile prevedere quando (o se) un nuovo driver verrà aggiunto alla catena esistente sopra il driver di dispositivo.
Nella progettazione di un driver di livello più basso, si supponga che il driver possa continuare a elaborare le IRP (Richieste di Pacchetto I/O) usando le informazioni passate nella propria posizione nello stack di I/O, indipendentemente dall'origine di un determinato IRP e dal numero di driver stratificati sopra di esso.