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.
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.
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.
[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 |
---|---|
|
Especifica el número de bytes de datos ObjectAttributes proporcionados . Este valor debe ser al menos sizeof(OBJECT_ATTRIBUTES). |
|
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. |
|
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. |
|
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. |
|
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. |
|
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.
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.
[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 |
---|---|
|
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. |
|
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. |
|
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 . |
|
Todos los accesos al archivo son secuenciales. |
|
Los accesos al archivo pueden ser aleatorios, por lo que los FSD o el sistema no deben realizar operaciones de lectura anticipada secuenciales. |
|
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 . |
|
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 . |
|
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 . |
|
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. |
|
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. |
|
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. |
|
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 . |
|
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. |
|
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. |
|
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. |
|
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. |
|
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.
[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
- 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.
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.
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.
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.
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:
- 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.
- Si la solicitud de creación se realiza correctamente, solicite un interbloqueo.
- Abra otro identificador para el archivo para realizar E/S.
(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 |
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de