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.

Hati Penggunaan fungsi ini tanpa pertimbangan keamanan yang tepat dapat membahayakan privasi dan keamanan data. 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.

Catatan File tidak dapat berupa file jaringan, atau dikompresi, jarang, atau ditransaksikan.
 

[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.
Biasanya, fungsi SetFileValidData digunakan oleh aplikasi tingkat sistem pada data privat mereka sendiri. Tidak semua sistem file menggunakan panjang data yang valid. Beberapa sistem file dapat melacak beberapa rentang data yang valid. Secara umum, sebagian besar aplikasi tidak perlu memanggil fungsi ini.

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

Lihat juga

Fungsi Manajemen File

SetEndOfFile