Percorsi stack I/O

Il gestore I/O fornisce a ogni driver una catena di driver a 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 I/O crea una matrice di posizioni dello stack I/O per ogni IRP, con un elemento matrice corrispondente a ogni driver in una catena di driver a 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 tale catena è responsabile della chiamata a IoGetNextIrpStackLocation, quindi alla configurazione della posizione dello stack I/O inferiore successivo. La posizione dello stack I/O di qualsiasi driver di livello superiore può essere usata anche 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 nella figura Driver a livelli mostra due percorsi dello stack di I/O nell'IRP originale perché mostra due driver, un driver del file system e un driver di dispositivo di archiviazione di massa. Gli IRP allocati dal driver nell'elaborazione di IRP nella figura Driver a livelli non hanno una posizione dello stack per il driver FSD (File System Driver) che li ha creati. Qualsiasi driver di livello superiore che alloca i provider di integrazione per i driver di livello inferiore determina anche il numero di posizioni dello stack I/O che devono essere presenti, in base al valore StackSize dell'oggetto dispositivo del driver inferiore successivo.

La figura seguente mostra il contenuto dell'IRP in modo più dettagliato.

diagramma che illustra il contenuto della posizione dello stack i/o in un irp.

Come illustrato nella figura, ogni percorso dello stack 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 quali 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 di file system accede all'oggetto file tramite il percorso dello stack di I/O in IRP. Altri driver ignorano in genere l'oggetto file.

Il set di codici di funzione principali e secondari di IRP che un determinato handle di driver può essere specifico del tipo di dispositivo. Tuttavia, i driver di livello più basso e i driver intermedi (incluse le funzioni PnP e i driver di filtro) in genere gestiscono il set di richieste di base seguenti:

  • IRP_MJ_CREATE : aprire l'oggetto dispositivo di destinazione, che indica che è presente e disponibile per le operazioni di I/O

  • IRP_MJ_READ : trasferire i dati dal dispositivo

  • IRP_MJ_WRITE : trasferire i dati nel 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)

  • IRP_MJ_CLOSE : chiudere l'oggetto dispositivo di destinazione

  • IRP_MJ_PNP : eseguire un'operazione di Plug and Play nel dispositivo. Una richiesta di IRP_MJ_PNP viene inviata dal gestore PnP tramite gestione I/O.

  • IRP_MJ_POWER : eseguire un'operazione di alimentazione nel dispositivo. Una richiesta di IRP_MJ_POWER viene inviata dal power manager tramite gestione 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 gli indirizzi IRP con almeno due posizioni dello stack di I/O ai driver di dispositivo di archiviazione di massa perché un file system è stratiato su altri driver per dispositivi di archiviazione di massa. Il gestore di I/O invia i provider di servizi di integrazione con una singola posizione dello stack a qualsiasi driver che non ha altri driver a livelli sopra di esso.

Tuttavia, il gestore di 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 mostrati nella figura Elaborazione di IRP nella figura Driver a livelli. Quando questo nuovo driver si collega allo stack di dispositivi, il gestore I/O regola il numero di posizioni dello stack di I/O in tutti gli INDIRIZZI DI rete inviati al file system, al mirror e ai driver di livello più basso. Ogni IRP che il file system nell'elaborazione di IRP nella figura dei driver a livelli allocato contiene anche un'altra posizione dello stack di I/O per un nuovo driver mirror.

Si noti che questo supporto per l'aggiunta di nuovi driver a una catena esistente implica determinate restrizioni per l'accesso di qualsiasi particolare driver alle posizioni dello stack I/O in IRP:

  • Un driver di livello superiore in una catena di driver a livelli può accedere in modo sicuro solo ai propri e alle posizioni dello stack I/O di livello inferiore successivo in qualsiasi IRP. Tale driver deve configurare la posizione dello stack di I/O per il driver di livello inferiore successivo in IRP. Tuttavia, quando si progetta un driver di livello superiore, non è possibile prevedere quando (o se) verrà aggiunto un nuovo driver alla catena esistente appena sotto il driver.

    Si supponga pertanto che qualsiasi driver aggiunto successivamente gestirà gli stessi codici di funzione principali IRP (IRP_MJ_XXX) come il driver di livello successivo spostato.

  • Il driver di livello più basso in una catena di driver a livelli può accedere in modo sicuro solo alla propria posizione dello stack I/O in qualsiasi IRP. Quando si progetta un driver di questo tipo, non è possibile prevedere quando (o se) verrà aggiunto un nuovo driver 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 i provider di servizi di rete usando le informazioni passate nella propria posizione dello stack I/O, indipendentemente dall'origine di un determinato IRP e dal numero di driver a livelli sopra di esso.