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.
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.
[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.
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 | Sì |
Failover trasparente SMB 3.0 (TFO) | Sì |
SMB 3.0 con condivisioni file con scalabilità orizzontale (SO) | Sì |
File system del volume condiviso del cluster (CsvFS) | Sì |
File system resiliente (ReFS) | Sì |
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 |