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.
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.
[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.
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 | Sí |
Conmutación por error transparente (TFO) de SMB 3.0 | Sí |
SMB 3.0 con recursos compartidos de archivos de escalabilidad horizontal (SO) | Sí |
Sistema de archivos de Volumen compartido de clúster (CsvFS) | Sí |
Sistema de archivos resistente a errores (ReFS) | Sí |
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 |