Condividi tramite


Funzione IoCreateFileSpecifyDeviceObjectHint (ntddk.h)

La routine IoCreateFileSpecifyDeviceObjectHint viene usata dai driver di filtro del file system per inviare una richiesta di creazione solo ai filtri seguenti a un oggetto dispositivo specificato e al file system.

Sintassi

NTSTATUS IoCreateFileSpecifyDeviceObjectHint(
  [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              Disposition,
  [in]           ULONG              CreateOptions,
  [in, optional] PVOID              EaBuffer,
  [in]           ULONG              EaLength,
  [in]           CREATE_FILE_TYPE   CreateFileType,
  [in, optional] PVOID              InternalParameters,
  [in]           ULONG              Options,
  [in, optional] PVOID              DeviceObject
);

Parametri

[out] FileHandle

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

[in] DesiredAccess

Maschera di bit di flag che specificano il tipo di accesso richiesto dal chiamante per il file o la directory. Il set di flag di DesiredAccess definiti dal sistema determina i diritti di accesso specifici seguenti per gli oggetti file.

Flag DesiredAccess Significato
CANCELLARE 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 (EA) associati al file possono essere letti.
READ_CONTROL L'elenco di controllo di accesso (ACL) e le informazioni di proprietà associate al file possono essere lette.
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.
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.
SINCRONIZZARE Il chiamante può sincronizzare il completamento di un'operazione di I/O attendendo che il FileHandle restituito sia impostato sullo stato Segnalato. Questo flag deve essere impostato se è impostato il flag FILE_SYNCHRONOUS_IO_ALERT CreateOptions o FILE_SYNCHRONOUS_IO_NONALERT.
FILE_EXECUTE I dati possono essere letti in memoria dal file usando l'I/O di paging del sistema.

I chiamanti di IoCreateFileSpecifyDeviceObjectHint possono specificare una o una combinazione delle opzioni seguenti, possibilmente ORed con flag compatibili aggiuntivi dall'elenco precedente di flagDesiredAccess, per qualsiasi oggetto file che non rappresenta un file di directory:

DesiredAccess ai valori dei file Esegue il mapping ai flag DesiredAccess
GENERIC_READ STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA e SYNCHRONIZE.
GENERIC_WRITE STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA e SYNCHRONIZE.
GENERIC_EXECUTE STANDARD_RIGHTS_EXECUTE, SYNCHRONIZE, FILE_READ_ATTRIBUTES e FILE_EXECUTE.

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

Se è impostato il flag CreateOptions FILE_DIRECTORY_FILE, i chiamanti di IoCreateFileSpecifyDeviceObjectHint possono specificare una o una combinazione dei flag seguenti, possibilmente ORed con uno o più flag compatibili dall'elenco precedente di flagDesiredAccess.

DesiredAccess ai valori della directory 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.

I flag FILE_READ_DATA, FILE_WRITE_DATA, FILE_EXECUTE e FILE_APPEND_DATA DesiredAccess non sono compatibili con la creazione o l'apertura di un file di directory.

[in] ObjectAttributes

Puntatore a una struttura OBJECT_ATTRIBUTES già inizializzata dalla routine InitializeObjectAttributes. Se il chiamante è in esecuzione nel contesto del processo di sistema, questo parametro (ObjectAttributes) può essere NULL. In caso contrario, il chiamante deve impostare l'attributo OBJ_KERNEL_HANDLE nella chiamata alla routine InitializeObjectAttributes. I membri della struttura OBJECT_ATTRIBUTES per un oggetto file includono quanto segue.

Membro Valore
ULONGLength Specifica il numero di byte di ObjectAttributes dati forniti. Questo valore deve essere almeno sizeof(OBJECT_ATTRIBUTES).
PUNICODE_STRING ObjectName Puntatore a una stringa Unicode memorizzata nel buffer che denomina il file da creare o aprire. Questo valore deve essere una specifica di file completa, 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. Si noti che \?? sostituisce \DosDevices come nome dello spazio dei nomi dell'oggetto Win32. \DosDevices funzionerà ancora, ma \?? viene convertito più velocemente dal gestore oggetti.
HANDLERootDirectory Facoltativamente, specifica un handle per una directory ottenuta da una chiamata precedente a IoCreateFileSpecifyDeviceObjectHint. 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.
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.
ULONGAttributes Set di flag che controlla gli attributi dell'oggetto file. Se il chiamante è in esecuzione nel contesto del processo di sistema, questo parametro può essere zero. In caso contrario, il chiamante deve impostare il flag OBJ_KERNEL_HANDLE. Il chiamante può anche impostare facoltativamente il flag di OBJ_CASE_INSENSITIVE, che indica che il codice di ricerca del nome deve ignorare il caso di ObjectName anziché eseguire una ricerca di corrispondenza esatta.

[out] IoStatusBlock

Puntatore a una struttura IO_STATUS_BLOCK che riceve lo stato di completamento finale e informazioni sull'operazione richiesta. In caso di restituzione da IoCreateFileSpecifyDeviceObjectHint, 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

Facoltativamente, specifica le 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

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 può essere sottoposto a override da qualsiasi altro flag o da una combinazione ORed di flag compatibili. I flag FileAttributes possibili includono quanto segue.

Flag FileAttributes Significato
FILE_ATTRIBUTE_NORMAL È necessario creare un file con attributi standard.
FILE_ATTRIBUTE_READONLY È necessario creare un file di sola lettura.
FILE_ATTRIBUTE_HIDDEN Deve essere creato un file nascosto.
FILE_ATTRIBUTE_SYSTEM È necessario creare un file di sistema.
FILE_ATTRIBUTE_ARCHIVE Il file deve essere contrassegnato in modo che venga archiviato.
FILE_ATTRIBUTE_TEMPORARY È necessario creare un file temporaneo.

[in] ShareAccess

Specifica il tipo di accesso condiviso al file che il chiamante desidera, come zero, o uno o una combinazione dei flag seguenti. Per richiedere l'accesso esclusivo, impostare questo parametro su zero. Se il flag IO_IGNORE_SHARE_ACCESS_CHECK viene specificato nel parametro Options, il gestore di I/O ignora questo parametro. Tuttavia, il file system potrebbe comunque eseguire controlli di accesso. È quindi importante specificare la modalità di condivisione desiderata per questo parametro, anche quando si usa il flag IO_IGNORE_SHARE_ACCESS_CHECK. Per la maggiore probabilità di evitare errori di violazione di condivisione, specificare tutti i flag di accesso di condivisione seguenti.

Flag di ShareAccess Significato
FILE_SHARE_READ Il file può essere aperto per l'accesso in lettura da altri thread.
FILE_SHARE_WRITE Il file può essere aperto per l'accesso in scrittura da altri thread.
FILE_SHARE_DELETE Il file può essere aperto per l'eliminazione dell'accesso da parte di altri thread.

[in] Disposition

Specifica un valore che determina l'azione da eseguire, a seconda che il file esista già. Il valore può essere uno di quelli descritti di seguito.

Valori di eliminazione 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

Specifica le opzioni da applicare durante la creazione o l'apertura del file. Queste opzioni vengono specificate come combinazione compatibile dei flag seguenti.

Flag CreateOptions Significato
FILE_DIRECTORY_FILE Il file da creare o aprire è un file di directory. Se questo flag è impostato, il parametro Disposition deve essere impostato su uno dei FILE_CREATE, FILE_OPEN o FILE_OPEN_IF. Questo flag è compatibile con i flag di CreateOptions seguenti: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT e FILE_OPEN_BY_FILE_ID.
FILE_NON_DIRECTORY_FILE Il file aperto non deve essere un file di directory o questa chiamata avrà esito negativo. L'oggetto file aperto deve rappresentare un file di dati.
FILE_WRITE_THROUGH I servizi di sistema, gli FSD e i driver che scrivono dati nel file devono effettivamente trasferire i dati nel file prima che qualsiasi operazione di scrittura richiesta venga considerata completa.
FILE_SEQUENTIAL_ONLY Tutti gli accessi al file saranno 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 di FILE_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 flag DesiredAccess SYNCHRONIZE.
FILE_SYNCHRONOUS_IO_NONALERT Tutte le operazioni sul file vengono eseguite in modo sincrono. Le attese presenti nel sistema per sincronizzare l'accodamento e il completamento di I/O 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 flag DesiredAccess SYNCHRONIZE.
FILE_CREATE_TREE_CONNECTION Creare una connessione ad albero per questo file per aprirlo in rete.
FILE_COMPLETE_IF_OPLOCKED Completare immediatamente questa operazione con un codice di esito positivo alternativo se il file di destinazione è bloccato, anziché bloccare il thread del chiamante. Se il file è bloccato, un altro chiamante ha già accesso al file in rete.
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.
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 di seguito.
FILE_DELETE_ON_CLOSE Eliminare il file quando viene passato l'ultimo handle a ZwClose.
FILE_OPEN_BY_FILE_ID Il nome file specificato nel parametro ObjectAttributes include il numero di riferimento del file a 8 byte per il file. Questo numero viene assegnato dal file system ed è specifico del file system. Se il file è un reparse point, il nome del file include anche il nome di un dispositivo. Nota: il file system FAT non supporta FILE_OPEN_BY_FILE_ID.
FILE_OPEN_FOR_BACKUP_INTENT Il file viene aperto per finalità di backup, di conseguenza, il sistema deve verificare la presenza di determinati diritti di accesso e concedere al chiamante gli accessi appropriati al file prima di controllare l'input DesiredAccess rispetto al descrittore di sicurezza del file.
FILE_OPEN_REQUIRING_OPLOCK Il file viene aperto e viene richiesto un blocco opportunistico (oplock) nel file come singola operazione atomica. Il file system verifica la presenza di oplock prima di eseguire l'operazione di creazione e l'operazione di creazione non riesce con un codice restituito di STATUS_CANNOT_BREAK_OPLOCK se la creazione interrompe un oplock esistente.
FILE_RESERVE_OPFILTER Questo flag consente a un'applicazione di richiedere un blocco opportunistico di filtro (oplock) per impedire ad altre applicazioni di ricevere violazioni di condivisione. Se sono già presenti handle aperti, la richiesta di creazione ha esito negativo con STATUS_OPLOCK_NOT_GRANTED. Per altre informazioni, vedere la sezione Osservazioni seguente.

[in, optional] EaBuffer

Puntatore a un chiamante fornito FILE_FULL_EA_INFORMATIONbuffer strutturato contenente informazioni sull'attributo esteso (EA) da applicare al file.

[in] EaLength

Lunghezza, in byte, di EaBuffer.

[in] CreateFileType

I driver devono impostare questo parametro su CreateFileTypeNone.

[in, optional] InternalParameters

I driver devono impostare questo parametro su NULL.

[in] Options

Specifica le opzioni da utilizzare durante la creazione della richiesta di creazione. Nella tabella seguente sono elencate le opzioni disponibili.

Flag di opzioni Significato
IO_FORCE_ACCESS_CHECK Indica che il gestore di I/O deve controllare la richiesta di creazione rispetto al descrittore di sicurezza del file.
IO_IGNORE_SHARE_ACCESS_CHECK Indica che il gestore di I/O non deve eseguire controlli di accesso alla condivisione sull'oggetto file dopo la creazione. Tuttavia, il file system potrebbe comunque eseguire questi controlli.

[in, optional] DeviceObject

Puntatore all'oggetto dispositivo a cui inviare la richiesta di creazione. L'oggetto dispositivo deve essere un oggetto dispositivo filtro o file system nello stack di driver del file system per il volume in cui risiede il file o la directory. Questo parametro è facoltativo e può essere NULL. Se questo parametro è NULL, la richiesta verrà inviata all'oggetto dispositivo nella parte superiore dello stack di driver.

Valore restituito

IoCreateFileSpecifyDeviceObjectHint restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio uno dei seguenti:

Codice restituito Descrizione
STATUS_INVALID_DEVICE_OBJECT_PARAMETER L'DeviceObject specificato non è collegato allo stack di driver del file system per il volume specificato nel nome del file o della directory. Questo errore può verificarsi anche se il nome contiene un punto reparse diverso da un punto di montaggio.
STATUS_MOUNT_POINT_NOT_RESOLVED Il nome del file o della directory contiene un punto di montaggio che si risolve in un volume diverso da quello a cui è collegato il DeviceObject specificato.
STATUS_OBJECT_PATH_SYNTAX_BAD

IoCreateFileSpecifyDeviceObjectHint può restituire STATUS_FILE_LOCK_CONFLICT come valore restituito o nel membro Status della struttura IO_STATUS_BLOCK a cui punta il parametro IoStatusBlock. Ciò si verifica solo se il file di log NTFS è pieno e si verifica un errore durante IoCreateFileSpecifyDeviceObjectHint tenta di gestire questa situazione.

Osservazioni

Questa routine viene utilizzata dai driver di filtro del file system per inviare una richiesta di creazione solo ai filtri seguenti a un oggetto dispositivo specificato e al file system. I filtri collegati sopra l'oggetto dispositivo specificato nello stack di driver non ricevono la richiesta di creazione.

La routine IoCreateFileEx di Windows Vista è simile alla routine IoCreateFileSpecifyDeviceObjectHint, ma offre una maggiore funzionalità rispetto alla routine IoCreateFileSpecifyDeviceObjectHint, incluso l'accesso a parametri di creazione aggiuntivi e informazioni sulle transazioni.

Se usi la routine IoCreateFileEx anziché la routine IoCreateFileSpecifyDeviceObjectHint, tieni presente che il parametro DriverContext della routine IoCreateFileSpecifyDeviceObjectHint è stata spostata nella routine DeviceObjectHint della struttura IO_DRIVER_CREATE_CONTEXT. La struttura IO_DRIVER_CREATE_CONTEXT viene passata alla routine IoCreateFileEx tramite il relativo parametro DriverContext.

I driver di filtro del file system chiamano IoCreateFileSpecifyDeviceObjectHint per inviare una richiesta di creazione solo a un oggetto dispositivo specificato, ai filtri allegati e al file system. I filtri collegati sopra l'oggetto dispositivo specificato nello stack di driver non ricevono la richiesta di creazione. Lo stesso vale true per eventuali richieste di pulizia o chiusura nell'oggetto file creato da IoCreateFileSpecifyDeviceObjectHint.

Esistono due modi alternativi per specificare il nome del file da creare o aprire usando IoCreateFileSpecifyDeviceObjectHint:

  1. Come nome percorso completo, fornito nel membro ObjectName dell'input ObjectAttributes

  2. Come percorso relativo al file di directory rappresentato dall'handle nel membro RootDirectory del ObjectAttributes di input

Qualsiasi handle ottenuto da IoCreateFileSpecifyDeviceObjectHint deve essere rilasciato chiamando ZwClose.

Le routine del driver eseguite in un contesto di processo diverso da quello del processo di sistema devono impostare l'attributo OBJ_KERNEL_HANDLE per il ObjectAttributes parametro di IoCreateFileSpecifyDeviceObjectHint. Ciò limita l'uso dell'handle restituito da IoCreateFileSpecifyDeviceObjectHint ai processi in esecuzione in modalità kernel. In caso contrario, l'handle può essere accessibile dal processo nel cui contesto è in esecuzione il driver.

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

  • Affinché un chiamante sincronizzi un completamento di I/O attendendo che il restituito FileHandle sia impostato sullo stato Segnalato, è necessario impostare il flag SYNCHRONIZE.

  • Se vengono impostati solo i flag FILE_APPEND_DATA e SYNCHRONIZE, il chiamante può scrivere solo alla fine del file e le informazioni di offset relative alle scritture nel file vengono ignorate. Tuttavia, il file verrà esteso automaticamente in base alle esigenze per questo tipo di operazione di scrittura.

  • L'impostazione del flag di 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 utilizzando il FileHandle restituito; ovvero tutte le operazioni sul file vengono eseguite tramite il cercapersone di sistema in risposta agli accessi a istruzioni e 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 IoCreateFileSpecifyDeviceObjectHint non specifica FILE_SHARE_READ, FILE_SHARE_WRITE o FILE_SHARE_DELETE, non è possibile eseguire altre operazioni aperte sul file, ovvero il chiamante originale ha accesso esclusivo al file.

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

Se IO_IGNORE_SHARE_ACCESS_CHECK viene specificato nel parametro Opzioni, il gestore di I/O ignora il parametro ShareAccess. Tuttavia, il file system potrebbe comunque eseguire controlli di accesso. È quindi importante specificare la modalità di condivisione desiderata per il parametro ShareAccess, anche quando si usa il flag IO_IGNORE_SHARE_ACCESS_CHECK.

Il valore Disposition FILE_SUPERSEDE richiede che il chiamante disponga dell'accesso DELETE a un oggetto file esistente. In tal caso, una chiamata riuscita a IoCreateFileSpecifyDeviceObjectHint con FILE_SUPERSEDE in un file esistente elimina effettivamente il file e quindi lo 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 Disposition FILE_OVERWRITE_IF e FILE_SUPERSEDE sono simili. Se IoCreateFileSpecifyDeviceObjectHint viene chiamato con un file esistente e uno di questi valori Disposition, il file verrà 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, il file è stato aperto con il flag FILE_SHARE_WRITE impostato nell'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 IoCreateFileSpecifyDeviceObjectHint non può disabilitare i flag FileAttributes esistenti ma può abilitare flag aggiuntivi per lo stesso file.

Il valore FILE_DIRECTORY_FILE CreateOptions 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 di Disposition, la chiamata a IoCreateFileSpecifyDeviceObjectHint avrà esito negativo.

Il flag FILE_NO_INTERMEDIATE_BUFFERING CreateOptions 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 altri Zw.. Routine di file, tra cui:

  • Qualsiasi valore offset di byte passato a ZwReadFile o ZwWriteFile deve essere un multiplo delle dimensioni del settore del dispositivo sottostante.

  • Il Length passato a ZwReadFile o ZwWriteFile deve essere un multiplo 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 allineati in base al requisito di allineamento del dispositivo sottostante. Queste informazioni possono essere ottenute chiamando IoCreateFileSpecifyDeviceObjectHint per ottenere un handle per l'oggetto file che rappresenta il dispositivo fisico e quindi chiamando ZwQueryInformationFile con tale handle. Per un elenco dei valori di FILE_XXX_ALIGNMENT di sistema, vedere DEVICE_OBJECT.

  • Le chiamate a ZwSetInformationFile con il parametro FileInformationClass impostato su FilePositionInformation devono specificare un offset multiplo delle dimensioni del settore.

L'CreateOptions si escludono a vicenda, FILE_SYNCHRONOUS_IO_ALERT e FILE_SYNCHRONOUS_IO_NONALERT, 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. 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 flag DesiredAccess SYNCHRONIZE deve essere impostato in modo che Gestione I/O userà 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 ZwReadFile e ZwWriteFile. È anche possibile eseguire query sulla posizione chiamando ZwQueryInformationFileo impostando ZwSetInformationFile.

Se il flag FILE_OPEN_REPARSE_POINT CreateOptions non è specificato e IoCreateFileSpecifyDeviceObjectHint tenta di aprire un file con un punto di reparse, viene eseguita la normale elaborazione dei punti di ripristino per il file. Se, d'altra parte, viene specificato il flag di FILE_OPEN_REPARSE_POINT, l'elaborazione di reparse normale non viene eseguita e IoCreateFileSpecifyDeviceObjectHint tenta di aprire direttamente il file del punto di analisi. In entrambi i casi, se l'operazione di apertura ha avuto esito positivo, IoCreateFileSpecifyDeviceObjectHint restituisce STATUS_SUCCESS; in caso contrario, la routine restituisce un codice di errore NTSTATUS. IoCreateFileSpecifyDeviceObjectHint non restituisce mai STATUS_REPARSE.

Il flag CreateOptions FILE_OPEN_REQUIRING_OPLOCK elimina il tempo tra l'apertura del file e la richiesta di un oplock che potrebbe consentire a terze parti di aprire il file e ottenere una violazione di condivisione. Un'applicazione può usare il flag FILE_OPEN_REQUIRING_OPLOCK in IoCreateFileSpecifyDeviceObjectHint 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 il flag FILE_OPEN_REQUIRING_OPLOCK, 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 dell'elaborazione tipica 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.

Il flag FILE_OPEN_REQUIRING_OPLOCK è disponibile in Windows 7, Windows Server 2008 R2 e nei sistemi operativi Windows successivi. I file system Microsoft che implementano questo flag in Windows 7 sono NTFS, FAT ed exFAT.

Il FILE_RESERVE_OPFILTER flag CreateOptions consente a un'applicazione di richiedere un oplock di livello 1, batch o filtro per impedire che altre applicazioni ottengano violazioni di condivisione. Tuttavia, FILE_RESERVE_OPFILTER è praticamente 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_ATTRIBUTES e ShareAccess di esattamente FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.

    • Se sono già presenti handle aperti, la richiesta di creazione avrà esito negativo con STATUS_OPLOCK_NOT_GRANTED e anche il successivo oplock richiesto avrà esito negativo.

    • Se si apre con più accesso o meno condivisione, si verificherà anche un errore di 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 tali tipi di oplock.

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

IoCreateFileSpecifyDeviceObjectHint non può essere usato per ottenere un handle in un volume.

Se il percorso del nome file passato a IoCreateFileSpecifyDeviceObjectHint contiene un punto reparse, il punto reparse deve risolversi nello stesso volume in cui risiede il file o la directory. In caso contrario, viene restituito l'errore STATUS_INVALID_DEVICE_OBJECT_PARAMETER o STATUS_MOUNT_POINT_NOT_RESOLVED.

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
intestazione ntddk.h (include Ntddk.h, Ntifs.h, FltKernel.h)
libreria NtosKrnl.lib
dll NtosKrnl.exe
IRQL PASSIVE_LEVEL

Vedere anche

ACCESS_MASK

ACL

FILE_FULL_EA_INFORMATION

IO_DRIVER_CREATE_CONTEXT

InitializeObjectAttributes

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileEx

UNICODE_STRING

ZwClose

ZwCreateFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile

ZwWriteFile