Función SetFileValidData (fileapi.h)

Establece la longitud de datos válida del archivo especificado. Esta función es útil en escenarios muy limitados. Para obtener más información, vea la sección Comentarios.

Precaución El uso de esta función sin consideraciones de seguridad adecuadas puede poner en peligro la privacidad y la seguridad de los datos. Para obtener más información, vea la sección Comentarios.

 

Sintaxis

BOOL SetFileValidData(
  [in] HANDLE   hFile,
  [in] LONGLONG ValidDataLength
);

Parámetros

[in] hFile

Identificador del archivo. El archivo debe haberse abierto con el derecho de acceso GENERIC_WRITE y el privilegio SE_MANAGE_VOLUME_NAME habilitado. Para obtener más información, vea Seguridad de archivos y derechos de acceso.

Nota El archivo no puede ser un archivo de red, ni ser comprimido, disperso ni transaccionado.
 

[in] ValidDataLength

Nueva longitud de datos válida.

Este parámetro debe ser un valor positivo mayor que la longitud de datos válida actual, pero menor que el tamaño de archivo actual.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si se produce un error en la función, el valor devuelto es 0. Para obtener información de error extendida, llame a GetLastError.

Comentarios

La función SetFileValidData establece el final lógico de un archivo. Para establecer el tamaño de un archivo, use la función SetEndOfFile . El tamaño del archivo físico también se conoce como el final del archivo.

Cada secuencia de archivos tiene las siguientes propiedades:

  • Tamaño del archivo: tamaño de los datos de un archivo, en el byte.
  • Tamaño de asignación: el tamaño del espacio asignado para un archivo en un disco, que siempre es un múltiplo del tamaño del clúster.
  • Longitud de datos válida: la longitud de los datos de un archivo que se escribe realmente en el byte. Este valor siempre es menor o igual que el tamaño del archivo.
Normalmente, las aplicaciones de nivel de sistema usan la función SetFileValidData en sus propios datos privados. No todos los sistemas de archivos usan una longitud de datos válida. Algunos sistemas de archivos pueden realizar un seguimiento de varios intervalos de datos válidos. En general, la mayoría de las aplicaciones nunca necesitarán llamar a esta función.

La función SetFileValidData permite evitar rellenar los datos con ceros al escribir de forma no secundaria en un archivo. La función hace que los datos del archivo son válidos sin escribir en el archivo. Como resultado, aunque se puede obtener alguna ganancia de rendimiento, los datos existentes en el disco de los archivos existentes anteriormente pueden estar disponibles accidentalmente para los lectores no deseados. Los párrafos siguientes proporcionan una descripción más detallada de este posible problema de seguridad y privacidad.

Un autor de la llamada debe tener habilitado el privilegio SE_MANAGE_VOLUME_NAME al abrir un archivo inicialmente. Las aplicaciones deben llamar a SetFileValidData solo en archivos que restrinjan el acceso a esas entidades que tienen SE_MANAGE_VOLUME_NAME acceso. La aplicación debe asegurarse de que los intervalos no escritos del archivo nunca se exponen, o los problemas de seguridad pueden dar como se indica a continuación.

Si se usa SetFileValidData en un archivo, la posible ganancia de rendimiento se obtiene al no rellenar los clústeres asignados para el archivo con ceros. Por lo tanto, la lectura del archivo devolverá lo que contengan los clústeres asignados, posiblemente contenido de otros usuarios. Esto no es necesariamente un problema de seguridad en este momento, ya que el autor de la llamada debe tener SE_MANAGE_VOLUME_NAME privilegio para que SetFileValidData se realice correctamente, y estos usuarios pueden leer todos los datos del disco. Sin embargo, este autor de la llamada puede exponer accidentalmente estos datos a otros usuarios que no pueden adquirir el privilegio SE_MANAGE_VOLUME_PRIVILEGE si lo siguiente contiene:

  • Si el archivo no se abrió con un modo de uso compartido que deniega a otros lectores, un usuario sin privilegios puede abrirlo y leer los datos expuestos.
  • Si el sistema deja de responder antes de que el autor de la llamada termine de escribir el elemento ValidDataLength proporcionado en la llamada, en un reinicio, un usuario no privado puede abrir el archivo y leer contenido expuesto.

Si el autor de la llamada de SetFileValidData abrió el archivo con control de acceso adecuadamente restrictivo, las condiciones anteriores no se aplicarían. Sin embargo, para los archivos parcialmente escritos extendidos con SetFileValidData (es decir, no se completó la escritura hasta el ValidDataLength proporcionado en la llamada), existe otra posible vulnerabilidad de privacidad o seguridad. Un administrador podría copiar el archivo en un destino que no está controlado correctamente con permisos de ACL restrictivos, lo que expone accidentalmente los datos del área extendida a la lectura no autorizada.

Por estos motivos, setFileValidData no se recomienda para uso general, además de consideraciones de rendimiento, como se describe a continuación.

Para obtener más información sobre los privilegios de seguridad y acceso, consulte Ejecución con privilegios especiales y derechos de acceso y seguridad de archivos.

Puede usar la función SetFileValidData para crear archivos grandes en circunstancias muy específicas para que el rendimiento de la E/S de archivo posterior pueda ser mejor que otros métodos. En concreto, si la parte extendida del archivo es grande y se escribirá aleatoriamente, como en un tipo de base de datos de aplicación, el tiempo necesario para extender y escribir en el archivo será más rápido que usar SetEndOfFile y escribir de forma aleatoria. En la mayoría de las otras situaciones, normalmente no hay ninguna ganancia de rendimiento para usar SetFileValidData y, a veces, puede haber una penalización de rendimiento.

En Windows 8 y Windows Server 2012, esta función es compatible con las tecnologías siguientes.

Tecnología Compatible
Protocolo Bloque de mensajes del servidor (SMB) 3.0
Conmutación por error transparente (TFO) de SMB 3.0
SMB 3.0 con recursos compartidos de archivos de escalabilidad horizontal (SO)
Sistema de archivos de Volumen compartido de clúster (CsvFS)
Sistema de archivos resistente a errores (ReFS)

Requisitos

   
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado fileapi.h (incluya Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Funciones de administración de archivos

SetEndOfFile