Función NtCreateFile (winternl.h)

Crea un nuevo archivo o directorio, o abre un archivo, un dispositivo, un directorio o un volumen existentes.

 

Esta función es el modo de usuario equivalente a la función ZwCreateFile documentada en el Kit de controladores de Windows (WDK).

Sintaxis

__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
);

Parámetros

[out] FileHandle

Puntero a una variable que recibe el identificador de archivo si la llamada se realiza correctamente.

[in] DesiredAccess

Valor ACCESS_MASK que expresa el tipo de acceso que requiere el autor de la llamada al archivo o directorio. El conjunto de marcas DesiredAccess definidas por el sistema determina los siguientes derechos de acceso específicos para los objetos de archivo.

Valor Significado
DELETE
El archivo se puede eliminar.
FILE_READ_DATA
Se pueden leer datos de este archivo.
FILE_READ_ATTRIBUTES
Las marcas FileAttributes , descritas más adelante, se pueden leer.
FILE_READ_EA
Se pueden leer los atributos extendidos asociados al archivo. Esta marca es irrelevante para los controladores intermedios y del dispositivo.
READ_CONTROL
Se puede leer la lista de control de acceso (ACL) y la información de propiedad asociada al archivo.
FILE_WRITE_DATA
En este archivo se pueden escribir datos.
FILE_WRITE_ATTRIBUTES
Se pueden escribir marcas FileAttributes.
FILE_WRITE_EA
Se pueden escribir atributos extendidos (CA) asociados al archivo. Esta marca es irrelevante para los controladores intermedios y del dispositivo.
FILE_APPEND_DATA
Los datos se pueden anexar al archivo.
WRITE_DAC
Se puede escribir la lista de control de acceso discrecional (DACL) asociada al archivo.
WRITE_OWNER
La información de propiedad asociada al archivo se puede escribir.
SYNCHRONIZE
FileHandle devuelto se puede esperar a que se sincronice con la finalización de una operación de E/S. Si No se abrió FileHandle para E/S sincrónica, este valor se omite.
FILE_EXECUTE
Los datos se pueden leer en la memoria del archivo mediante la E/S de paginación del sistema. Esta marca es irrelevante para los controladores intermedios y del dispositivo.
 

No especifique FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA ni FILE_EXECUTE al crear o abrir un directorio.

Los autores de llamadas de NtCreateFile pueden especificar una o una combinación de lo siguiente, posiblemente usando un OR bit a bit con marcas compatibles adicionales de la lista de marcas DesiredAccess anteriores, para cualquier objeto de archivo que no represente un archivo de directorio.

Valor Significado
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
 

El valor de FILE_GENERIC_EXECUTE es irrelevante para los controladores intermedios y del dispositivo.

El STANDARD_RIGHTS_XXX son valores del sistema predefinidos que se usan para aplicar la seguridad en los objetos del sistema.

Para abrir o crear un archivo de directorio, como también se indica con el parámetro CreateOptions , los autores de llamadas de NtCreateFile pueden especificar una o una combinación de lo siguiente, posiblemente mediante un OR bit a bit con una o varias marcas compatibles de la lista de marcas DesiredAccess anteriores.

Valor Significado
FILE_LIST_DIRECTORY
Los archivos del directorio se pueden enumerar.
FILE_TRAVERSE
El directorio se puede recorrer: es decir, puede formar parte del nombre de ruta de acceso de un archivo.

[in] ObjectAttributes

Puntero a una estructura ya inicializada con InitializeObjectAttributes. Los miembros de esta estructura para un objeto de archivo incluyen lo siguiente.

Valor Significado
Longitud de ULONG
Especifica el número de bytes de datos ObjectAttributes proporcionados . Este valor debe ser al menos sizeof(OBJECT_ATTRIBUTES).
HANDLE RootDirectory
Opcionalmente, especifica un identificador para un directorio obtenido por una llamada anterior a NtCreateFile. Si este valor es NULL, el miembro ObjectName debe ser una especificación de archivo completa que incluya la ruta de acceso completa al archivo de destino. Si este valor no es NULL, el miembro ObjectName especifica un nombre de archivo relativo a este directorio.
PUNICODE_STRING ObjectName
Apunta a una cadena Unicode almacenada en búfer que asigna un nombre al archivo que se va a crear o abrir. Este valor debe ser una especificación de archivo completa o el nombre de un objeto de dispositivo, a menos que sea el nombre de un archivo relativo al directorio especificado por RootDirectory. Por ejemplo, \Device\Floppy1\myfile.dat o \?? \B:\myfile.dat podría ser la especificación de archivo completa, siempre y cuando el controlador de disquete y el sistema de archivos sobrescargo ya estén cargados. Para obtener más información, vea Nombres de archivo, rutas de acceso y espacios de nombres.
Atributos de ULONG
Es un conjunto de marcas que controla los atributos del objeto de archivo. Este valor puede ser cero o OBJ_CASE_INSENSITIVE, lo que indica que el código de búsqueda de nombres debe omitir el caso del miembro ObjectName en lugar de realizar una búsqueda de coincidencia exacta. El valor OBJ_INHERIT es irrelevante para los controladores intermedios y del dispositivo.
PSECURITY_DESCRIPTOR SecurityDescriptor
Opcionalmente, especifica un descriptor de seguridad que se va a aplicar a un archivo. Las ACL especificadas por este descriptor de seguridad se aplican al archivo solo cuando se crea. Si el valor es NULL cuando se crea un archivo, la ACL colocada en el archivo depende del sistema de archivos; la mayoría de los sistemas de archivos propagan parte de dicha ACL desde el archivo de directorio primario combinado con la ACL predeterminada del autor de la llamada. Los controladores intermedios y de dispositivo pueden establecer este miembro en NULL.
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
Especifica los derechos de acceso que debe proporcionar un servidor al contexto de seguridad del cliente. Este valor solo es NULL cuando se establece una conexión a un servidor protegido, lo que permite al autor de la llamada controlar qué partes del contexto de seguridad del autor de la llamada están disponibles para el servidor y si el servidor puede suplantar al autor de la llamada.

[out] IoStatusBlock

Puntero a una variable que recibe el estado de finalización final e información sobre la operación solicitada. Al devolver desde NtCreateFile, el miembro Information contiene uno de los siguientes valores:

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

[in, optional] AllocationSize

Tamaño de asignación inicial en bytes para el archivo. Un valor distinto de cero no tiene ningún efecto a menos que se cree, sobrescriba o sustituya el archivo.

[in] FileAttributes

Atributos de archivo. Los atributos especificados explícitamente solo se aplican cuando se crea, reemplaza o, en algunos casos, se sobrescribe el archivo. De forma predeterminada, este valor es un FILE_ATTRIBUTE_NORMAL, que se puede invalidar mediante una combinación de ORed de una o varias marcas FILE_ATTRIBUTE_xxxx , que se definen en Wdm.h y NtDdk.h. Para obtener una lista de marcas que se pueden usar con NtCreateFile, consulte CreateFile.

[in] ShareAccess

Tipo de acceso compartido que el autor de la llamada desea usar en el archivo, como cero, o como una o una combinación de los valores siguientes.

Valor Significado
FILE_SHARE_READ
El archivo se puede abrir para el acceso de lectura mediante las llamadas de otros subprocesos a NtCreateFile.
FILE_SHARE_WRITE
El archivo se puede abrir para el acceso de escritura mediante las llamadas de otros subprocesos a NtCreateFile.
FILE_SHARE_DELETE
El archivo se puede abrir para eliminar el acceso mediante las llamadas de otros subprocesos a NtCreateFile.
 

Para obtener más información, vea Windows SDK.

[in] CreateDisposition

Especifica qué hacer, dependiendo de si el archivo ya existe, como uno de los valores siguientes.

Valor Significado
FILE_SUPERSEDE
Si el archivo ya existe, reemplácelo por el archivo especificado. Si no es así, cree el archivo especificado.
FILE_CREATE
Si el archivo ya existe, produzca un error en la solicitud y no cree o abra el archivo especificado. Si no es así, cree el archivo especificado.
FILE_OPEN
Si el archivo ya existe, ábralo en lugar de crear un nuevo archivo. Si no es así, produzca un error en la solicitud y no cree un nuevo archivo.
FILE_OPEN_IF
Si el archivo ya existe, ábralo. Si no es así, cree el archivo especificado.
FILE_OVERWRITE
Si el archivo ya existe, ábralo y sobrescriba. Si no es así, se produce un error en la solicitud.
FILE_OVERWRITE_IF
Si el archivo ya existe, ábralo y sobrescriba. Si no es así, cree el archivo especificado.

[in] CreateOptions

Las opciones que se aplicarán al crear o abrir el archivo, como una combinación compatible de las marcas siguientes.

Valor Significado
FILE_DIRECTORY_FILE
El archivo que se va a crear o abrir es un archivo de directorio. Con esta marca, el parámetro CreateDisposition debe establecerse en FILE_CREATE, FILE_OPEN o FILE_OPEN_IF. Con esta marca, otras marcas CreateOptions compatibles incluyen solo las siguientes: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT y FILE_OPEN_BY_FILE_ID.
FILE_NON_DIRECTORY_FILE
El archivo que se abre no debe ser un archivo de directorio o se produce un error en esta llamada. El objeto de archivo que se abre puede representar un archivo de datos, un dispositivo lógico, virtual o físico, o un volumen.
FILE_WRITE_THROUGH
Las aplicaciones que escriben datos en el archivo deben transferir realmente los datos al archivo antes de que se considere completada cualquier operación de escritura solicitada. Esta marca se establece automáticamente si se establece la marca CreateOptionsFILE_NO_INTERMEDIATE _BUFFERING .
FILE_SEQUENTIAL_ONLY
Todos los accesos al archivo son secuenciales.
FILE_RANDOM_ACCESS
Los accesos al archivo pueden ser aleatorios, por lo que los FSD o el sistema no deben realizar operaciones de lectura anticipada secuenciales.
FILE_NO_INTERMEDIATE_BUFFERING
El archivo no se puede almacenar en caché ni almacenar en búferes internos de un controlador. Esta marca no es compatible con la marca DesiredAccessFILE_APPEND_DATA .
FILE_SYNCHRONOUS_IO_ALERT
Todas las operaciones del archivo se realizan de forma sincrónica. Cualquier espera en nombre del autor de la llamada está sujeta a la terminación prematura de las alertas. Esta marca también hace que el sistema de E/S mantenga el contexto de posición del archivo. Si se establece esta marca, también se debe establecer la marca DesiredAccessSYNCHRONIZE .
FILE_SYNCHRONOUS_IO_NONALERT
Todas las operaciones del archivo se realizan de forma sincrónica. Las esperas en el sistema para sincronizar la puesta en cola de E/S y la finalización no están sujetas a alertas. Esta marca también hace que el sistema de E/S mantenga el contexto de posición del archivo. Si se establece esta marca, también se debe establecer la marca DesiredAccessSYNCHRONIZE .
FILE_CREATE_TREE_CONNECTION
Cree una conexión de árbol para este archivo para abrirlo a través de la red. Este indicador no lo usan los controladores intermedios y del dispositivo.
FILE_NO_EA_KNOWLEDGE
Si los atributos extendidos de un archivo existente que se abre indican que el autor de la llamada debe comprender las entidades de certificación para interpretar correctamente el archivo, produzca un error en esta solicitud porque el autor de la llamada no entiende cómo tratar con las CA. Esta marca es irrelevante para los controladores intermedios y del dispositivo.
FILE_OPEN_REPARSE_POINT
Abra un archivo con un punto de reanálisis y omita el procesamiento normal del punto de reanálisis para el archivo. Para obtener más información, vea la sección Comentarios.
FILE_DELETE_ON_CLOSE
Elimine el archivo cuando se pase el último identificador a NtClose. Si se establece esta marca, la marca DELETE debe establecerse en el parámetro DesiredAccess .
FILE_OPEN_BY_FILE_ID
El nombre de archivo especificado por el parámetro ObjectAttributes incluye el número de referencia del archivo de 8 bytes para el archivo. Este número lo asigna y es específico del sistema de archivos en particular. Si el archivo es un punto de reanálisis, el nombre del archivo también incluirá el nombre de un dispositivo. Tenga en cuenta que el sistema de archivos FAT no admite esta marca. Este indicador no lo usan los controladores intermedios y del dispositivo.
FILE_OPEN_FOR_BACKUP_INTENT
El archivo se está abriendo para la intención de copia de seguridad. Por lo tanto, el sistema debe comprobar ciertos derechos de acceso y conceder al autor de la llamada el acceso adecuado al archivo antes de comprobar el parámetro DesiredAccess en el descriptor de seguridad del archivo. Esta marca no la usan los controladores intermedios y del dispositivo.
FILE_RESERVE_OPFILTER
Esta marca permite a una aplicación solicitar un bloqueo oportunista de filtro (oplock) para evitar que otras aplicaciones obtengan infracciones de recursos compartidos. Si ya hay identificadores abiertos, se producirá un error en la solicitud de creación con STATUS_OPLOCK_NOT_GRANTED. Para obtener más información, vea la sección Comentarios.
FILE_OPEN_REQUIRING_OPLOCK
El archivo se está abriendo y se solicita un bloqueo oportunista (oplock) en el archivo como una única operación atómica. El sistema de archivos comprueba si hay interbloqueos antes de realizar la operación de creación y producirá un error en la creación con un código de retorno de STATUS_CANNOT_BREAK_OPLOCK si el resultado sería interrumpir un interbloqueo existente. Para obtener más información, vea la sección Comentarios. Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: Esta marca no se admite.

Esta marca se admite en los siguientes sistemas de archivos: NTFS, FAT y exFAT.

FILE_COMPLETE_IF_OPLOCKED
Complete esta operación inmediatamente con un código correcto alternativo de STATUS_OPLOCK_BREAK_IN_PROGRESS si el archivo de destino está bloqueado, en lugar de bloquear el subproceso del autor de la llamada. Si el archivo está interbloqueado, otro autor de la llamada ya tiene acceso al archivo. Este indicador no lo usan los controladores intermedios y del dispositivo.

[in] EaBuffer

Puntero a un búfer de EA usado para pasar atributos extendidos.

Nota Es posible que algunos sistemas de archivos no admitan búferes de EA.
 

[in] EaLength

Longitud del búfer de EA.

Valor devuelto

NtCreateFile devuelve STATUS_SUCCESS o un estado de error adecuado. Si devuelve un estado de error, el autor de la llamada puede encontrar más información sobre la causa del error comprobando ioStatusBlock. Para simplificar esta comprobación, una aplicación puede usar las macros NT_SUCCESS, NT_ERROR y NT_WARNING .

Comentarios

El identificador, dado por NtCreateFile, se puede usar mediante llamadas posteriores para manipular datos dentro del archivo o el estado o los atributos del objeto de archivo.

Hay dos maneras alternativas de especificar el nombre del archivo que se va a crear o abrir con NtCreateFile:

  • Como nombre de ruta de acceso completo, proporcionado en el miembro ObjectName de la entrada ObjectAttributes
  • Como nombre de ruta de acceso relativo al archivo de directorio representado por el identificador en el miembro RootDirectory de la entrada ObjectAttributes
Algunas marcas de DesiredAccess y combinaciones de marcas tienen los siguientes efectos:
  • Para que un autor de la llamada sincronice una finalización de E/S esperando en el FileHandle devuelto, se debe establecer la marca SYNCHRONIZE .
  • Pasar un cero a DesiredFlags no es válido.
  • Si solo se establecen las marcas FILE_APPEND_DATA y SYNCHRONIZE , el autor de la llamada solo puede escribir al final del archivo y se omite cualquier información de desplazamiento sobre las escrituras en el archivo. Sin embargo, el archivo se extiende automáticamente según sea necesario para este tipo de operación de escritura.
  • Establecer la marca de FILE_WRITE_DATA para un archivo también permite que se produzcan escrituras más allá del final del archivo. El archivo también se extiende automáticamente para este tipo de escritura.
  • Si solo se establecen las marcas FILE_EXECUTE y SYNCHRONIZE , el autor de la llamada no puede leer ni escribir directamente ningún dato en el archivo con el FileHandle devuelto, es decir, todas las operaciones del archivo se producen a través del buscapersonas del sistema en respuesta a las instrucciones y a los accesos a datos.
El parámetro ShareAccess determina si los subprocesos independientes pueden acceder al mismo archivo, posiblemente simultáneamente. Siempre que ambos abiertores de archivos tengan el privilegio de acceder a un archivo de la manera especificada, el archivo se puede abrir y compartir correctamente. Si el autor de la llamada original de NtCreateFile no especifica FILE_SHARE_READ, FILE_SHARE_WRITE o FILE_SHARE_DELETE, no se puede realizar ninguna otra operación abierta en el archivo; es decir, el autor de la llamada original tiene acceso exclusivo al archivo.

Para que un archivo compartido se abra correctamente, el parámetro DesiredAccess solicitado al archivo debe ser compatible con las especificaciones DesiredAccess y ShareAccess de todas las aperturas anteriores que aún no se han publicado con NtClose. Es decir, el parámetro DesiredAccess especificado en NtCreateFile para un archivo determinado no debe entrar en conflicto con los accesos a los que otros abiertores del archivo no se han permitido.

El valor CreateDispositionFILE_SUPERSEDE requiere que el autor de la llamada tenga acceso DELETE a un objeto de archivo existente. Si es así, una llamada correcta a NtCreateFile con FILE_SUPERSEDE en un archivo existente elimina eficazmente ese archivo y, a continuación, lo vuelve a crear. Esto implica que, si otro subproceso ya ha abierto el archivo, abrió el archivo especificando un parámetro de ShareAccess con la marca FILE_SHARE_DELETE establecida. Tenga en cuenta que este tipo de disposición es coherente con el estilo POSIX de sobrescribir archivos. Los valores CreateDispositionFILE_OVERWRITE_IF y FILE_SUPERSEDE son similares. Si se llama a ZwCreateFile con un archivo existente y cualquiera de estos valores CreateDisposition , el archivo se reemplaza.

La sobrescritura de un archivo es semánticamente equivalente a una operación de sustitución, excepto lo siguiente:

  • El autor de la llamada debe tener acceso de escritura al archivo, en lugar de eliminar el acceso. Esto implica que, si otro subproceso ya ha abierto el archivo, abrió el archivo con la marca FILE_SHARE_WRITE establecida en el parámetro de entrada de ShareAccess .
  • Los atributos de archivo especificados son lógicamente ORed con los que ya están en el archivo. Esto implica que, si otro subproceso ya ha abierto el archivo, un llamador posterior de NtCreateFile no puede deshabilitar las marcas fileAttributes existentes, pero puede habilitar marcas adicionales para el mismo archivo. Tenga en cuenta que este estilo de sobrescribir archivos es coherente con los sistemas operativos MS-DOS, Windows 3.1 y OS/2.
El valor de FILE_DIRECTORY_FILECreateOptions especifica que el archivo que se va a crear o abrir es un archivo de directorio. Cuando se crea un archivo de directorio, el sistema de archivos crea una estructura adecuada en el disco para representar un directorio vacío para la estructura en disco de ese sistema de archivos concreto. Si se especificó esta opción y el archivo especificado que se va a abrir no es un archivo de directorio, o si el autor de la llamada especificó un valor CreateOptions o CreateDisposition incoherente, se produce un error en la llamada a NtCreateFile .

La marca CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING impide que el sistema de archivos realice un almacenamiento en búfer intermedio en nombre del autor de la llamada. Al especificar este valor, se aplican ciertas restricciones a los parámetros del autor de la llamada a otras rutinas nt XXXFile, incluidas las siguientes:

  • Cualquier ByteOffset opcional que se pase a la función NtReadFile o NtWriteFile debe ser una parte integral del tamaño del sector.
  • La longitud pasada a NtReadFile o NtWriteFile debe ser una parte integral del tamaño del sector. Tenga en cuenta que especificar una operación de lectura en un búfer cuya longitud es exactamente el tamaño del sector podría dar lugar a un número menor de bytes significativos que se transfieren a ese búfer si se alcanzó el final del archivo durante la transferencia.
  • Los búferes se deben ajustar de acuerdo con el requisito de alineación del dispositivo subyacente. Esta información se puede obtener llamando a NtCreateFile para obtener un identificador para el objeto de archivo que representa el dispositivo físico y, a continuación, llamando a NtQueryInformationFile con ese identificador. Para obtener una lista de los valores de FILE_XXX_ALIGNMENT del sistema, consulte la documentación de Windows SDK.
  • Las llamadas a NtSetInformationFile con el parámetro FileInformationClass establecido en FilePositionInformation deben especificar un desplazamiento que sea un entero del tamaño del sector.
Las marcas createOptionsFILE_SYNCHRONOUS_IO_ALERT y FILE_SYNCHRONOUS_IO_NONALERT , que son mutuamente excluyentes como sus nombres sugieren, especifican que todas las operaciones de E/S del archivo deben ser sincrónicas siempre que se produzcan a través del objeto de archivo al que hace referencia el FileHandle devuelto. Todas las E/S de este archivo se serializan en todos los subprocesos mediante el identificador devuelto. Con cualquiera de estas opciones CreateOptions, se debe establecer la marca DesiredAccessSYNCHRONIZE para que el Administrador de E/S use el objeto de archivo como un objeto de sincronización. Con cualquiera de estos conjuntos CreateOptions , el Administrador de E/S mantiene el "contexto de posición del archivo" para el objeto de archivo, un desplazamiento de posición de archivo interno y actual. Este desplazamiento se puede usar en llamadas a NtReadFile y NtWriteFile. Su posición también se puede consultar o establecer con NtQueryInformationFile y NtSetInformationFile.

Si el parámetro CreateOptions especifica la marca de FILE_OPEN_REPARSE_POINT y NtCreateFile abre un archivo con un punto de reanálisis, no se produce el procesamiento de reanálisis normal y NtCreateFile intenta abrir directamente el archivo de punto de reanálisis. Si no se especifica la marca FILE_OPEN_REPARSE_POINT , se produce el procesamiento normal del punto de reanálisis para el archivo. En cualquier caso, si la operación de apertura se realizó correctamente, NtCreateFile devuelve STATUS_SUCCESS; de lo contrario, un código de error. La función NtCreateFile nunca devuelve STATUS_REPARSE.

La marca de FILE_OPEN_REQUIRING_OPLOCK del parámetro CreateOptions elimina el tiempo entre el momento en que abre el archivo y solicita un interbloqueo que podría permitir que un tercero abra el archivo, lo que provocaría una infracción de uso compartido. Una aplicación puede usar la marca de FILE_OPEN_REQUIRING_OPLOCK con NtCreateFile y, a continuación, solicitar cualquier interbloqueo. Esto garantiza que un propietario de oplock recibirá una notificación de cualquier solicitud abierta posterior que provoque una infracción de uso compartido.

En Windows 7, si existen otros identificadores en el archivo cuando una aplicación usa esta marca, se producirá un error en la operación de creación con STATUS_OPLOCK_NOT_GRANTED. Esta restricción ya no existe a partir de Windows 8.

Si esta operación de creación interrumpiría un interbloqueo que ya existe en el archivo, al establecer la marca de FILE_OPEN_REQUIRING_OPLOCK se producirá un error en la operación de creación con STATUS_CANNOT_BREAK_OPLOCK. Esta operación de creación no romperá el interbloqueo existente.

Una aplicación que use esta marca debe solicitar un interbloqueo después de que esta llamada se realice correctamente, o todos los intentos posteriores de abrir el archivo se bloquearán sin la ventaja del procesamiento normal de oplock. Del mismo modo, si esta llamada se realiza correctamente, pero se produce un error en la solicitud de interbloqueo posterior, una aplicación que usa esta marca debe cerrar su identificador después de detectar que se ha producido un error en la solicitud de interbloqueo.

Nota La marca FILE_OPEN_REQUIRING_OPLOCK está disponible en Windows 7, Windows Server 2008 R2 y sistemas operativos posteriores para los siguientes sistemas de archivos: NTFS, FAT y exFAT.
 

La marca de FILE_RESERVE_OPFILTER del parámetro CreateOptions permite a una aplicación solicitar un oplock de nivel 1, Batch o Filter para evitar que otras aplicaciones obtengan infracciones de recursos compartidos. Sin embargo, en términos prácticos, el FILE_RESERVE_OPFILTER solo es útil para los interbloqueos de filtro. Para usarlo, debe completar los pasos siguientes:

  1. Emita una solicitud de creación con CreateOptions de FILE_RESERVE_OPFILTER, DesiredAccess de exactamente FILE_READ_ATTRIBUTES y ShareAccess de exactamente (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE). Los posibles errores son los siguientes:
    • Si ya hay identificadores abiertos, se produce un error en la solicitud de creación con STATUS_OPLOCK_NOT_GRANTED y también se produce un error en el siguiente bloqueo de operación solicitado.
    • Si abre con más acceso que FILE_READ_ATTRIBUTES o menos que (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), se produce un error en la solicitud con STATUS_OPLOCK_NOT_GRANTED.
  2. Si la solicitud de creación se realiza correctamente, solicite un interbloqueo.
  3. Abra otro identificador para el archivo para realizar E/S.
El paso tres hace que esto sea práctico solo para los interbloqueos de filtro. El identificador abierto en el paso tres puede tener un DesiredAccess que contenga un máximo de (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL) y aún no interrumpir un interbloqueo de filtro. Sin embargo, cualquier DesiredAccess mayor que (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE) interrumpirá un oplock de nivel 1 o Batch y hará que el FILE_RESERVE_OPFILTER marca inútil para esos tipos de interbloqueo.

NTFS es el único sistema de archivos de Microsoft que implementa FILE_RESERVE_OPFILTER.

Para obtener más información sobre los interbloqueos, consulte Semántica de oplock.

Tenga en cuenta que el archivo de encabezado WDK NtDef.h es necesario para muchas definiciones de constantes, así como para la macro InitializeObjectAttributes . También puede usar las funciones LoadLibrary y GetProcAddress para vincular dinámicamente a NtDll.dll.

Requisitos

Requisito Value
Plataforma de destino Windows
Encabezado winternl.h
Library ntdll.lib
Archivo DLL ntdll.dll