Funzione NtCreateFile (winternl.h)

Crea un nuovo file o una nuova directory oppure apre un file, un dispositivo, una directory o un volume esistente.

Questa funzione è la modalità utente equivalente alla funzione ZwCreateFile documentata in Windows Driver Kit (WDK).

Sintassi

__kernel_entry NTSTATUS NtCreateFile(
  [out]          PHANDLE            FileHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in]           POBJECT_ATTRIBUTES ObjectAttributes,
  [out]          PIO_STATUS_BLOCK   IoStatusBlock,
  [in, optional] PLARGE_INTEGER     AllocationSize,
  [in]           ULONG              FileAttributes,
  [in]           ULONG              ShareAccess,
  [in]           ULONG              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in]           PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

Parametri

[out] FileHandle

Puntatore a una variabile che riceve l'handle di file se la chiamata ha esito positivo.

[in] DesiredAccess

Valore ACCESS_MASK che esprime il tipo di accesso richiesto dal chiamante al file o alla directory. Il set di flag di DesiredAccess definiti dal sistema determina i diritti di accesso specifici seguenti per gli oggetti file.

Valore Significato
DELETE
Il file può essere eliminato.
FILE_READ_DATA
I dati possono essere letti dal file.
FILE_READ_ATTRIBUTES
Flag FileAttributes, descritti più avanti, possono essere letti.
FILE_READ_EA
Gli attributi estesi associati al file possono essere letti. Questo flag è irrilevante per i driver intermedi e del dispositivo.
READ_CONTROL
È possibile leggere l'elenco di controllo di accesso (ACL) e le informazioni di proprietà associate al file.
FILE_WRITE_DATA
I dati possono essere scritti nel file.
FILE_WRITE_ATTRIBUTES
è possibile scrivere flag FileAttributes.
FILE_WRITE_EA
Gli attributi estesi associati al file possono essere scritti. Questo flag è irrilevante per i driver intermedi e del dispositivo.
FILE_APPEND_DATA
I dati possono essere aggiunti al file.
WRITE_DAC
È possibile scrivere l'elenco di controllo di accesso discrezionale (DACL) associato al file.
WRITE_OWNER
Le informazioni di proprietà associate al file possono essere scritte.
SYNCHRONIZE
L'fileHandle restituito può essere attesa per la sincronizzazione con il completamento di un'operazione di I/O. Se FileHandle non è stato aperto per l'I/O sincrono, questo valore viene ignorato.
FILE_EXECUTE
I dati possono essere letti in memoria dal file usando l'I/O di paging del sistema. Questo flag è irrilevante per i driver intermedi e del dispositivo.
  Non specificare FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATAo FILE_EXECUTE quando si crea o si apre una directory.

I chiamanti di NtCreateFile possono specificare una o una combinazione delle opzioni seguenti, eventualmente usando un or bit per bit con flag compatibili aggiuntivi del elenco di flag DesiredAccess, per qualsiasi oggetto file che non rappresenta un file di directory.

Valore Significato
FILE_GENERIC_READ
STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
FILE_GENERIC_WRITE
STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE
FILE_GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE

Il valore FILE_GENERIC_EXECUTE è irrilevante per i driver intermedi e del dispositivo.

Il STANDARD_RIGHTS_XXX sono valori di sistema predefiniti usati per applicare la sicurezza agli oggetti di sistema.

Per aprire o creare un file di directory, come indicato anche con il parametro CreateOptions, i chiamanti di NtCreateFile possono specificare una o una combinazione delle opzioni seguenti, possibilmente usando un OR bit per bit con uno o più flag compatibili dell'elenco dei flag DesiredAccess precedenti.

Valore Significato
FILE_LIST_DIRECTORY
I file nella directory possono essere elencati.
FILE_TRAVERSE
La directory può essere attraversata, ovvero può far parte del percorso di un file.

[in] ObjectAttributes

Puntatore a una struttura già inizializzata con InitializeObjectAttributes. I membri di questa struttura per un oggetto file includono quanto segue.

Valore Significato
lunghezza ULONG
Specifica il numero di byte di ObjectAttributes dati forniti. Questo valore deve essere almeno sizeof(OBJECT_ATTRIBUTES).
HANDLE RootDirectory
Facoltativamente, specifica un handle per una directory ottenuta da una chiamata precedente a NtCreateFile. Se questo valore è NULL, il membro ObjectName deve essere una specifica di file completa che include il percorso completo del file di destinazione. Se questo valore non èNULL, il membro ObjectName specifica un nome di file relativo a questa directory.
PUNICODE_STRING ObjectName
Punta a una stringa Unicode memorizzata nel buffer che assegna un nome al file da creare o aprire. Questo valore deve essere una specifica di file completa o il nome di un oggetto dispositivo, a meno che non sia il nome di un file relativo alla directory specificata da RootDirectory. Ad esempio, \Device\Floppy1\myfile.dat o \?? \B:\myfile.dat potrebbe essere la specifica completa del file, purché il driver floppy e il file system overlying siano già caricati. Per altre informazioni, vedere nomi, percorsi e spazi dei nomi.
attributi ULONG
Set di flag che controllano gli attributi dell'oggetto file. Questo valore può essere zero o OBJ_CASE_INSENSITIVE, che indica che il codice name-lookup deve ignorare il caso del ObjectName membro invece di eseguire una ricerca di corrispondenza esatta. Il valore OBJ_INHERIT è irrilevante per i driver intermedi e del dispositivo.
PSECURITY_DESCRIPTOR SecurityDescriptor
Facoltativamente, specifica un descrittore di sicurezza da applicare a un file. Gli ACL specificati da un descrittore di sicurezza di questo tipo vengono applicati al file solo quando viene creato. Se il valore è NULL quando viene creato un file, l'ACL inserito nel file dipende dal file system; la maggior parte dei file system propaga una parte di tale ACL dal file di directory padre combinata con l'ACL predefinito del chiamante. I driver di dispositivo e intermedi possono impostare questo membro su NULL.
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
Specifica i diritti di accesso che un server deve essere assegnato al contesto di sicurezza del client. Questo valore non èNULL solo quando viene stabilita una connessione a un server protetto, consentendo al chiamante di controllare quali parti del contesto di sicurezza del chiamante vengono rese disponibili al server e se il server è autorizzato a rappresentare il chiamante.

[out] IoStatusBlock

Puntatore a una variabile che riceve lo stato di completamento finale e informazioni sull'operazione richiesta. In caso di restituzione da NtCreateFile, il membro Information contiene uno dei valori seguenti:

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

Dimensioni di allocazione iniziali 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.

[in] FileAttributes

Attributi 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 è un FILE_ATTRIBUTE_NORMAL, che può essere sottoposto a override da una combinazione ORed di uno o più flag FILE_ATTRIBUTE_xxxx, definiti in Wdm.h e NtDdk.h. Per un elenco di flag che possono essere usati con NtCreateFile, vedere CreateFile.

[in] ShareAccess

Tipo di accesso condiviso che il chiamante desidera utilizzare nel file, come zero o come una o una combinazione dei valori seguenti.

Valore Significato
FILE_SHARE_READ
Il file può essere aperto per l'accesso in lettura tramite chiamate di altri thread a NtCreateFile.
FILE_SHARE_WRITE
Il file può essere aperto per l'accesso in scrittura tramite chiamate di altri thread a NtCreateFile.
FILE_SHARE_DELETE
Il file può essere aperto per eliminare l'accesso tramite chiamate di altri thread a NtCreateFile.

Per altre informazioni, vedere Windows SDK.

[in] CreateDisposition

Specifica le operazioni da eseguire, a seconda che il file esista già, come uno dei valori seguenti.

Valore Significato
FILE_SUPERSEDE
Se il file esiste già, sostituirlo con il file specificato. In caso contrario, creare il file specificato.
FILE_CREATE
Se il file esiste già, non eseguire la richiesta e non creare o aprire il file specificato. In caso contrario, creare il file specificato.
FILE_OPEN
Se il file esiste già, aprirlo invece di creare un nuovo file. In caso contrario, non eseguire la richiesta e non creare un nuovo file.
FILE_OPEN_IF
Se il file esiste già, aprirlo. In caso contrario, creare il file specificato.
FILE_OVERWRITE
Se il file esiste già, aprirlo e sovrascriverlo. In caso contrario, non eseguire la richiesta.
FILE_OVERWRITE_IF
Se il file esiste già, aprirlo e sovrascriverlo. In caso contrario, creare il file specificato.

[in] CreateOptions

Le opzioni da applicare durante la creazione o l'apertura del file, come combinazione compatibile dei flag seguenti.

Valore Significato
FILE_DIRECTORY_FILE
Il file da creare o aprire è un file di directory. Con questo flag, il parametro CreateDisposition deve essere impostato su FILE_CREATE, FILE_OPENo FILE_OPEN_IF. Con questo flag, altri flag compatibili CreateOptions includono solo i flag seguenti: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENTe FILE_OPEN_BY_FILE_ID.
FILE_NON_DIRECTORY_FILE
Il file aperto non deve essere un file di directory o questa chiamata non riesce. L'oggetto file aperto può rappresentare un file di dati, un dispositivo logico, virtuale o fisico o un volume.
FILE_WRITE_THROUGH
Le applicazioni che scrivono dati nel file devono effettivamente trasferire i dati nel file prima che qualsiasi operazione di scrittura richiesta venga considerata completata. Questo flag viene impostato automaticamente se è impostato il FILE_NO_INTERMEDIATE _BUFFERING flag CreateOptions flag.
FILE_SEQUENTIAL_ONLY
Tutti gli accessi al file sono sequenziali.
FILE_RANDOM_ACCESS
Gli accessi al file possono essere casuali, quindi non devono essere eseguite operazioni sequenziali read-ahead sul file da FSD o dal sistema.
FILE_NO_INTERMEDIATE_BUFFERING
Il file non può essere memorizzato nella cache o memorizzato nel buffer interno di un driver. Questo flag non è compatibile con il flag diFILE_APPEND_DATA DesiredAccess .
FILE_SYNCHRONOUS_IO_ALERT
Tutte le operazioni sul file vengono eseguite in modo sincrono. Qualsiasi attesa per conto del chiamante è soggetta a terminazione prematura dagli avvisi. Questo flag fa anche in modo che il sistema di I/O mantenga il contesto di posizione del file. Se questo flag è impostato, è necessario impostare anche il flag DesiredAccessSYNCHRONIZE.
FILE_SYNCHRONOUS_IO_NONALERT
Tutte le operazioni sul file vengono eseguite in modo sincrono. Le attese nel sistema per sincronizzare l'accodamento di I/O e il completamento non sono soggetti ad avvisi. Questo flag fa anche in modo che il sistema di I/O mantenga il contesto di posizione del file. Se questo flag è impostato, è necessario impostare anche il flag DesiredAccessSYNCHRONIZE.
FILE_CREATE_TREE_CONNECTION
Creare una connessione ad albero per questo file per aprirlo in rete. Questo flag non viene usato dai driver intermedi e del dispositivo.
FILE_NO_EA_KNOWLEDGE
Se gli attributi estesi in un file esistente aperto indicano che il chiamante deve comprendere gli EA per interpretare correttamente il file, non eseguire questa richiesta perché il chiamante non riconosce come gestire le EA. Questo flag è irrilevante per i driver intermedi e del dispositivo.
FILE_OPEN_REPARSE_POINT
Aprire un file con un punto reparse e ignorare l'elaborazione normale del punto di analisi per il file. Per altre informazioni, vedere la sezione Osservazioni.
FILE_DELETE_ON_CLOSE
Eliminare il file quando viene passato l'ultimo handle a NtClose. Se questo flag è impostato, il flag DELETE deve essere impostato nel parametro desiredAccess .
FILE_OPEN_BY_FILE_ID
Il nome file specificato dal parametro ObjectAttributes include il numero di riferimento del file a 8 byte per il file. Questo numero viene assegnato da e specifico al file system specifico. Se il file è un reparse point, il nome del file includerà anche il nome di un dispositivo. Si noti che il file system FAT non supporta questo flag. Questo flag non viene usato dai driver intermedi e del dispositivo.
FILE_OPEN_FOR_BACKUP_INTENT
Il file viene aperto per finalità di backup. Pertanto, il sistema deve verificare la presenza di determinati diritti di accesso e concedere al chiamante l'accesso appropriato al file prima di controllare il parametro DesiredAccess con il descrittore di sicurezza del file. Questo flag non viene usato dai driver intermedi e del dispositivo.
FILE_RESERVE_OPFILTER
Questo flag consente a un'applicazione di richiedere un blocco opportunistico di filtro ([Blocchi opportunistici](/windows/win32/fileio/opportunistic-locks)) per impedire ad altre applicazioni di ricevere violazioni di condivisione. Se sono già presenti handle aperti, la richiesta di creazione avrà esito negativo con STATUS_OPLOCK_NOT_GRANTED. Per altre informazioni, vedere la sezione Osservazioni.
FILE_OPEN_REQUIRING_OPLOCK
Il file viene aperto e viene richiesto un blocco opportunistico ([Blocchi opportunistici](/windows/win32/fileio/opportunistic-locks)) nel file come singola operazione atomica. Il file system verifica la presenza di oplock prima di eseguire l'operazione di creazione e non riuscirà a creare con un codice restituito di STATUS_CANNOT_BREAK_OPLOCK se il risultato sarebbe interrompere un oplock esistente. Per altre informazioni, vedere la sezione Osservazioni.Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Questo flag non è supportato.

Questo flag è supportato nei file system seguenti: NTFS, FAT ed exFAT.

FILE_COMPLETE_IF_OPLOCKED
Completare immediatamente questa operazione con un codice di esito positivo alternativo di STATUS_OPLOCK_BREAK_IN_PROGRESS se il file di destinazione è bloccato, anziché bloccare il thread del chiamante. Se il file è oplocked ([Opportunistic Locks](/windows/win32/fileio/opportunistic-locks)), un altro chiamante ha già accesso al file. Questo flag non viene usato dai driver intermedi e del dispositivo.

[in] EaBuffer

Puntatore a un buffer EA usato per passare attributi estesi.

Nota alcuni file system potrebbero non supportare buffer EA.
 

[in] EaLength

Lunghezza del buffer EA.

Valore restituito

NtCreateFile restituisce STATUS_SUCCESS o uno stato di errore appropriato. Se restituisce uno stato di errore, il chiamante può trovare altre informazioni sulla causa dell'errore controllando il IoStatusBlock. Per semplificare questa verifica, un'applicazione può usare le macro NT_SUCCESS, NT_ERRORe NT_WARNING.

Osservazioni

L'handle, fornito da NtCreateFile, può essere usato dalle chiamate successive per modificare i dati all'interno del file o lo stato o gli attributi dell'oggetto file.

Esistono due modi alternativi per specificare il nome del file da creare o aprire con NtCreateFile:

  • Come nome percorso completo, fornito nel membro ObjectName dell'input ObjectAttributes
  • Come percorso relativo al file di directory rappresentato dall'handle nel rootDirectory membro dell'input ObjectAttributes

Alcuni flag DesiredAccess e combinazioni di flag hanno gli effetti seguenti:

  • Affinché un chiamante sincronizzi un completamento di I/O in attesa del fileHandle restituito, è necessario impostare il flag SYNCHRONIZE .
  • Il passaggio di zero a desiredFlags non è valido.
  • Se vengono impostati solo i flag FILE_APPEND_DATA e SYNCHRONIZE, il chiamante può scrivere solo alla fine del file e tutte le informazioni sull'offset sulle scritture nel file vengono ignorate. Tuttavia, il file viene esteso automaticamente in base alle esigenze per questo tipo di operazione di scrittura.
  • L'impostazione del flag FILE_WRITE_DATA per un file consente anche di scrivere oltre la fine del file. Il file viene esteso automaticamente anche per questo tipo di scrittura.
  • Se vengono impostati solo i flag FILE_EXECUTE e SYNCHRONIZE, il chiamante non può leggere o scrivere direttamente dati nel file usando l'FileHandle restituito, ovvero tutte le operazioni sul file vengono eseguite tramite il cercapersone di sistema in risposta a istruzioni e accessi ai dati.

Il parametro ShareAccess determina se i thread separati possono accedere allo stesso file, possibilmente contemporaneamente. A condizione che entrambi i file opener abbiano il privilegio di accedere a un file nel modo specificato, il file può essere aperto e condiviso correttamente. Se il chiamante originale di NtCreateFile non specifica FILE_SHARE_READ, FILE_SHARE_WRITEo FILE_SHARE_DELETE, non è possibile eseguire altre operazioni aperte sul file; ovvero, al chiamante originale viene concesso l'accesso esclusivo al file.

Affinché un file condiviso venga aperto correttamente, il parametro DesiredAccess richiesto al file deve essere compatibile sia con DesiredAccess che con ShareAccess specifiche di tutte le aperte precedenti che non sono ancora state rilasciate con NtClose. Ovvero, il parametro DesiredAccess specificato per NtCreateFile per un determinato file non deve essere in conflitto con gli accessi non consentiti da altri opener del file.

Il valore CreateDispositionFILE_SUPERSEDE richiede che il chiamante abbia DELETE l'accesso a un oggetto file esistente. In tal caso, una chiamata riuscita a NtCreateFile con FILE_SUPERSEDE in un file esistente elimina effettivamente tale file e quindi la ricrea. Ciò implica che, se il file è già stato aperto da un altro thread, il file è stato aperto specificando un parametro ShareAccess con il flag FILE_SHARE_DELETE impostato.

Si noti che questo tipo di eliminazione è coerente con lo stile POSIX di sovrascrivere i file. I valori CreateDispositionFILE_OVERWRITE_IF e FILE_SUPERSEDE sono simili. Se ZwCreateFile viene chiamato con un file esistente e uno di questi valori CreateDisposition, il file viene sostituito.

La sovrascrittura di un file è semanticamente equivalente a un'operazione di sostituzione, ad eccezione dei seguenti:

  • Il chiamante deve avere accesso in scrittura al file, anziché eliminare l'accesso. Ciò implica che, se il file è già stato aperto da un altro thread, ha aperto il file con il flag di FILE_SHARE_WRITE impostato nel parametro di input ShareAccess.
  • Gli attributi di file specificati sono logicamente ORed con quelli già presenti nel file. Ciò implica che, se il file è già stato aperto da un altro thread, un chiamante successivo di NtCreateFile non può disabilitare i flag FileAttributes esistenti ma può abilitare flag aggiuntivi per lo stesso file. Si noti che questo stile di sovrascrittura dei file è coerente con i sistemi operativi MS-DOS, Windows 3.1 e OS/2.

Il valore CreateOptionsFILE_DIRECTORY_FILE specifica che il file da creare o aprire è un file di directory. Quando viene creato un file di directory, il file system crea una struttura appropriata sul disco per rappresentare una directory vuota per la struttura su disco di quel particolare file system. Se questa opzione è stata specificata e il file specificato da aprire non è un file di directory o se il chiamante ha specificato un incoerente CreateOptions o valore createDisposition, la chiamata a NtCreateFile ha esito negativo.

Il flag CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING impedisce al file system di eseguire qualsiasi buffering intermedio per conto del chiamante. Se si specifica questo valore, alcune restrizioni sui parametri del chiamante vengono applicate ad altre routine NtXXXFile, incluse le seguenti:

  • Qualsiasi ByteOffset facoltativo passato al NtReadFile o funzione NtWriteFile deve essere un integrale delle dimensioni del settore.
  • La lunghezza passata a NtReadFile o NtWriteFile, deve essere un integrale delle dimensioni del settore. Si noti che la specifica di un'operazione di lettura in un buffer la cui lunghezza è esattamente la dimensione del settore può comportare il trasferimento di un numero minore di byte significativi a tale buffer se la fine del file è stata raggiunta durante il trasferimento.
  • I buffer devono essere modificati in base al requisito di allineamento del dispositivo sottostante. Queste informazioni possono essere ottenute chiamando NtCreateFile per ottenere un handle per l'oggetto file che rappresenta il dispositivo fisico e quindi chiamando NtQueryInformationFile con tale handle. Per un elenco dei valori di FILE_XXX_ALIGNMENT di sistema, vedere la documentazione di Windows SDK.
  • Le chiamate a NtSetInformationFile con il parametro FileInformationClass impostato su FilePositionInformation devono specificare un offset integrale delle dimensioni del settore.
Il CreateOptionsFILE_SYNCHRONOUS_IO_ALERT e i flag FILE_SYNCHRONOUS_IO_NONALERT, che si escludono a vicenda come suggerisce i nomi, specificare che tutte le operazioni di I/O sul file devono essere sincrone, purché si verifichino tramite l'oggetto file a cui fa riferimento il FileHandle restituito. Tutte le operazioni di I/O in un file di questo tipo vengono serializzate in tutti i thread usando l'handle restituito. Con uno di questi CreateOptions, il flagDESIREDAccessSYNCHRONIZE deve essere impostato in modo che Gestione I/O usi l'oggetto file come oggetto di sincronizzazione. Con uno di questi CreateOptions impostato, Gestione I/O mantiene il "contesto di posizione file" per l'oggetto file, un offset interno e di posizione del file corrente. Questo offset può essere usato nelle chiamate a NtReadFile e NtWriteFile. È anche possibile eseguire query o impostare la posizione con NtQueryInformationFile e NtSetInformationFile.

Se il parametro CreateOptions specifica il flag di FILE_OPEN_REPARSE_POINT e NtCreateFile apre un file con un reparse point, l'elaborazione reparse normale non viene eseguita e NtCreateFile tenta di aprire direttamente il file del reparse point. Se il flag di FILE_OPEN_REPARSE_POINT non viene specificato, viene eseguita la normale elaborazione del punto di analisi per il file. In entrambi i casi, se l'operazione di apertura ha avuto esito positivo, NtCreateFile restituisce STATUS_SUCCESS; in caso contrario, un codice di errore. La funzione NtCreateFile non restituisce mai STATUS_REPARSE.

Il flag di FILE_OPEN_REQUIRING_OPLOCK del parametro CreateOptions elimina il tempo tra l'apertura del file e la richiesta di un oplock che potrebbe consentire a terze parti di aprire il file, causando una violazione di condivisione. Un'applicazione può usare il flag FILE_OPEN_REQUIRING_OPLOCK con NtCreateFile e quindi richiedere qualsiasi oplock. In questo modo, un proprietario di oplock riceverà una notifica di qualsiasi richiesta aperta successiva che causa una violazione della condivisione.

In Windows 7, se nel file esistono altri handle quando un'applicazione usa questo flag, l'operazione di creazione avrà esito negativo con STATUS_OPLOCK_NOT_GRANTED. Questa restrizione non esiste più a partire da Windows 8.

Se questa operazione di creazione interrompe un oplock già esistente nel file, l'impostazione del flag FILE_OPEN_REQUIRING_OPLOCK causerà l'esito negativo dell'operazione di creazione con STATUS_CANNOT_BREAK_OPLOCK. L'oplock esistente non verrà interrotto da questa operazione di creazione.

Un'applicazione che usa questo flag deve richiedere un oplock dopo l'esito positivo della chiamata oppure tutti i tentativi successivi di aprire il file verranno bloccati senza il vantaggio della normale elaborazione di oplock. Analogamente, se questa chiamata ha esito positivo ma la richiesta oplock successiva ha esito negativo, un'applicazione che usa questo flag deve chiudere il relativo handle dopo aver rilevato che la richiesta di oplock non è riuscita.

Nota Il flag FILE_OPEN_REQUIRING_OPLOCK è disponibile in Windows 7, Windows Server 2008 R2 e versioni successive per i file system seguenti: NTFS, FAT ed exFAT.
 

Il flag FILE_RESERVE_OPFILTERCreateOptions consente a un'applicazione di richiedere un oplock di livello 1, batch o filtro per impedire ad altre applicazioni di ricevere violazioni di condivisione. Tuttavia, in termini pratici, il FILE_RESERVE_OPFILTER è utile solo per gli oplock di filtro. Per usarlo, è necessario completare i passaggi seguenti:

  1. Eseguire una richiesta di creazione con CreateOptions di FILE_RESERVE_OPFILTER, DesiredAccess di esattamente FILE_READ_ATTRIBUTESe ShareAccess di esattamente (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE). I possibili errori sono i seguenti:
    • Se sono già presenti handle aperti, la richiesta di creazione ha esito negativo con STATUS_OPLOCK_NOT_GRANTEDe anche il successivo oplock richiesto ha esito negativo.
    • Se si apre con più accesso rispetto a FILE_READ_ATTRIBUTES o meno condivisione di (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), la richiesta ha esito negativo con STATUS_OPLOCK_NOT_GRANTED.
  2. Se la richiesta di creazione ha esito positivo, richiedere un oplock.
  3. Aprire un altro handle per il file per eseguire operazioni di I/O.
Il passaggio 3 rende questo pratico solo per gli oplock di filtro. L'handle aperto nel passaggio 3 può avere un DesiredAccess che contiene un massimo di (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL) e non interrompe ancora un oplock di filtro. Tuttavia, qualsiasi DesiredAccess maggiore di (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE) interrompe un oplock di livello 1 o Batch e rende il flag di FILE_RESERVE_OPFILTER inutilizzabile per questi tipi di oplock.

NTFS è l'unico file system Microsoft che implementa FILE_RESERVE_OPFILTER.

Per altre informazioni sugli oplock, vedere Blocchi opportunistici.

Si noti che il file di intestazione WDK NtDef.h è necessario per molte definizioni costanti, nonché per la macro InitializeObjectAttributes. È anche possibile usare le funzioni di LoadLibrary e GetProcAd dress per collegare dinamicamente a NtDll.dll.

Fabbisogno

Requisito Valore
piattaforma di destinazione Finestre
intestazione winternl.h
libreria ntdll.lib
dll ntdll.dll