Funzione SetFileValidData (fileapi.h)

Imposta la lunghezza dei dati valida del file specificato. Questa funzione è utile in scenari molto limitati. Per altre informazioni, vedere la sezione Osservazioni.

Attenzione L'uso di questa funzione senza considerazioni di sicurezza appropriate può compromettere la privacy e la sicurezza dei dati. Per altre informazioni, vedere la sezione Osservazioni.

 

Sintassi

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

Parametri

[in] hFile

Handle per il file. Il file deve essere stato aperto con il diritto di accesso GENERIC_WRITE e il privilegio SE_MANAGE_VOLUME_NAME abilitato. Per altre informazioni, vedere Sicurezza file e diritti di accesso.

Nota Il file non può essere un file di rete o essere compresso, sparse o transazionato.
 

[in] ValidDataLength

Nuova lunghezza dei dati valida.

Questo parametro deve essere un valore positivo maggiore della lunghezza dei dati valida corrente, ma minore della dimensione del file corrente.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è diverso da zero.

Se la funzione ha esito negativo, il valore restituito è 0. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

La funzione SetFileValidData imposta la fine logica di un file. Per impostare le dimensioni di un file, usare la funzione SetEndOfFile . La dimensione del file fisico viene definita anche la fine del file.

Ogni flusso di file ha le proprietà seguenti:

  • Dimensioni del file: dimensioni dei dati in un file, al byte.
  • Dimensioni di allocazione: dimensioni dello spazio allocato per un file in un disco, che è sempre un multiplo delle dimensioni del cluster.
  • Lunghezza dei dati valida: lunghezza dei dati in un file effettivamente scritto, nel byte. Questo valore è sempre minore o uguale alla dimensione del file.
In genere, la funzione SetFileValidData viene usata dalle applicazioni a livello di sistema sui propri dati privati. Non tutti i file system usano la lunghezza dei dati valida. Alcuni file system possono tenere traccia di più intervalli di dati validi. In generale, la maggior parte delle applicazioni non dovrà mai chiamare questa funzione.

La funzione SetFileValidData consente di evitare di compilare i dati con zero durante la scrittura in modo non sequenziale in un file. La funzione rende validi i dati nel file senza scrivere nel file. Di conseguenza, anche se alcuni miglioramenti delle prestazioni possono essere realizzati, i dati esistenti sul disco dai file esistenti in precedenza possono diventare inavvertitamente disponibili per i lettori imprevisti. I paragrafi seguenti forniscono una descrizione più dettagliata di questo potenziale problema di sicurezza e privacy.

Un chiamante deve avere il privilegio SE_MANAGE_VOLUME_NAME abilitato quando si apre inizialmente un file. Le applicazioni devono chiamare SetFileValidData solo nei file che limitano l'accesso a tali entità con accesso SE_MANAGE_VOLUME_NAME . L'applicazione deve assicurarsi che gli intervalli non scritti del file non vengano mai esposti o che i problemi di sicurezza possano risultare come indicato di seguito.

Se SetFileValidData viene usato in un file, il potenziale miglioramento delle prestazioni viene ottenuto non riempiendo i cluster allocati per il file con zero. Pertanto, la lettura dal file restituirà qualsiasi cluster allocato contenga, potenzialmente contenuto da altri utenti. Questo non è necessariamente un problema di sicurezza a questo punto, perché il chiamante deve avere privilegi SE_MANAGE_VOLUME_NAME per SetFileValidData per esito positivo e tutti i dati sul disco possono essere letti da tali utenti. Tuttavia, questo chiamante può inavvertitamente esporre questi dati ad altri utenti che non possono acquisire il privilegio di SE_MANAGE_VOLUME_PRIVILEGE se contiene quanto segue:

  • Se il file non è stato aperto con una modalità di condivisione che nega altri lettori, un utente non privato può aprirlo e leggere i dati esposti.
  • Se il sistema smette di rispondere prima che il chiamante finisca la scrittura del valore ValidDataLength fornito nella chiamata, in un riavvio, tale utente non privato può aprire il file e leggere il contenuto esposto.

Se il chiamante setFileValidData ha aperto il file con un controllo di accesso adeguatamente restrittivo, le condizioni precedenti non verranno applicate. Tuttavia, per i file parzialmente scritti estesi con SetFileValidData (ovvero, la scrittura non è stata completata fino a ValidDataLength fornita nella chiamata) esiste ancora un'altra potenziale vulnerabilità di privacy o sicurezza. Un amministratore può copiare il file in una destinazione non controllata correttamente con autorizzazioni ACL restrittive, esponendo inavvertitamente i dati dell'area estesa alla lettura non autorizzata.

È per questi motivi che SetFileValidData non è consigliato per l'uso generico, oltre alle considerazioni sulle prestazioni, come illustrato di seguito.

Per altre informazioni sui privilegi di sicurezza e accesso, vedere Esecuzione con privilegi speciali e diritti di accesso e sicurezza file.

È possibile usare la funzione SetFileValidData per creare file di grandi dimensioni in circostanze molto specifiche in modo che le prestazioni dei file successivi I/O possano essere migliori di altri metodi. In particolare, se la parte estesa del file è di grandi dimensioni e verrà scritta in modo casuale, ad esempio in un tipo di database di applicazione, il tempo necessario per estendere e scrivere nel file sarà più veloce di usare SetEndOfFile e scrivere in modo casuale. Nella maggior parte delle altre situazioni, in genere non esiste alcun miglioramento delle prestazioni per l'uso di SetFileValidData e a volte può verificarsi una penalità delle prestazioni.

In Windows 8 e Windows Server 2012 questa funzione è supportata dalle tecnologie seguenti.

Tecnologia Supportato
Protocollo SMB (Server Message Block) 3.0
Failover trasparente SMB 3.0 (TFO)
SMB 3.0 con condivisioni file con scalabilità orizzontale (SO)
File system del volume condiviso del cluster (CsvFS)
File system resiliente (ReFS)

Requisiti

   
Client minimo supportato Windows XP [solo app desktop]
Server minimo supportato Windows Server 2003 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione fileapi.h (includere Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Funzioni di gestione file

SetEndOfFile