IRP_MJ_READ (fs e driver di filtro)

Data di invio

Gestione I/O o un driver del file system invia la richiesta di IRP_MJ_READ. Questa richiesta può essere inviata, ad esempio, quando un'applicazione in modalità utente ha chiamato una funzione Win32, ad esempio ReadFile, o quando un componente in modalità kernel ha chiamato ZwReadFile.

Operazione: driver del file system

Il driver del file system deve estrarre e decodificare l'oggetto file per determinare i parametri e il codice di funzione secondario.

Per le richieste di lettura dell'elenco dei descrittori di memoria (MDL), il file system deve controllare il codice della funzione secondaria per determinare quale operazione è richiesta. Di seguito sono riportati i codici di funzione secondaria validi, che possono essere usati solo per l'I/O dei file memorizzati nella cache:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Per altre informazioni sulla gestione di questo IRP, studiare gli esempi CDFS e FASTFAT inclusi in Windows Driver Kit (WDK).

Operazione: driver di filtro del file system legacy

Il driver di filtro deve eseguire qualsiasi elaborazione necessaria e, a seconda della natura del filtro, deve eseguire una delle azioni seguenti:

  • Completare o non eseguire l'IRP oppure
  • Passare l'IRP al driver inferiore successivo nello stack.

Parametri

Un file system o un driver di filtro chiama IoGetCurrentIrpStackLocation per l'IRP specificato per ottenere un puntatore alla propria posizione dello stack in IRP. Nei parametri seguenti Irp punta all'IRP e all'IrpSp punta al IO_STACK_LOCATION. Il driver può usare le informazioni impostate nei membri seguenti dell'IRP e nel percorso dello stack IRP per elaborare una richiesta di lettura:

  • DeviceObject è un puntatore all'oggetto dispositivo di destinazione.

  • Irp->AssociatedIrp.SystemBuffer punta a un buffer fornito dal sistema da usare come buffer di sistema intermedio, se il flag DO_BUFFERED_IO è impostato in DeviceObject-Flags>. In caso contrario, questo membro è impostato su NULL.

  • Irp->IoStatus punta a una struttura IO_STATUS_BLOCK che riceve lo stato di completamento finale e le informazioni sull'operazione richiesta. Per altre informazioni, vedere la descrizione del parametro IoStatusBlock in ZwReadFile.

  • Irp->MdlAddress è l'indirizzo di un elenco di descrittori di memoria (MDL) che descrive le pagine che contengono i dati da leggere.

  • *Irp->UserBuffer punta a un buffer di output fornito dal chiamante che riceve i dati letti dal file.

  • IrpSp->FileObject punta all'oggetto file associato a DeviceObject. Se il flag FO_SYNCHRONOUS_IO è impostato in IrpSp-FileObject-Flags>>, l'oggetto file è stato aperto per L/O sincrono.

    Il parametro IrpSp-FileObject> contiene un puntatore al campo RelatedFileObject, che è anche una struttura FILE_OBJECT. Il campo RelatedFileObject della struttura FILE_OBJECT non è valido durante l'elaborazione di IRP_MJ_READ e non deve essere usato.

  • IrpSp->MajorFunction è impostato su IRP_MJ_READ.

  • IrpSp->MinorFunction specifica l'operazione richiesta e contiene uno dei valori seguenti:

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset è una variabile LARGE_INTEGER che specifica l'offset di byte iniziale all'interno del file dei dati da leggere.

  • IrpSp->Parameters.Read.Keyè il valore della chiave associato a un blocco di intervallo di byte nel file di destinazione.

  • IrpSp->Parameters.Read.Length è la lunghezza in byte dei dati da leggere. Se l'operazione di lettura ha esito positivo, il numero di byte letti viene restituito nel membro Informazioni della struttura IO_STATUS_BLOCK a cui punta Irp-IoStatus>.

Commenti

I file system arrotondano le operazioni di scrittura e lettura alla fine del file fino a un multiplo delle dimensioni del settore del dispositivo di archiviazione file sottostante. Quando i filtri elaborano operazioni di pre-lettura o pre-scrittura, tali filtri che allocano e scambiano i buffer devono arrotondare le dimensioni di un buffer allocato a un multiplo delle dimensioni del settore del dispositivo associato. In caso contrario, la lunghezza dei dati trasferiti dal file system sottostante supererà la lunghezza allocata del buffer. Per altre informazioni sullo scambio di buffer, vedere esempio di swapBuffers Minifilter.

Vedi anche

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (informazioni di riferimento sul kernel WDK)

IRP_MJ_WRITE

ZwReadFile