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