Fungsi SetFileValidData (fileapi.h)
Mengatur panjang data yang valid dari file yang ditentukan. Fungsi ini berguna dalam skenario yang sangat terbatas. Untuk informasi lebih lanjut, lihat bagian Keterangan.
Sintaks
BOOL SetFileValidData(
[in] HANDLE hFile,
[in] LONGLONG ValidDataLength
);
Parameter
[in] hFile
Handel ke file. File harus dibuka dengan hak akses GENERIC_WRITE , dan hak istimewa SE_MANAGE_VOLUME_NAME diaktifkan. Untuk informasi selengkapnya, lihat Keamanan File dan Hak Akses.
[in] ValidDataLength
Panjang data baru yang valid.
Parameter ini harus berupa nilai positif yang lebih besar dari panjang data yang valid saat ini, tetapi kurang dari ukuran file saat ini.
Menampilkan nilai
Jika fungsi berhasil, nilai yang dikembalikan bukan nol.
Jika fungsi gagal, nilai yang dikembalikan adalah 0. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Keterangan
Fungsi SetFileValidData mengatur akhir logis file. Untuk mengatur ukuran file, gunakan fungsi SetEndOfFile . Ukuran file fisik juga disebut sebagai akhir file.
Setiap aliran file memiliki properti berikut:
- Ukuran file: ukuran data dalam file, ke byte.
- Ukuran alokasi: ukuran ruang yang dialokasikan untuk file pada disk, yang selalu merupakan kelipatan bahkan dari ukuran kluster.
- Panjang data yang valid: panjang data dalam file yang benar-benar ditulis, ke byte. Nilai ini selalu kurang dari atau sama dengan ukuran file.
Fungsi SetFileValidData memungkinkan Anda menghindari pengisian data dengan nol saat menulis secara tidak berurut ke file. Fungsi ini membuat data dalam file valid tanpa menulis ke file. Akibatnya, meskipun beberapa perolehan performa dapat diwujudkan, data yang ada pada disk dari file yang ada sebelumnya secara tidak sengaja dapat tersedia untuk pembaca yang tidak diinginkan. Paragraf berikut memberikan deskripsi yang lebih rinci tentang potensi masalah keamanan dan privasi ini.
Penelepon harus mengaktifkan hak istimewa SE_MANAGE_VOLUME_NAME saat membuka file pada awalnya. Aplikasi harus memanggil SetFileValidData hanya pada file yang membatasi akses ke entitas yang memiliki akses SE_MANAGE_VOLUME_NAME . Aplikasi harus memastikan bahwa rentang file yang tidak ditulis tidak pernah terekspos, atau masalah keamanan dapat mengakibatkan sebagai berikut.
Jika SetFileValidData digunakan pada file, potensi perolehan performa diperoleh dengan tidak mengisi kluster yang dialokasikan untuk file dengan nol. Oleh karena itu, membaca dari file akan mengembalikan apa pun yang dikandung kluster yang dialokasikan, berpotensi konten dari pengguna lain. Ini belum tentu masalah keamanan pada saat ini, karena pemanggil harus memiliki hak istimewa SE_MANAGE_VOLUME_NAME agar SetFileValidData berhasil, dan semua data pada disk dapat dibaca oleh pengguna tersebut. Namun, penelepon ini secara tidak sengaja dapat mengekspos data ini ke pengguna lain yang tidak dapat memperoleh hak istimewa SE_MANAGE_VOLUME_PRIVILEGE jika hal berikut ini ditangguhkan:
- Jika file tidak dibuka dengan mode berbagi yang menolak pembaca lain, pengguna yang tidak memiliki hak istimewa dapat membukanya dan membaca data yang diekspos.
- Jika sistem berhenti merespons sebelum penelepon selesai menulis ValidDataLength yang disediakan dalam panggilan, maka, pada boot ulang, pengguna yang tidak memiliki hak istimewa seperti itu dapat membuka file dan membaca konten yang diekspos.
Jika pemanggil SetFileValidData membuka file dengan kontrol akses yang cukup ketat, kondisi sebelumnya tidak akan berlaku. Namun, untuk file yang ditulis sebagian diperluas dengan SetFileValidData (artinya, penulisan tidak diselesaikan hingga ValidDataLength yang disediakan dalam panggilan) ada potensi privasi atau kerentanan keamanan lainnya. Administrator dapat menyalin file ke target yang tidak dikontrol dengan benar dengan izin ACL yang ketat, sehingga secara tidak sengaja mengekspos data area yang diperluas ke pembacaan yang tidak sah.
Karena alasan inilah SetFileValidData tidak direkomendasikan untuk penggunaan tujuan umum, selain pertimbangan performa, seperti yang dibahas di bawah ini.
Untuk informasi selengkapnya tentang keamanan dan hak akses, lihat Menjalankan dengan Hak Istimewa dan Keamanan File dan Hak Akses.
Anda dapat menggunakan fungsi SetFileValidData untuk membuat file besar dalam keadaan yang sangat spesifik sehingga performa I/O file berikutnya bisa lebih baik daripada metode lainnya. Secara khusus, jika bagian file yang diperluas besar dan akan ditulis secara acak, seperti dalam jenis aplikasi database, waktu yang diperlukan untuk memperluas dan menulis ke file akan lebih cepat daripada menggunakan SetEndOfFile dan menulis secara acak. Dalam sebagian besar situasi lain, biasanya tidak ada perolehan performa untuk menggunakan SetFileValidData, dan kadang-kadang mungkin ada penalti performa.
Di Windows 8 dan Windows Server 2012, fungsi ini didukung oleh teknologi berikut.
Teknologi | Didukung |
---|---|
Protokol Server Message Block (SMB) 3.0 | Ya |
SMB 3.0 Transparent Failover (TFO) | Ya |
SMB 3.0 dengan Scale-out File Shares (SO) | Ya |
Sistem File Volume Bersama Kluster (CsvFS) | Ya |
Sistem File Tangguh (ReFS) | Ya |
Persyaratan
Klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2003 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | fileapi.h (sertakan Windows.h) |
Pustaka | Kernel32.lib |
DLL | Kernel32.dll |