Compartir a través de


Función NtCreateFile (winternl.h)

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

Esta función es el modo de usuario equivalente a la función de 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 de 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
Los datos se pueden leer desde el archivo.
FILE_READ_ATTRIBUTES
fileAttributes marcas, que se describen 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
Los datos se pueden escribir en el archivo.
FILE_WRITE_ATTRIBUTES
se pueden escribir marcas de FileAttributes.
FILE_WRITE_EA
Se pueden escribir atributos extendidos (EA) 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
El FileHandle devuelto se puede esperar a que se sincronice con la finalización de una operación de E/S. Si FileHandle no se abrió 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_DATAni 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 de DesiredAccess, 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 las siguientes opciones, posiblemente mediante una o varias marcas compatibles con una o varias marcas compatibles de la lista de marcas de 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 ObjectAttributes datos proporcionados. Este valor debe ser al menos sizeof(OBJECT_ATTRIBUTES).
HANDLE RootDirectory
Opcionalmente, especifica un identificador de 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 esNULL, 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 que el controlador de disquete y el sistema de archivos excesivamente cargado 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 ignorar el caso del ObjectName miembro en lugar de realizar una búsqueda exacta de coincidencias. El valor OBJ_INHERIT es irrelevante para los controladores intermedios y del dispositivo.
securityDescriptor de PSECURITY_DESCRIPTOR
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 no esNULL solo 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 de NtCreateFile, el miembro Information de 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 de FILE_ATTRIBUTE_xxxx, que se definen en Wdm.h y NtDdk.h. Para obtener una lista de marcas que se pueden usar con NtCreateFile, vea 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 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, consulte Windows SDK.

[in] CreateDisposition

Especifica qué hacer, en función 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 ni 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 lo hace, 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 lo hace, produzca 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_OPENo FILE_OPEN_IF. Con esta marca, otras marcas de CreateOp tions compatibles solo incluyen las siguientes: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENTy 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 de 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 de 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 una 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 de 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 de 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 entidades de certificación de red. 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 de archivo de 8 bytes para el archivo. Este número se asigna por 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 ([Bloqueos oportunistas](/windows/win32/fileio/oportunistas-locks)) para evitar que otras aplicaciones obtengan infracciones de uso compartido. 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 abre y se solicita un bloqueo oportunista ([Bloqueos oportunistas](/windows/win32/fileio/oportunistas-locks)) en el archivo como una sola 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 devuelto 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á bloqueado ([Bloqueos oportunistas](/windows/win32/fileio/oportunista-locks)), 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 Algunos sistemas de archivos pueden no admitir 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 el IoStatusBlock. Para simplificar esta comprobación, una aplicación puede usar las macros NT_SUCCESS, NT_ERRORy NT_WARNING.

Observaciones

El identificador, proporcionado 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 ObjectName miembro de la entrada ObjectAttributes
  • Como nombre de ruta de acceso relativo al archivo de directorio representado por el identificador del miembro RootDirectory de la entrada ObjectAttributes

Algunos DesiredAccess marcas y combinaciones de marcas tienen los siguientes efectos:

  • Para que un autor de llamada sincronice una finalización de E/S esperando el FileHandle devuelto, se debe establecer la marca SYNCHRONIZE.
  • Pasar un cero a desiredFlags no es válido.
  • Si solo se establecen las marcas de 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 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 mediante 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 los accesos a datos.

El parámetro ShareAccess determina si los subprocesos independientes pueden tener acceso 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 llamada original de ntCreateFile no especifica FILE_SHARE_READ, FILE_SHARE_WRITEo FILE_SHARE_DELETE, no se puede realizar ninguna otra operación abierta en el archivo; es decir, al autor de la llamada original se le concede 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 de DesiredAccess y ShareAccess de todas las aperturas anteriores que aún no se han publicado con NtClose. Es decir, el parámetro DesiredAccess especificado para 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 ese archivo y, a continuación, vuelve a crearlo. Esto implica que, si otro subproceso ya ha abierto el archivo, abrió el archivo especificando un parámetro 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 de CreateDispositionFILE_OVERWRITE_IF y FILE_SUPERSEDE son similares. Si se llama ZwCreateFile con un archivo existente y cualquiera de estos valores CreateDisposition, se reemplaza el archivo.

Sobrescribir un archivo es semánticamente equivalente a una operación de sustitución, excepto por 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 ShareAccess de entrada.
  • 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 existentes FileAttributes, 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 deFILE_DIRECTORY_FILE CreateOptions 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 CreateOptions o valor CreateDisposition, 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 de NtXXXFile, incluidas las siguientes:

  • Cualquier ByteOff set opcional que se pase al NtReadFile o función de NtWriteFile debe ser una parte integral del tamaño del sector.
  • El longitud pasado a NtReadFile o ntWriteFile, debe ser un entero 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 deben ajustarse 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 del sistema FILE_XXX_ALIGNMENT, 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 marcasFILE_SYNCHRONOUS_IO_ALERT CreateOptions y FILE_SYNCHRONOUS_IO_NONALERT, que son mutuamente excluyentes como sus nombres sugieren, especifique que todas las operaciones de E/S del archivo deben ser sincrónicas siempre y cuando se produzcan a través del objeto de archivo al que hace referencia el FileHandle devuelto. Toda la E/S de este tipo de archivo se serializa en todos los subprocesos mediante el identificador devuelto. Con cualquiera de estos CreateOptions, se debe establecer la marca de SYNCHRONIZE DesiredAccesspara que el Administrador de E/S use el objeto de archivo como un objeto de sincronización. Con cualquiera de estos conjunto de CreateOptions, el Administrador de E/S mantiene el "contexto de posición de 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, el procesamiento normal de puntos de reanálisis se produce 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.

El 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 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 del interbloqueo. Del mismo modo, si esta llamada se realiza correctamente, pero se produce un error en la solicitud de interbloqueo posterior, una aplicación que use 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 FILE_RESERVE_OPFILTER parámetro CreateOptions permite a una aplicación solicitar un interbloqueo de nivel 1, lote o filtro para evitar que otras aplicaciones obtengan infracciones de recursos compartidos. Sin embargo, en términos prácticos, el FILE_RESERVE_OPFILTER es útil solo 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_ATTRIBUTESy 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_GRANTEDy también se produce un error en el siguiente interbloqueo solicitado.
    • Si abre con más acceso que FILE_READ_ATTRIBUTES o menos uso compartido 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 en 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 que todavía no interrumpa un interbloqueo de filtro. Sin embargo, cualquier DesiredAccess mayor que (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE) interrumpirá un interbloqueo de nivel 1 o batch y hará que la marca de FILE_RESERVE_OPFILTER sea 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, vea bloqueos oportunistas.

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

Requisitos

Requisito Valor
de la plataforma de destino de Windows
encabezado de winternl.h
biblioteca de ntdll.lib
DLL de ntdll.dll