Compartir a través de


estructura FILE_OBJECT (wdm.h)

El sistema usa la estructura FILE_OBJECT para representar un objeto de archivo. Para subsistemas protegidos en modo de usuario, un objeto de archivo representa una instancia abierta de un archivo, dispositivo, directorio o volumen. Para los controladores intermedios y del dispositivo, un objeto de archivo suele representar un objeto de dispositivo. Para los controladores de la pila del sistema de archivos, un objeto de archivo normalmente representa un directorio o archivo.

Un objeto de archivo es parcialmente opaco. Ciertos tipos de controladores, como los controladores del sistema de archivos y los controladores de transporte de red, usan algunos de los campos de objetos de archivo.

Sintaxis

typedef struct _FILE_OBJECT {
  CSHORT                                Type;
  CSHORT                                Size;
  PDEVICE_OBJECT                        DeviceObject;
  PVPB                                  Vpb;
  PVOID                                 FsContext;
  PVOID                                 FsContext2;
  PSECTION_OBJECT_POINTERS              SectionObjectPointer;
  PVOID                                 PrivateCacheMap;
  NTSTATUS                              FinalStatus;
  struct _FILE_OBJECT                   *RelatedFileObject;
  BOOLEAN                               LockOperation;
  BOOLEAN                               DeletePending;
  BOOLEAN                               ReadAccess;
  BOOLEAN                               WriteAccess;
  BOOLEAN                               DeleteAccess;
  BOOLEAN                               SharedRead;
  BOOLEAN                               SharedWrite;
  BOOLEAN                               SharedDelete;
  ULONG                                 Flags;
  UNICODE_STRING                        FileName;
  LARGE_INTEGER                         CurrentByteOffset;
  __volatile ULONG                      Waiters;
  __volatile ULONG                      Busy;
  PVOID                                 LastLock;
  KEVENT                                Lock;
  KEVENT                                Event;
  __volatile PIO_COMPLETION_CONTEXT     CompletionContext;
  KSPIN_LOCK                            IrpListLock;
  LIST_ENTRY                            IrpList;
  __volatile _IOP_FILE_OBJECT_EXTENSION *FileObjectExtension;
  struct                                _IOP_FILE_OBJECT_EXTENSION;
} FILE_OBJECT, *PFILE_OBJECT;

Miembros

Type

Miembro de solo lectura utilizado por el sistema para indicar que el objeto es un objeto de archivo. Si el objeto es un objeto de archivo, el valor de este miembro es 5.

Size

Miembro de solo lectura que especifica el tamaño, en bytes, del objeto de archivo. Este tamaño no incluye la extensión de objeto de archivo, si hay una presente.

DeviceObject

Puntero al objeto de dispositivo en el que se abre el archivo.

Vpb

Puntero al bloque de parámetros de volumen asociado al objeto de archivo.

Tenga en cuenta que si el miembro Vpb no es NULL, el archivo reside en un volumen montado.

FsContext

Puntero a cualquier estado opcional que mantenga un controlador sobre el objeto de archivo; en caso contrario, NULL. En el caso de los controladores del sistema de archivos, este miembro debe apuntar a una estructura de encabezado FSRTL_ADVANCED_FCB_HEADER contenida en una estructura específica del sistema de archivos; de lo contrario, la inestabilidad del sistema puede resultar. Normalmente, esta estructura de encabezado se inserta en un bloque de control de archivos (FCB). Sin embargo, en algunos sistemas de archivos que admiten varios flujos de datos, como NTFS, esta estructura de encabezado es un bloque de control de flujo (SCB).

En una pila de dispositivos WDM, solo el objeto de dispositivo funcional (FDO) puede usar los dos punteros de contexto. Los controladores del sistema de archivos comparten este miembro en varios se abre en el mismo flujo de datos.

FsContext2

Puntero a cualquier estado adicional que mantenga un controlador sobre el objeto de archivo; en caso contrario, NULL.

Este miembro es opaco para los controladores de la pila del sistema de archivos porque el sistema de archivos subyacente utiliza este miembro.

SectionObjectPointer

Puntero al objeto de sección de solo lectura del objeto de archivo. Este miembro solo lo establecen los sistemas de archivos y se usan para la interacción del Administrador de caché.

PrivateCacheMap

Un miembro opaco, establecido solo por sistemas de archivos, que apunta a controlar información específica y que se usa para la interacción del Administrador de caché.

FinalStatus

Miembro de solo lectura que se usa, en determinados casos sincrónicos, para indicar el estado final de la solicitud de E/S del objeto de archivo.

RelatedFileObject

Puntero a una estructura de FILE_OBJECT utilizada para indicar que el objeto de archivo actual se ha abierto en relación con un objeto de archivo ya abierto. El objeto de archivo al que apunta este miembro suele ser un directorio (lo que significa que el archivo actual se ha abierto en relación con este directorio). Sin embargo, se puede volver a abrir un archivo con respecto a sí mismo y se pueden abrir flujos de datos alternativos para un archivo en relación con un flujo de datos principal ya abierto para ese mismo archivo. El miembro RelatedFileObject solo es válido durante el procesamiento de las solicitudes de IRP_MJ_CREATE .

LockOperation

Miembro de solo lectura. Si es FALSE, nunca se ha realizado una operación de bloqueo (NtLockFile) en el objeto de archivo. Si es TRUE, se ha realizado al menos una operación de bloqueo en el objeto de archivo. Una vez establecido en TRUE, este miembro siempre sigue siendo TRUE (por ejemplo, liberar bloqueos de archivo en el objeto de archivo no restablece este miembro a FALSE).

DeletePending

Miembro de solo lectura. Si es TRUE, existe una operación de eliminación para el archivo asociado al objeto de archivo. Si es FALSE, actualmente no hay ninguna operación de eliminación pendiente para el objeto de archivo.

ReadAccess

Miembro de solo lectura. Si es TRUE, se ha abierto el archivo asociado al objeto de archivo para el acceso de lectura. Si es FALSE, el archivo se ha abierto sin acceso de lectura. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

WriteAccess

Miembro de solo lectura. Si es TRUE, el archivo asociado al objeto de archivo se ha abierto para el acceso de escritura. Si es FALSE, el archivo se ha abierto sin acceso de escritura. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

DeleteAccess

Miembro de solo lectura. Si es TRUE, se ha abierto el archivo asociado al objeto de archivo para eliminar el acceso. Si es FALSE, el archivo se ha abierto sin acceso de eliminación. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

SharedRead

Miembro de solo lectura. Si es TRUE, el archivo asociado al objeto de archivo se ha abierto para el acceso de uso compartido de lectura. Si es FALSE, el archivo se ha abierto sin acceso de uso compartido de lectura. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

SharedWrite

Miembro de solo lectura. Si es TRUE, se ha abierto el archivo asociado al objeto de archivo para el acceso compartido de escritura. Si es FALSE, el archivo se ha abierto sin acceso de uso compartido de escritura. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

SharedDelete

Miembro de solo lectura. Si es TRUE, se ha abierto el archivo asociado al objeto de archivo para eliminar el acceso compartido. Si es FALSE, el archivo se ha abierto sin eliminar el acceso compartido. Esta información se usa al comprobar o establecer el acceso compartido del archivo.

Flags

Miembro de solo lectura usado por el sistema para contener uno o varios (una combinación OR inclusiva bit a bit) de los siguientes valores de marca privada.

Marca Significado
FO_FILE_OPEN Desusado.
FO_SYNCHRONOUS_IO El objeto de archivo se abre para E/S sincrónica.
FO_ALERTABLE_IO Cualquier espera en el administrador de E/S, como resultado de una solicitud realizada a este objeto de archivo, es alertable.
FO_NO_INTERMEDIATE_BUFFERING El archivo asociado al objeto de archivo no se puede almacenar en caché ni almacenarse en búferes internos de un controlador.
FO_WRITE_THROUGH Los servicios del sistema, los controladores del sistema y los controladores que escriben datos en el archivo deben transferir los datos al archivo antes de que se considere que se ha completado cualquier operación de escritura solicitada.
FO_SEQUENTIAL_ONLY El archivo asociado al objeto de archivo se abrió solo para operaciones de E/S secuenciales.
FO_CACHE_SUPPORTED El archivo asociado al objeto de archivo se puede almacenar en caché. Este indicador solo se debe establecer mediante un controlador del sistema de archivos y solo si el miembro FsContext apunta a una estructura de FSRTL_ADVANCED_FCB_HEADER válida.
FO_NAMED_PIPE El objeto de archivo representa una canalización con nombre.
FO_STREAM_FILE El objeto de archivo representa una secuencia de archivos.
FO_MAILSLOT El objeto file representa un objeto mailslot.
FO_GENERATE_AUDIT_ON_CLOSE Desusado.
FO_QUEUE_IRP_TO_THREAD Los IRP no se ponen en cola en este objeto de archivo.
FO_DIRECT_DEVICE_OPEN El dispositivo de destino de este objeto de archivo se abrió directamente.
FO_FILE_MODIFIED Se ha modificado el archivo asociado al objeto de archivo.
FO_FILE_SIZE_CHANGED El archivo asociado al objeto de archivo ha cambiado de tamaño.
FO_CLEANUP_COMPLETE El sistema de archivos ha completado su limpieza para este objeto de archivo.
FO_TEMPORARY_FILE El archivo asociado al objeto de archivo es un archivo temporal.
FO_DELETE_ON_CLOSE El sistema de archivos eliminará el archivo asociado al objeto de archivo al cerrarse.
FO_OPENED_CASE_SENSITIVE Se respeta el caso de nombre de archivo del archivo asociado al objeto de archivo.
FO_HANDLE_CREATED Se creó un identificador de archivo para el objeto de archivo.
FO_FILE_FAST_IO_READ Se realizó una lectura rápida de E/S en este objeto de archivo.
FO_RANDOM_ACCESS El archivo asociado al objeto de archivo se abrió para el acceso aleatorio.
FO_FILE_OPEN_CANCELLED La solicitud de creación de este objeto de archivo se canceló antes de completarse.
FO_VOLUME_OPEN El objeto de archivo representa una solicitud de apertura de volumen.
FO_REMOTE_ORIGIN La solicitud de creación del archivo asociado al objeto de archivo se originó en un equipo remoto.
FO_SKIP_COMPLETION_PORT Para un objeto de archivo asociado a un puerto, determina si el sistema debe omitir la puesta en cola al puerto de finalización cuando el IRP se completa de forma sincrónica con un valor devuelto de estado de no error.
FO_SKIP_SET_EVENT Omita la configuración del evento para el objeto de archivo tras la finalización de IRP.
FO_SKIP_SET_FAST_IO Omita la configuración de un evento proporcionado a un servicio del sistema cuando la ruta de acceso de E/S rápida se realice correctamente.

FileName

Estructura UNICODE_STRING cuyo miembro buffer apunta a una cadena Unicode de solo lectura que contiene el nombre del archivo abierto en el volumen. Si se abre el volumen, el miembro Length de la estructura UNICODE_STRING será cero. Tenga en cuenta que el nombre de archivo de esta cadena solo es válido durante el procesamiento inicial de una solicitud de IRP_MJ_CREATE . Este nombre de archivo no debe considerarse válido después de que el sistema de archivos comience a procesar la solicitud de IRP_MJ_CREATE . El almacenamiento de la cadena a la que apunta el miembro Buffer de la estructura UNICODE_STRING se asigna en la memoria del sistema paginada. Para obtener más información sobre cómo obtener un nombre de archivo, vea FltGetFileNameInformation.

CurrentByteOffset

Miembro de solo lectura que especifica el desplazamiento del archivo, en bytes, asociado al objeto de archivo.

Waiters

Miembro de solo lectura utilizado por el sistema para contar el número de camareros pendientes en un objeto de archivo abierto para el acceso sincrónico.

Busy

Miembro de solo lectura usado por el sistema para indicar si un objeto de archivo abierto para el acceso sincrónico está ocupado actualmente.

LastLock

Puntero opaco al último bloqueo aplicado al objeto de archivo.

Lock

Miembro opaco utilizado por el sistema para contener un bloqueo de eventos de objeto de archivo. El bloqueo de eventos se usa para controlar el acceso sincrónico al objeto de archivo. Solo se aplica a los objetos de archivo que se abren para el acceso sincrónico.

Event

Miembro opaco utilizado por el sistema para contener un objeto de evento para el objeto de archivo. El objeto de evento se usa para indicar la finalización de una solicitud de E/S en el objeto de archivo si no se proporcionó ningún evento de usuario o se llamó a una API sincrónica.

CompletionContext

Puntero opaco a la información del puerto de finalización (puntero de puerto y clave) asociado al objeto de archivo, si existe.

IrpListLock

Puntero opaco a una estructura KSPIN_LOCK que actúa como bloqueo de número usado para sincronizar el acceso a la lista IRP del objeto de archivo.

IrpList

Puntero opaco al encabezado de la lista IRP asociada al objeto de archivo.

FileObjectExtension

Puntero opaco a la estructura de extensión de objeto de archivo (FOBX) del objeto de archivo. La estructura FOBX contiene varios contextos opacos usados internamente, así como los contextos de objetos por archivo disponibles a través de rutinas FsRtl Xxx.

_IOP_FILE_OBJECT_EXTENSION

Estructura _IOP_FILE_OBJECT_EXTENSION .

Comentarios

Los controladores pueden usar los miembros FsContext y FsContext2 para mantener el estado determinado por el controlador sobre un objeto de archivo abierto. Un controlador no puede usar estos miembros a menos que el objeto de archivo sea accesible en la ubicación de pila de E/S del controlador de un IRP.

Todos los miembros restantes de un objeto de archivo son opacos o de solo lectura:

  • Los miembros opacos de un objeto de archivo deben considerarse inaccesibles. Es posible que los controladores con dependencias en las ubicaciones del campo de objeto o el acceso a miembros opacos no permanezcan portátiles e interoperables con otros controladores a lo largo del tiempo.

  • Los controladores pueden usar miembros de solo lectura para adquirir información relevante, pero no deben modificar miembros de solo lectura y, si es un puntero, el objeto al que apunta el miembro.

Durante el procesamiento de una solicitud de IRP_MJ_CREATE , un controlador del sistema de archivos llama a la rutina IoSetShareAccess (si el cliente es el primero en abrir el archivo) o la rutina IoCheckShareAccess (para los clientes posteriores que desean compartir el archivo). Los miembros IoSetShareAccess e IoCheckShareAccess actualizan los miembros ReadAccess, WriteAccess y DeleteAccess para indicar los derechos de acceso que se conceden al cliente si el cliente tiene acceso exclusivo al archivo. Además, IoCheckShareAccess actualiza los miembros SharedRead, SharedWrite y SharedDelete para indicar los derechos de acceso que se conceden simultáneamente a dos o más clientes que comparten el archivo. Si el controlador de un dispositivo distinto de un sistema de archivos tiene que supervisar los derechos de acceso de los clientes, este controlador normalmente almacena información de derechos de acceso en búferes de contexto a los que apuntan los miembros FsContext y FsContext2 .

El tipo de objeto (por ejemplo, un archivo, directorio o volumen) que representa un objeto de archivo determinado no se puede determinar examinando únicamente el contenido de la estructura de objetos de archivo. Para obtener información sobre cómo determinar el tipo de objeto que representa un objeto de archivo, vea ZwQueryInformationFile.

El sistema de archivos de registro común (CLFS) usa la estructura LOG_FILE_OBJECT para representar los registros. La función ClfsCreateLogFile devuelve un puntero a una estructura de LOG_FILE_OBJECT , que los clientes pasan a otras funciones CLFS.

Los clientes CLFS no acceden directamente a los miembros de una estructura de LOG_FILE_OBJECT .

typedef FILE_OBJECT LOG_FILE_OBJECT, *PLOG_FILE_OBJECT, **PPLOG_FILE_OBJECT;

Requisitos

Requisito Valor
Header wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h)

Consulte también

DEVICE_OBJECT

FOBX

FSRTL_ADVANCED_FCB_HEADER

IRP_MJ_CREATE

IoCheckShareAccess

IoGetDeviceObjectPointer

IoSetShareAccess

ObDereferenceObject

ZwQueryInformationFile