IRP_MJ_WRITE (fs e driver di filtro)

Data di invio

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

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 scrittura 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 su come gestire questo IRP, studiare l'esempio FASTFAT incluso 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, 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 di IRP e il percorso dello stack IRP per elaborare una richiesta di creazione:

  • 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. Se la richiesta di IRP_MJ_WRITE ha esito negativo, la routine di invio di scrittura del file system restituisce un valore NTSTATUS di errore e il valore di Irp-IoStatus.Information> non è definito e non deve essere usato.

  • Irp->MdlAddress è l'indirizzo di un elenco di descrittori di memoria (MDL) che descrive le pagine in cui devono essere scritti i dati.

  • 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_WRITE e non deve essere usato.

  • IrpSp->Flag: se il flag SL_FORCE_DIRECT_WRITE è impostato, i driver in modalità kernel possono scrivere in aree del volume in cui normalmente non possono scrivere a causa del blocco diretto della scrittura. Il blocco diretto per la scrittura è stato implementato per motivi di sicurezza in Windows Vista e nei sistemi operativi successivi. Questo flag viene controllato sia a livello del file system che dello stack di archiviazione. Per altre informazioni sul blocco diretto della scrittura, vedere Blocking Direct Write Operations to Volumes and Disks .For more information about direct write blocking direct write operations to Volumes and Disks. Il flag SL_FORCE_DIRECT_WRITE è disponibile in Windows Vista e versioni successive di Windows.

  • IrpSp->MajorFunction è impostato su IRP_MJ_WRITE.

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

    • 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.Write.ByteOffset è una variabile LARGE_INTEGER che specifica l'offset di byte iniziale all'interno del file dei dati da scrivere.

    In determinate circostanze, questo parametro potrebbe contenere un valore speciale. Ad esempio, se true, la condizione seguente indica che la fine corrente del file deve essere usata anziché un valore di offset di file esplicito: IrpSp-Parameters.Write.ByteOffset.LowPart> == FILE_WRITE_TO_END_OF_FILE e IrpSp-Parameters.Write.ByteOffset.HighPart> == -1

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

  • IrpSp->Parameters.Write.Length è la lunghezza in byte dei dati da scrivere. Se l'operazione di scrittura ha esito positivo, il numero di byte scritti 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

CcMdlWriteComplete

CcPrepareMdlWrite

FLT_IO_PARAMETER_BLOCK

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ

IRP_MJ_WRITE (informazioni di riferimento sul kernel WDK)

ZwWriteFile