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
IoCreateFileSpecifyDeviceObjectHint