IRP_MJ_CREATE (filtri FS e FS)

Data di invio

Gestione I/O invia una richiesta di IRP_MJ_CREATE quando:

  • Viene creato un nuovo file o una nuova directory.
  • Viene aperto un file, un dispositivo, una directory o un volume esistente.

In genere, questo IRP viene inviato per conto di un'applicazione in modalità utente che ha chiamato una funzione Microsoft Win32, ad esempio CreateFile o per conto di un componente in modalità kernel che ha chiamato una funzione come IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile o ZwOpenFile.

Se la richiesta di creazione viene completata correttamente, il componente dell'applicazione o della modalità kernel riceve un handle per l'oggetto file.

Operazione: driver del file system

Se l'oggetto dispositivo di destinazione è l'oggetto dispositivo di controllo del file system, la routine di invio del driver del file system deve completare l'IRP e restituire un valore NTSTATUS appropriato, dopo aver impostato Irp-IoStatus.Status> e Irp-IoStatus.Information> sui valori appropriati.

In caso contrario, il driver del file system deve elaborare la richiesta di creazione.

Operazione: driver di filtro del file system legacy

Se l'oggetto dispositivo di destinazione è l'oggetto dispositivo di controllo del driver di filtro, la routine dispatch del driver di filtro deve completare l'IRP e restituire un valore NTSTATUS appropriato, dopo aver impostatoIrp-IoStatus.Status> e Irp-IoStatus.Information> sui valori appropriati.

In caso contrario, il driver di filtro deve eseguire qualsiasi elaborazione necessaria. Quindi, a seconda della natura del filtro, deve completare l'IRP o passarlo al driver inferiore successivo nello stack.

In genere, i driver di filtro non devono restituire STATUS_PENDING in risposta a IRP_MJ_CREATE. Tuttavia, se un driver di livello inferiore restituisce STATUS_PENDING, il driver di filtro deve passare questo valore di stato fino alla catena di driver.

I writer di driver di filtro del file system devono notare che IoCreateStreamFileObject fa sì che una richiesta di IRP_MJ_CLEANUP venga inviata allo stack di driver del file system per il volume. Poiché i file system spesso creano oggetti file di flusso come effetto collaterale delle operazioni diverse da IRP_MJ_CREATE, è difficile per i driver di filtro rilevare in modo affidabile la creazione di oggetti file di flusso. Pertanto, un driver di filtro dovrebbe ricevere IRP_MJ_CLEANUP e IRP_MJ_CLOSE richieste di oggetti file non visualizzati in precedenza. Per IoCreateStreamFileObjectLite, non viene inviata una richiesta di IRP_MJ_CLEANUP .

Quando i driver di filtro legacy eseguono nuovamente una richiesta di creazione in un callback post-creazione, devono rilasciare e impostare il buffer associato al relativo punto di ripristino (buffer ausiliario) su NULL. Se un driver di filtro legacy non libera questo buffer e lo imposta su NULL, il driver perderà memoria. I driver del filtro minifiltro non devono eseguire questa operazione perché gestione filtri lo esegue per loro.

Parametri

Un file system o un driver di filtro legacy chiama IoGetCurrentIrpStackLocation con 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 strutturato FILE_FULL_EA_INFORMATION, se l'oggetto file rappresenta un file con attributi estesi. In caso contrario, questo membro è impostato su NULL.

  • Irp->I flag sono impostati sui flag seguenti per questa richiesta:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode indica la modalità di esecuzione del processo che ha richiesto l'operazione, Ovvero KernelMode o UserMode. Se il flag SL_FORCE_ACCESS_CHECK è impostato, è necessario eseguire i controlli di accesso, anche se Irp-RequestorMode> è KernelMode.

  • Irp->IoStatus punta a una struttura IO_STATUS_BLOCK che riceve lo stato di completamento finale e le informazioni sull'operazione richiesta. Il file system imposta il membro Information di questa struttura su uno dei valori seguenti:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize è la dimensione di allocazione iniziale, espressa in byte, per il file. Un valore diverso da zero non ha alcun effetto a meno che il file non venga creato, sovrascritto o sostituito.

  • IrpSp->FileObject punta a un oggetto file creato da Gestione I/O per rappresentare il file da creare o aprire. Quando il file system elabora la richiesta di IRP_MJ_CREATE, imposta i campi FsContext e possibilmente FsContext2 in questo oggetto file su valori specifici del file system. Pertanto, i valori dei campi FsContext e FsContext2 non possono essere considerati validi fino a quando il file system non ha elaborato la richiesta di creazione. Per altre informazioni, vedere Flussi di file, contesti di flusso e contesti di Per-Stream.

    FltCancelFileOpen e IoCancelFileOpen impostano il flag FO_FILE_OPEN_CANCELLED nel campo Flags dell'oggetto file. L'impostazione di questo flag indica che la richiesta di IRP_MJ_CREATE è stata annullata e verrà inviata una richiesta di IRP_MJ_CLOSE per questo oggetto file. Una volta annullata la richiesta di creazione, non può essere ristampata.

    Il parametro IrpSp-FileObject> contiene un puntatore al campo RelatedFileObject, che è anche una struttura FILE_OBJECT. Il campo RelatedFileObject di una struttura FILE_OBJECT viene utilizzato per indicare che un determinato file è stato aperto rispetto a un oggetto file già aperto. Ciò indica in genere che il file relativo è una directory, ma i file basati su flusso possono essere aperti rispetto a un flusso già esistente di un file. Il campo RelatedFileObject della struttura FILE_OBJECT è valido solo durante l'elaborazione di IRP_MJ_CREATE.

  • IrpSp->I flag possono essere impostati su uno o più dei valori seguenti:

    Contrassegno Significato
    SL_FORCE_ACCESS_CHECK 0x01 Se questo flag è impostato, i controlli di accesso devono essere eseguiti anche se il valore di IRP-RequestorMode> è KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Se questo flag è impostato, il file è un file di paging.
    SL_OPEN_TARGET_DIRECTORY 0x04 Se questo flag è impostato, la directory padre del file deve essere aperta.
    SL_STOP_ON_SYMLINK 0x08 Se questo flag è impostato, l'attraversamento automatico di giunzioni e collegamenti simbolici di I/O Manager viene eliminato, causando l'apertura di giunzioni e collegamenti simbolici per restituire STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Se questo flag è impostato, consente la creazione di un file di sola lettura con l'opzione FILE_DELETE_ON_CLOSE. Questa opzione determina l'eliminazione del file quando l'handle viene chiuso.
    SL_CASE_SENSITIVE 0x80 Se impostato, i confronti dei nomi di file devono fare distinzione tra maiuscole e minuscole.
  • IrpSp->MajorFunction è impostato su IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength è la dimensione in byte del buffer in Irp-AssociatedIrp.SystemBuffer>. Se il valore di Irp*->AssociatedIrp.SystemBuffer è NULL, questo membro deve essere zero.

  • IrpSp->Parameters.Create.FileAttributes è una maschera di bit dei flag di attributo da applicare durante la creazione o l'apertura del file. Gli attributi specificati in modo esplicito vengono applicati solo quando il file viene creato, sostituito o, in alcuni casi, sovrascritto. Per impostazione predefinita, questo valore è FILE_ATTRIBUTE_NORMAL, che qualsiasi altra combinazione di flag o OR di flag compatibili può eseguire l'override. Questo membro corrisponde al parametro FileAttributes a IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options è una maschera di bit di flag che specificano le opzioni da applicare durante la creazione o l'apertura del file e l'azione da eseguire se il file esiste già.

    I 8 bit alti di questo parametro corrispondono al parametro Disposition a IoCreateFileSpecifyDeviceObjectHint.

    I 24 bit bassi di questo membro corrispondono al parametro CreateOptions a IoCreateFileSpecifyDeviceObjectHint. Il filtro del file system e i driver minifilter che eseguono l'analisi dei file (ad esempio programmi antivirus) devono prestare particolare attenzione al flag di FILE_COMPLETE_IF_OPLOCKED. Se questo flag è impostato, il filtro non deve bloccare o ritardare altrimenti l'operazione di IRP_MJ_CREATE.

    Se il flag FILE_COMPLETE_IF_OPLOCKED è impostato nel percorso di pre-creazione (creazione dispatch), il filtro non deve avviare uno dei tipi di operazioni seguenti, perché possono causare interruzioni di oplock:

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    Se un filtro o un minifiltro non può rispettare il flag di FILE_COMPLETE_IF_OPLOCKED, deve completare la richiesta di IRP_MJ_CREATE con STATUS_SHARING_VIOLATION.

    Se il flag FILE_COMPLETE_IF_OPLOCKED è impostato nel percorso di completamento (post-creazione), il filtro deve verificare se il file system ha impostato Irp-IoStatus.Status> sul valore di stato STATUS_OPLOCK_BREAK_IN_PROGRESS. Se questo valore di stato non è impostato, è possibile che il filtro avvii una delle operazioni precedenti nel file. Se questo valore di stato è impostato, l'oplock non è ancora stato interrotto e il filtro non deve avviare alcuna operazione che può causare un'interruzione di oplock. Pertanto, il filtro deve rinviare tutte le operazioni precedenti sul file fino a quando una delle condizioni seguenti è vera:

    • Il proprietario del blocco invia una richiesta di FSCTL_OPLOCK_BREAK_ACKNOWLEDGE al file system.
    • Un componente di sistema diverso dal filtro o minifiltro invia al file system una richiesta di I/O che deve attendere il completamento dell'interruzione di oplock, ad esempio IRP_MJ_READ o IRP_MJ_WRITE. Il filtro o il minifiltro può avviare una delle operazioni precedenti dalla relativa routine di invio (o callback preoperativo) per questa nuova operazione, perché la routine di callback di invio o preoperazione viene inserita in uno stato di attesa fino al completamento dell'interruzione di oplock.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> punta a una struttura ACCESS_STATE contenente il contesto soggetto dell'oggetto dell'oggetto, i tipi di accesso concessi e i tipi di accesso rimanenti desiderati.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> è una struttura ACCESS_MASK che specifica i diritti di accesso richiesti per il file. Per altre informazioni, vedere la descrizione del parametro DesiredAccess in IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess è una maschera bit dei diritti di accesso di condivisione richiesti per il file. Se questo membro è zero, viene richiesto l'accesso esclusivo. Per altre informazioni, vedere la descrizione del parametro ShareAccess in IoCreateFileSpecifyDeviceObjectHint.

Vedi anche

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileOpen

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCheckEaBuffer Validità

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE (Informazioni di riferimento sul kernel WDK)

ZwCreateFile

ZwOpenFile