SetFileValidData-Funktion (fileapi.h)
Legt die gültige Datenlänge der angegebenen Datei fest. Diese Funktion ist in sehr begrenzten Szenarien nützlich. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.
Syntax
BOOL SetFileValidData(
[in] HANDLE hFile,
[in] LONGLONG ValidDataLength
);
Parameter
[in] hFile
Ein Handle zur Datei. Die Datei muss mit dem zugriffsrecht GENERIC_WRITE geöffnet und die berechtigung SE_MANAGE_VOLUME_NAME aktiviert sein. Weitere Informationen finden Sie unter Dateisicherheit und Zugriffsrechte.
[in] ValidDataLength
Die neue gültige Datenlänge.
Dieser Parameter muss ein positiver Wert sein, der größer als die aktuell gültige Datenlänge, aber kleiner als die aktuelle Dateigröße ist.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.
Wenn die Funktion fehlschlägt, ist der Rückgabewert 0. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Die SetFileValidData-Funktion legt das logische Ende einer Datei fest. Verwenden Sie die SetEndOfFile-Funktion , um die Größe einer Datei festzulegen. Die physische Dateigröße wird auch als Ende der Datei bezeichnet.
Jeder Dateidatenstrom verfügt über die folgenden Eigenschaften:
- Dateigröße: Die Größe der Daten in einer Datei bis zum Byte.
- Zuordnungsgröße: Die Größe des Speicherplatzes, der für eine Datei auf einem Datenträger zugewiesen wird, die immer ein gerades Vielfaches der Clustergröße ist.
- Gültige Datenlänge: Die Länge der Daten in einer Datei, die tatsächlich in das Byte geschrieben wird. Dieser Wert ist immer kleiner oder gleich der Dateigröße.
Mit der SetFileValidData-Funktion können Sie das Füllen von Daten mit Nullen vermeiden, wenn Sie nicht in eine Datei schreiben. Die -Funktion macht die Daten in der Datei gültig, ohne in die Datei zu schreiben. Daher können, obwohl ein gewisser Leistungsgewinn erzielt werden kann, vorhandene Daten auf dem Datenträger aus zuvor vorhandenen Dateien versehentlich für unbeabsichtigte Leser verfügbar werden. Die folgenden Absätze enthalten eine ausführlichere Beschreibung dieses potenziellen Sicherheits- und Datenschutzproblems.
Ein Aufrufer muss beim anfänglichen Öffnen einer Datei über die Berechtigung SE_MANAGE_VOLUME_NAME aktiviert sein. Anwendungen sollten SetFileValidData nur für Dateien aufrufen, die den Zugriff auf Entitäten einschränken, die über SE_MANAGE_VOLUME_NAME Zugriff verfügen. Die Anwendung muss sicherstellen, dass die ungeschriebenen Bereiche der Datei niemals verfügbar gemacht werden, oder Sicherheitsprobleme können wie folgt auftreten.
Wenn SetFileValidData für eine Datei verwendet wird, wird der potenzielle Leistungsgewinn dadurch abgerufen, dass die zugeordneten Cluster für die Datei nicht mit Nullen gefüllt werden. Daher gibt das Lesen aus der Datei alles zurück, was die zugeordneten Cluster enthalten, möglicherweise Inhalte von anderen Benutzern. Dies ist an dieser Stelle nicht unbedingt ein Sicherheitsproblem, da der Aufrufer über SE_MANAGE_VOLUME_NAME Berechtigung verfügen muss, damit SetFileValidData erfolgreich ist und alle Daten auf dem Datenträger von diesen Benutzern gelesen werden können. Dieser Aufrufer kann diese Daten jedoch versehentlich für andere Benutzer verfügbar machen, die die SE_MANAGE_VOLUME_PRIVILEGE-Berechtigung nicht erhalten können, wenn folgendes gilt:
- Wenn die Datei nicht mit einem Freigabemodus geöffnet wurde, der andere Leser verweigert, kann ein nicht privilegierter Benutzer sie öffnen und die verfügbar gemachten Daten lesen.
- Wenn das System nicht mehr reagiert, bevor der Aufrufer die im Aufruf angegebene ValidDataLength geschrieben hat, kann ein solcher nicht privilegierter Benutzer bei einem Neustart die Datei öffnen und verfügbar gemachten Inhalt lesen.
Wenn der Aufrufer von SetFileValidData die Datei mit einer ausreichend restriktiven Zugriffssteuerung geöffnet hat, gelten die vorherigen Bedingungen nicht. Für teilweise geschriebene Dateien, die mit SetFileValidData erweitert wurden (d. h. das Schreiben wurde nicht bis zu der im Aufruf angegebenen ValidDataLength abgeschlossen) besteht jedoch noch ein weiteres potenzielles Sicherheitsrisiko in Bezug auf Datenschutz oder Sicherheit. Ein Administrator könnte die Datei auf ein Ziel kopieren, das nicht ordnungsgemäß mit restriktiven ACL-Berechtigungen gesteuert wird, sodass die Daten des erweiterten Bereichs versehentlich für nicht autorisiertes Lesen verfügbar sind.
Aus diesen Gründen wird SetFileValidData nicht für die allgemeine Verwendung empfohlen, zusätzlich zu Leistungsüberlegungen, wie unten erläutert.
Weitere Informationen zu Sicherheit und Zugriffsberechtigungen finden Sie unter Ausführen mit speziellen Berechtigungen und Dateisicherheit und Zugriffsrechten.
Sie können die SetFileValidData-Funktion verwenden, um unter sehr bestimmten Umständen große Dateien zu erstellen, sodass die Leistung der nachfolgenden Datei-E/A besser sein kann als andere Methoden. Insbesondere wenn der erweiterte Teil der Datei groß ist und nach dem Zufallsprinzip geschrieben wird, z. B. in einer Datenbankanwendung, ist die Zeit, die benötigt wird, um die Datei zu erweitern und in die Datei zu schreiben, schneller als die Verwendung von SetEndOfFile und zufälliges Schreiben. In den meisten anderen Situationen gibt es bei der Verwendung von SetFileValidData in der Regel keinen Leistungsgewinn, und manchmal kann es zu Leistungseinbußen kommen.
Unter Windows 8 und Windows Server 2012 wird diese Funktion von den folgenden Technologien unterstützt.
Technologie | Unterstützt |
---|---|
SMB 3.0-Protokoll (Server Message Block) | Ja |
SMB 3.0 Transparent Failover (TFO) | Ja |
SMB 3.0 mit Dateifreigaben mit horizontaler Skalierung (SO) | Ja |
Dateisystem mit freigegebenen Clustervolumes (CsvFS) | Ja |
Robustes Dateisystem (Resilient File System, ReFS) | Ja |
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | fileapi.h (Einschließen von Windows.h) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |