Fungsi IoCreateFileSpecifyDeviceObjectHint (ntddk.h)
Rutinitas IoCreateFileSpecifyDeviceObjectHint digunakan oleh driver filter sistem file untuk mengirim permintaan buat hanya ke filter di bawah objek perangkat tertentu dan ke sistem file.
Sintaks
NTSTATUS IoCreateFileSpecifyDeviceObjectHint(
[out] PHANDLE FileHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[in, optional] PLARGE_INTEGER AllocationSize,
[in] ULONG FileAttributes,
[in] ULONG ShareAccess,
[in] ULONG Disposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] CREATE_FILE_TYPE CreateFileType,
[in, optional] PVOID InternalParameters,
[in] ULONG Options,
[in, optional] PVOID DeviceObject
);
Parameter
[out] FileHandle
Penunjuk ke variabel yang menerima handel untuk objek file jika panggilan ini berhasil.
[in] DesiredAccess
Bitmask bendera yang menentukan jenis akses yang diperlukan pemanggil ke file atau direktori. Kumpulan bendera DesiredAccess yang ditentukan sistem menentukan hak akses khusus berikut untuk objek file.
Bendera DesiredAccess | Makna |
---|---|
DELETE | File dapat dihapus. |
FILE_READ_DATA | Data dapat dibaca dari file . |
FILE_READ_ATTRIBUTES | Bendera FileAttributes , dijelaskan nanti, dapat dibaca. |
FILE_READ_EA | Atribut yang diperluas (EA) yang terkait dengan file dapat dibaca. |
READ_CONTROL | Daftar kontrol akses (ACL) dan informasi kepemilikan yang terkait dengan file dapat dibaca. |
FILE_WRITE_DATA | Data dapat ditulis ke file. |
FILE_WRITE_ATTRIBUTES | Bendera FileAttributes dapat ditulis. |
FILE_WRITE_EA | Atribut yang diperluas yang terkait dengan file dapat ditulis. |
FILE_APPEND_DATA | Data dapat ditambahkan ke file. |
WRITE_DAC | Daftar kontrol akses diskresi (DACL) yang terkait dengan file dapat ditulis. |
WRITE_OWNER | Informasi kepemilikan yang terkait dengan file dapat ditulis. |
MENSINKRONISASI | Pemanggil dapat menyinkronkan penyelesaian operasi I/O dengan menunggu FileHandle yang dikembalikan diatur ke status Sinyal. Bendera ini harus diatur jika bendera CreateOptions FILE_SYNCHRONOUS_IO_ALERT atau FILE_SYNCHRONOUS_IO_NONALERT diatur. |
FILE_EXECUTE | Data dapat dibaca ke dalam memori dari file menggunakan I/O halaman sistem. |
Pemanggil IoCreateFileSpecifyDeviceObjectHint dapat menentukan satu atau kombinasi dari berikut ini, mungkin ORed dengan bendera kompatibel tambahan dari daftar benderaDesiredAccess sebelumnya, untuk objek file apa pun yang tidak mewakili file direktori:
DesiredAccess untuk nilai file | Peta ke bendera DesiredAccess |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA, dan SINKRONKAN. |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA, dan SINKRONKAN. |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE, SINKRONKAN, FILE_READ_ATTRIBUTES, dan FILE_EXECUTE. |
STANDARD_RIGHTS_XXX adalah nilai sistem yang telah ditentukan sebelumnya yang digunakan untuk menegakkan keamanan pada objek sistem.
Jika bendera FILE_DIRECTORY_FILE CreateOptions diatur, pemanggil IoCreateFileSpecifyDeviceObjectHint dapat menentukan satu atau kombinasi dari berikut ini, mungkin ORed dengan satu atau beberapa bendera yang kompatibel dari daftar benderaDesiredAccess sebelumnya.
DesiredAccess ke nilai direktori | Makna |
---|---|
FILE_LIST_DIRECTORY | File dalam direktori dapat dicantumkan. |
FILE_TRAVERSE | Direktori dapat dilalui: yaitu, dapat menjadi bagian dari nama jalur file. |
Bendera FILE_READ_DATA, FILE_WRITE_DATA, FILE_EXECUTE, dan FILE_APPEND_DATA DesiredAccess tidak kompatibel dengan membuat atau membuka file direktori.
[in] ObjectAttributes
Penunjuk ke struktur OBJECT_ATTRIBUTES yang sudah diinisialisasi oleh rutinitas InitializeObjectAttributes . Jika pemanggil berjalan dalam konteks proses sistem, parameter ini (ObjectAttributes) bisa null. Jika tidak, penelepon harus mengatur atribut OBJ_KERNEL_HANDLE dalam panggilan ke rutinitas InitializeObjectAttributes . Anggota struktur OBJECT_ATTRIBUTES untuk objek file menyertakan yang berikut ini.
Anggota | Nilai |
---|---|
ULONGLength | Menentukan jumlah byte data ObjectAttributes yang disediakan. Nilai ini harus setidaknya ukuranof(OBJECT_ATTRIBUTES). |
PUNICODE_STRING ObjectName | Penunjuk ke string Unicode yang di-buffer dengan nama file yang akan dibuat atau dibuka. Nilai ini harus merupakan spesifikasi file yang sepenuhnya memenuhi syarat, kecuali itu adalah nama file yang relatif terhadap direktori yang ditentukan oleh RootDirectory. Misalnya, \Device\Floppy1\myfile.dat atau \?? \B:\myfile.dat bisa menjadi spesifikasi file yang sepenuhnya memenuhi syarat, asalkan driver floppy dan sistem file yang terlalu besar sudah dimuat. (Perhatikan bahwa \?? mengganti \DosDevices sebagai nama namespace objek Win32. \DosDevices masih akan berfungsi, tetapi \?? diterjemahkan lebih cepat oleh manajer objek.) |
HANDLERootDirectory | Secara opsional menentukan handel ke direktori yang diperoleh oleh panggilan sebelumnya ke IoCreateFileSpecifyDeviceObjectHint. Jika nilai ini NULL, anggota ObjectName harus menjadi spesifikasi file yang sepenuhnya memenuhi syarat yang menyertakan jalur lengkap ke file target. Jika nilai ini bukan NULL, anggota ObjectName menentukan nama file yang relatif terhadap direktori ini. |
PSECURITY_DESCRIPTOR SecurityDescriptor | Secara opsional menentukan deskriptor keamanan yang akan diterapkan ke file. ACL yang ditentukan oleh deskriptor keamanan seperti itu hanya diterapkan ke file saat dibuat. Jika nilainya ADALAH NULL saat file dibuat, ACL yang ditempatkan pada file bergantung pada sistem file; sebagian besar sistem file menyebarkan beberapa bagian dari ACL seperti itu dari file direktori induk yang dikombinasikan dengan ACL default pemanggil. |
ULONGAttributes | Sekumpulan bendera yang mengontrol atribut objek file. Jika pemanggil berjalan dalam konteks proses sistem, parameter ini bisa nol. Jika tidak, penelepon harus mengatur bendera OBJ_KERNEL_HANDLE. Pemanggil juga dapat secara opsional mengatur bendera OBJ_CASE_INSENSITIVE, yang menunjukkan bahwa kode pencarian nama harus mengabaikan kasus ObjectName daripada melakukan pencarian yang sama persis. |
[out] IoStatusBlock
Penunjuk ke struktur IO_STATUS_BLOCK yang menerima status penyelesaian akhir dan informasi tentang operasi yang diminta. Saat kembali dari IoCreateFileSpecifyDeviceObjectHint, anggota Informasi berisi salah satu nilai berikut:
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
Secara opsional menentukan ukuran alokasi awal, dalam byte, untuk file. Nilai bukan nol tidak berpengaruh kecuali file sedang dibuat, ditimpa, atau digantikan.
[in] FileAttributes
Atribut yang ditentukan secara eksplisit hanya diterapkan saat file dibuat, digantikan, atau, dalam beberapa kasus, ditimpa. Secara default, nilai ini FILE_ATTRIBUTE_NORMAL, yang dapat ditimpa oleh bendera lain atau dengan kombinasi ORed dari bendera yang kompatibel. Bendera FileAttributes yang mungkin mencakup yang berikut ini.
Bendera FileAttributes | Makna |
---|---|
FILE_ATTRIBUTE_NORMAL | File dengan atribut standar harus dibuat. |
FILE_ATTRIBUTE_READONLY | File baca-saja harus dibuat. |
FILE_ATTRIBUTE_HIDDEN | File tersembunyi harus dibuat. |
FILE_ATTRIBUTE_SYSTEM | File sistem harus dibuat. |
FILE_ATTRIBUTE_ARCHIVE | File harus ditandai sehingga akan diarsipkan. |
FILE_ATTRIBUTE_TEMPORARY | File sementara harus dibuat. |
[in] ShareAccess
Menentukan jenis akses berbagi ke file yang diinginkan pemanggil, sebagai nol, atau satu, atau kombinasi bendera berikut. Untuk meminta akses eksklusif, atur parameter ini ke nol. Jika bendera IO_IGNORE_SHARE_ACCESS_CHECK ditentukan dalam parameter Opsi , manajer I/O mengabaikan parameter ini. Namun, sistem file mungkin masih melakukan pemeriksaan akses. Dengan demikian, penting untuk menentukan mode berbagi yang Anda inginkan untuk parameter ini, bahkan saat menggunakan bendera IO_IGNORE_SHARE_ACCESS_CHECK. Untuk kemungkinan terbesar menghindari kesalahan pelanggaran berbagi, tentukan semua bendera akses berbagi berikut.
Bendera ShareAccess | Makna |
---|---|
FILE_SHARE_READ | File dapat dibuka untuk akses baca oleh utas lain. |
FILE_SHARE_WRITE | File dapat dibuka untuk akses tulis oleh utas lain. |
FILE_SHARE_DELETE | File dapat dibuka untuk akses penghapusan oleh utas lain. |
[in] Disposition
Menentukan nilai yang menentukan tindakan yang akan diambil, tergantung pada apakah file sudah ada. Nilainya bisa salah satu dari yang dijelaskan berikut ini.
Nilai disposisi | Makna |
---|---|
FILE_SUPERSEDE | Jika file sudah ada, ganti dengan file yang diberikan. Jika tidak, buat file yang diberikan. |
FILE_CREATE | Jika file sudah ada, gagalkan permintaan dan jangan membuat atau membuka file yang diberikan. Jika tidak, buat file yang diberikan. |
FILE_OPEN | Jika file sudah ada, buka alih-alih membuat file baru. Jika tidak, gagalkan permintaan dan jangan buat file baru. |
FILE_OPEN_IF | Jika file sudah ada, buka file tersebut. Jika tidak, buat file yang diberikan. |
FILE_OVERWRITE | Jika file sudah ada, buka dan timpa. Jika tidak, gagalkan permintaan. |
FILE_OVERWRITE_IF | Jika file sudah ada, buka dan timpa. Jika tidak, buat file yang diberikan. |
[in] CreateOptions
Menentukan opsi yang akan diterapkan saat membuat atau membuka file. Opsi ini ditentukan sebagai kombinasi bendera berikut yang kompatibel.
Bendera CreateOptions | Makna |
---|---|
FILE_DIRECTORY_FILE | File yang sedang dibuat atau dibuka adalah file direktori. Jika bendera ini diatur, parameter Disposisi harus diatur ke salah satu FILE_CREATE, FILE_OPEN, atau FILE_OPEN_IF. Bendera ini kompatibel dengan bendera CreateOptions berikut: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT, dan FILE_OPEN_BY_FILE_ID. |
FILE_NON_DIRECTORY_FILE | File yang sedang dibuka tidak boleh berupa file direktori atau panggilan ini akan gagal. Objek file yang sedang dibuka harus mewakili file data. |
FILE_WRITE_THROUGH | Layanan sistem, FSD, dan driver yang menulis data ke file harus benar-benar mentransfer data ke dalam file sebelum operasi tulis yang diminta dianggap selesai. |
FILE_SEQUENTIAL_ONLY | Semua akses ke file akan berurutan. |
FILE_RANDOM_ACCESS | Akses ke file bisa acak, jadi tidak ada operasi read-ahead berurutan yang harus dilakukan pada file oleh FSD atau sistem. |
FILE_NO_INTERMEDIATE_BUFFERING | File tidak dapat di-cache atau di-buffer dalam buffer internal driver. Bendera ini tidak kompatibel dengan bendera desiredAccess FILE_APPEND_DATA. |
FILE_SYNCHRONOUS_IO_ALERT | Semua operasi pada file dilakukan secara sinkron. Setiap tunggu atas nama pemanggil tunduk pada penghentian dini dari pemberitahuan. Bendera ini juga menyebabkan sistem I/O mempertahankan konteks posisi file. Jika bendera ini diatur, bendera DesiredAccess SYNCHRONIZE juga harus diatur. |
FILE_SYNCHRONOUS_IO_NONALERT | Semua operasi pada file dilakukan secara sinkron. Menunggu yang ada di sistem untuk menyinkronkan antrean dan penyelesaian I/O tidak tunduk pada pemberitahuan. Bendera ini juga menyebabkan sistem I/O mempertahankan konteks posisi file. Jika bendera ini diatur, bendera DesiredAccess SYNCHRONIZE juga harus diatur. |
FILE_CREATE_TREE_CONNECTION | Buat koneksi pohon untuk file ini untuk membukanya melalui jaringan. |
FILE_COMPLETE_IF_OPLOCKED | Selesaikan operasi ini segera dengan kode keberhasilan alternatif jika file target di-oplock, daripada memblokir utas pemanggil. Jika file di-oplock, penelepon lain sudah memiliki akses ke file melalui jaringan. |
FILE_NO_EA_KNOWLEDGE | Jika atribut yang diperluas pada file yang ada dibuka menunjukkan bahwa pemanggil harus memahami EA untuk menginterpretasikan file dengan benar, gagalkan permintaan ini karena pemanggil tidak memahami cara menangani EA. |
FILE_OPEN_REPARSE_POINT | Buka file dengan titik pemisahan ulang dan lewati pemrosesan titik pemilah ulang normal untuk file. Untuk informasi selengkapnya, lihat bagian Keterangan di bawah ini. |
FILE_DELETE_ON_CLOSE | Hapus file ketika handel terakhir diteruskan ke ZwClose. |
FILE_OPEN_BY_FILE_ID | Nama file yang ditentukan dalam parameter ObjectAttributes menyertakan nomor referensi file 8-byte untuk file tersebut. Nomor ini ditetapkan oleh sistem file dan khusus untuk sistem file. Jika file adalah titik pemisahan ulang, nama file juga menyertakan nama perangkat. Catatan: Sistem file FAT tidak mendukung FILE_OPEN_BY_FILE_ID. |
FILE_OPEN_FOR_BACKUP_INTENT | File sedang dibuka untuk niat pencadangan, oleh karena itu, sistem harus memeriksa hak akses tertentu dan memberi pemanggil akses yang sesuai ke file sebelum memeriksa input DesiredAccess terhadap deskriptor keamanan file. |
FILE_OPEN_REQUIRING_OPLOCK | File sedang dibuka dan kunci oportunistik (oplock) pada file diminta sebagai operasi atom tunggal. Sistem file memeriksa oplock sebelum melakukan operasi pembuatan, dan operasi pembuatan gagal dengan kode pengembalian STATUS_CANNOT_BREAK_OPLOCK jika pembuatan akan merusak oplock yang ada. |
FILE_RESERVE_OPFILTER | Bendera ini memungkinkan aplikasi untuk meminta kunci oportunistik filter (oplock) untuk mencegah aplikasi lain mendapatkan pelanggaran berbagi. Jika sudah ada handel terbuka, permintaan buat gagal dengan STATUS_OPLOCK_NOT_GRANTED. Untuk informasi selengkapnya, lihat bagian Keterangan berikut ini. |
[in, optional] EaBuffer
Penunjuk ke buffer terstruktur FILE_FULL_EA_INFORMATION yang disediakan penelepon yang berisi informasi atribut yang diperluas (EA) untuk diterapkan ke file.
[in] EaLength
Panjangnya, dalam byte, dari EaBuffer.
[in] CreateFileType
Driver harus mengatur parameter ini ke CreateFileTypeNone.
[in, optional] InternalParameters
Driver harus mengatur parameter ini ke NULL.
[in] Options
Menentukan opsi yang akan digunakan selama pembuatan permintaan pembuatan. Tabel berikut ini mencantumkan opsi yang tersedia.
Bendera opsi | Makna |
---|---|
IO_FORCE_ACCESS_CHECK | Menunjukkan bahwa manajer I/O harus memeriksa permintaan buat terhadap deskriptor keamanan file. |
IO_IGNORE_SHARE_ACCESS_CHECK | Menunjukkan bahwa manajer I/O tidak boleh melakukan pemeriksaan akses berbagi pada objek file setelah dibuat. Namun, sistem file mungkin masih melakukan pemeriksaan ini. |
[in, optional] DeviceObject
Penunjuk ke objek perangkat tempat permintaan pembuatan akan dikirim. Objek perangkat harus berupa objek perangkat sistem filter atau file dalam tumpukan driver sistem file untuk volume tempat file atau direktori berada. Parameter ini bersifat opsional dan dapat berupa NULL. Jika parameter ini NULL, permintaan akan dikirim ke objek perangkat di bagian atas tumpukan driver.
Mengembalikan nilai
IoCreateFileSpecifyDeviceObjectHint mengembalikan STATUS_SUCCESS atau nilai NTSTATUS yang sesuai seperti salah satu hal berikut ini:
Menampilkan kode | Deskripsi |
---|---|
STATUS_INVALID_DEVICE_OBJECT_PARAMETER | DeviceObject yang ditentukan tidak dilampirkan ke tumpukan driver sistem file untuk volume yang ditentukan dalam nama file atau direktori. Kesalahan ini juga dapat terjadi jika nama berisi titik pemisahan ulang selain titik pemasangan. |
STATUS_MOUNT_POINT_NOT_RESOLVED | Nama file atau direktori berisi titik pemasangan yang diselesaikan ke volume selain yang dilampirkan deviceObject yang ditentukan. |
STATUS_OBJECT_PATH_SYNTAX_BAD |
IoCreateFileSpecifyDeviceObjectHint mungkin mengembalikan STATUS_FILE_LOCK_CONFLICT sebagai nilai yang dikembalikan atau di anggota Status struktur IO_STATUS_BLOCK yang ditunjukkan oleh parameter IoStatusBlock. Ini hanya akan terjadi jika file log NTFS penuh, dan terjadi kesalahan saat IoCreateFileSpecifyDeviceObjectHint mencoba menangani situasi ini.
Keterangan
Rutinitas ini digunakan oleh driver filter sistem file untuk mengirim permintaan buat hanya ke filter di bawah objek perangkat tertentu dan ke sistem file. Filter yang dilampirkan di atas objek perangkat yang ditentukan di tumpukan driver tidak menerima permintaan pembuatan.
Rutinitas Windows Vista IoCreateFileEx mirip dengan rutinitas IoCreateFileSpecifyDeviceObjectHint tetapi menyediakan fungsionalitas yang lebih besar daripada rutinitas IoCreateFileSpecifyDeviceObjectHint , termasuk akses ke parameter pembuatan ekstra (ECP) dan informasi transaksi.
Jika Anda menggunakan rutinitas IoCreateFileEx alih-alih rutinitas IoCreateFileSpecifyDeviceObjectHint , perhatikan bahwa parameter DriverContext dari rutinitas IoCreateFileSpecifyDeviceObjectHint telah dipindahkan ke anggota DeviceObjectHint dari struktur IO_DRIVER_CREATE_CONTEXT . Struktur IO_DRIVER_CREATE_CONTEXT diteruskan ke rutinitas IoCreateFileEx melalui parameter DriverContext-nya .
Driver filter sistem file memanggil IoCreateFileSpecifyDeviceObjectHint untuk mengirim permintaan buat hanya ke objek perangkat tertentu, filter yang terpasang di bawahnya, dan sistem file. Filter yang terpasang di atas objek perangkat yang ditentukan di tumpukan driver tidak menerima permintaan buat. Hal yang sama berlaku untuk setiap pembersihan atau menutup permintaan pada objek file yang dibuat oleh IoCreateFileSpecifyDeviceObjectHint.
Ada dua cara alternatif untuk menentukan nama file yang akan dibuat atau dibuka menggunakan IoCreateFileSpecifyDeviceObjectHint:
Sebagai nama jalur yang sepenuhnya memenuhi syarat, disediakan di anggota ObjectName dari input ObjectAttributes
Sebagai nama jalur relatif terhadap file direktori yang diwakili oleh handel di anggota RootDirectory dari input ObjectAttributes
Setiap handel yang diperoleh dari IoCreateFileSpecifyDeviceObjectHint akhirnya harus dirilis dengan memanggil ZwClose.
Rutinitas driver yang berjalan dalam konteks proses selain dari proses sistem harus mengatur atribut OBJ_KERNEL_HANDLE untuk parameter ObjectAttributes dari IoCreateFileSpecifyDeviceObjectHint. Ini membatasi penggunaan handel yang dikembalikan oleh IoCreateFileSpecifyDeviceObjectHint untuk memproses yang berjalan dalam mode kernel. Jika tidak, handel dapat diakses oleh proses dalam konteks driver yang berjalan.
Bendera DesiredAccess tertentu dan kombinasi bendera memiliki efek berikut:
Agar penelepon menyinkronkan penyelesaian I/O dengan menunggu FileHandle yang dikembalikan diatur ke status Sinyal, bendera SYNCHRONIZE harus diatur.
Jika hanya bendera FILE_APPEND_DATA dan SYNCHRONIZE yang diatur, pemanggil hanya dapat menulis ke akhir file, dan informasi offset apa pun tentang penulisan ke file diabaikan. Namun, file akan secara otomatis diperpanjang seperlunya untuk jenis operasi tulis ini.
Mengatur bendera FILE_WRITE_DATA untuk file juga memungkinkan penulisan di luar akhir file terjadi. File secara otomatis diperluas untuk jenis penulisan ini juga.
Jika hanya bendera FILE_EXECUTE dan SYNCHRONIZE yang diatur, pemanggil tidak dapat langsung membaca atau menulis data apa pun dalam file menggunakan FileHandle yang dikembalikan; artinya, semua operasi pada file terjadi melalui pager sistem sebagai respons terhadap instruksi dan akses data.
Parameter ShareAccess menentukan apakah utas terpisah dapat mengakses file yang sama, mungkin secara bersamaan. Asalkan kedua pembuka file memiliki hak istimewa untuk mengakses file dengan cara yang ditentukan, file dapat berhasil dibuka dan dibagikan. Jika pemanggil asli IoCreateFileSpecifyDeviceObjectHint tidak menentukan FILE_SHARE_READ, FILE_SHARE_WRITE, atau FILE_SHARE_DELETE, tidak ada operasi terbuka lain yang dapat dilakukan pada file: yaitu, pemanggil asli diberikan akses eksklusif ke file.
Agar file bersama berhasil dibuka, DesiredAccess yang diminta ke file harus kompatibel dengan spesifikasi DesiredAccess dan ShareAccess dari semua bukaan sebelumnya yang belum dirilis dengan ZwClose. Artinya, DesiredAccess yang ditentukan untuk IoCreateFileSpecifyDeviceObjectHint untuk file tertentu tidak boleh bertentangan dengan akses yang tidak diizinkan oleh pembuka file lain.
Jika IO_IGNORE_SHARE_ACCESS_CHECK ditentukan dalam parameter Opsi , manajer I/O mengabaikan parameter ShareAccess . Namun, sistem file mungkin masih melakukan pemeriksaan akses. Dengan demikian, penting untuk menentukan mode berbagi yang Anda inginkan untuk parameter ShareAccess , bahkan saat menggunakan bendera IO_IGNORE_SHARE_ACCESS_CHECK.
Nilai Disposisi FILE_SUPERSEDE mengharuskan pemanggil memiliki akses DELETE ke objek file yang ada. Jika demikian, panggilan yang berhasil ke IoCreateFileSpecifyDeviceObjectHint dengan FILE_SUPERSEDE pada file yang ada secara efektif menghapus file tersebut, lalu membuatnya kembali. Ini menyiratkan bahwa jika file telah dibuka oleh utas lain, file akan dibuka dengan menentukan parameter ShareAccess dengan set bendera FILE_SHARE_DELETE. Perhatikan bahwa jenis disposisi ini konsisten dengan gaya POSIX menimpa file.
Nilai Disposisi FILE_OVERWRITE_IF dan FILE_SUPERSEDE serupa. Jika IoCreateFileSpecifyDeviceObjectHint dipanggil dengan file yang ada dan salah satu nilai Disposisi ini, file akan diganti.
Menimpa file secara semantik setara dengan operasi penggantian, kecuali untuk hal berikut:
Pemanggil harus memiliki akses tulis ke file, bukan menghapus akses. Ini menyiratkan bahwa jika file telah dibuka oleh utas lain, file akan dibuka dengan bendera FILE_SHARE_WRITE yang diatur dalam input ShareAccess.
Atribut file yang ditentukan secara logis ORed dengan yang sudah ada di file. Ini menyiratkan bahwa jika file telah dibuka oleh utas lain, penelepon berikutnya dari IoCreateFileSpecifyDeviceObjectHint tidak dapat menonaktifkan bendera FileAttributes yang ada tetapi dapat mengaktifkan bendera tambahan untuk file yang sama.
Nilai FILE_DIRECTORY_FILE CreateOptions menentukan bahwa file yang akan dibuat atau dibuka adalah file direktori. Ketika file direktori dibuat, sistem file membuat struktur yang sesuai pada disk untuk mewakili direktori kosong untuk struktur on-disk sistem file tertentu. Jika opsi ini ditentukan dan file yang diberikan untuk dibuka bukan file direktori, atau jika pemanggil menentukan nilai CreateOptions atau Disposition yang tidak konsisten, panggilan ke IoCreateFileSpecifyDeviceObjectHint akan gagal.
Bendera createOptions FILE_NO_INTERMEDIATE_BUFFERING mencegah sistem file melakukan buffering perantara atas nama pemanggil. Menentukan nilai ini menempatkan batasan tertentu pada parameter pemanggil ke Zw lainnya. Rutinitas file, termasuk yang berikut ini:
Nilai Byte Offset apa pun yang diteruskan ke ZwReadFile atau ZwWriteFile harus berupa kelipatan ukuran sektor perangkat yang mendasar.
Panjang yang diteruskan ke ZwReadFile atau ZwWriteFile harus berupa kelipatan ukuran sektor. Perhatikan bahwa menentukan operasi baca ke buffer yang panjangnya persis dengan ukuran sektor dapat mengakibatkan lebih sedikit jumlah byte signifikan yang ditransfer ke buffer tersebut jika akhir file tercapai selama transfer.
Buffer harus diselaraskan sesuai dengan persyaratan penyelarasan perangkat yang mendasar. Informasi ini dapat diperoleh dengan memanggil IoCreateFileSpecifyDeviceObjectHint untuk mendapatkan handel untuk objek file yang mewakili perangkat fisik dan kemudian memanggil ZwQueryInformationFile dengan handel tersebut. Untuk daftar nilai sistem FILE_XXX_ALIGNMENT, lihat DEVICE_OBJECT.
Panggilan ke ZwSetInformationFile dengan parameter FileInformationClass yang diatur ke FilePositionInformation harus menentukan offset yang merupakan kelipatan ukuran sektor.
CreateOptions yang saling eksklusif, FILE_SYNCHRONOUS_IO_ALERT dan FILE_SYNCHRONOUS_IO_NONALERT, menentukan bahwa semua operasi I/O pada file harus sinkron selama terjadi melalui objek file yang dimaksud oleh FileHandle yang dikembalikan. Semua I/O pada file tersebut diserialisasikan di semua utas menggunakan handel yang dikembalikan. Dengan salah satu CreateOptions ini, bendera DesiredAccess SYNCHRONIZE harus diatur sehingga Manajer I/O akan menggunakan objek file sebagai objek sinkronisasi. Dengan salah satu dari set CreateOptions ini, Manajer I/O mempertahankan "konteks posisi file" untuk objek file, offset posisi file internal saat ini. Offset ini dapat digunakan dalam panggilan ke ZwReadFile dan ZwWriteFile. Posisinya juga dapat dikueri dengan memanggil ZwQueryInformationFile, atau diatur dengan memanggil ZwSetInformationFile.
Jika bendera CreateOptions FILE_OPEN_REPARSE_POINT tidak ditentukan dan IoCreateFileSpecifyDeviceObjectHint mencoba membuka file dengan titik pemilah ulang, pemrosesan titik pemisahan ulang normal terjadi untuk file. Jika, di sisi lain, bendera FILE_OPEN_REPARSE_POINT ditentukan, pemrosesan reparse normal tidak terjadi dan IoCreateFileSpecifyDeviceObjectHint mencoba untuk langsung membuka file titik pemisahan ulang. Dalam kedua kasus, jika operasi terbuka berhasil, IoCreateFileSpecifyDeviceObjectHint mengembalikan STATUS_SUCCESS; jika tidak, rutinitas mengembalikan kode kesalahan NTSTATUS. IoCreateFileSpecifyDeviceObjectHint tidak pernah mengembalikan STATUS_REPARSE.
Bendera createOptions FILE_OPEN_REQUIRING_OPLOCK menghilangkan waktu antara saat Anda membuka file dan meminta oplock yang berpotensi memungkinkan pihak ketiga untuk membuka file dan mendapatkan pelanggaran berbagi. Aplikasi dapat menggunakan bendera FILE_OPEN_REQUIRING_OPLOCK pada IoCreateFileSpecifyDeviceObjectHint lalu meminta oplock apa pun. Ini memastikan bahwa pemilik oplock akan diberi tahu tentang permintaan terbuka apa pun nanti yang menyebabkan pelanggaran berbagi.
Di Windows 7, jika handel lain ada pada file ketika aplikasi menggunakan bendera FILE_OPEN_REQUIRING_OPLOCK, operasi pembuatan akan gagal dengan STATUS_OPLOCK_NOT_GRANTED. Pembatasan ini sudah tidak ada lagi dimulai dengan Windows 8.
Jika operasi pembuatan ini akan merusak oplock yang sudah ada pada file, maka mengatur bendera FILE_OPEN_REQUIRING_OPLOCK akan menyebabkan operasi pembuatan gagal dengan STATUS_CANNOT_BREAK_OPLOCK. Oplock yang ada tidak akan rusak oleh operasi pembuatan ini.
Aplikasi yang menggunakan bendera ini harus meminta oplock setelah panggilan ini berhasil, atau semua upaya selanjutnya untuk membuka file akan diblokir tanpa manfaat pemrosesan oplock yang khas. Demikian pula, jika panggilan ini berhasil tetapi permintaan oplock nanti gagal, aplikasi yang menggunakan bendera ini harus menutup handelnya setelah mendeteksi bahwa permintaan oplock telah gagal.
Bendera FILE_OPEN_REQUIRING_OPLOCK tersedia di Windows 7, Windows Server 2008 R2 dan sistem operasi Windows yang lebih baru. Sistem file Microsoft yang mengimplementasikan bendera ini di Windows 7 adalah NTFS, FAT, dan exFAT.
Bendera CreateOptions FILE_RESERVE_OPFILTER memungkinkan aplikasi untuk meminta tingkat 1, batch, atau filter oplock untuk mencegah aplikasi lain mendapatkan pelanggaran berbagi. Namun, FILE_RESERVE_OPFILTER hanya praktis berguna untuk oplock filter. Untuk menggunakannya, Anda harus menyelesaikan langkah-langkah berikut:
Terbitkan permintaan buat dengan CreateOptions FILE_RESERVE_OPFILTER, DesiredAccess dari FILE_READ_ATTRIBUTES, dan ShareAccess dari FILE_SHARE_READ yang tepat | FILE_SHARE_WRITE | FILE_SHARE_DELETE.
Jika sudah ada handel terbuka, permintaan buat akan gagal dengan STATUS_OPLOCK_NOT_GRANTED, dan oplock yang diminta berikutnya juga gagal.
Jika Anda membuka dengan lebih banyak akses atau lebih sedikit berbagi juga akan menyebabkan kegagalan STATUS_OPLOCK_NOT_GRANTED.
Jika permintaan pembuatan berhasil, minta oplock.
Buka handel lain ke file untuk melakukan I/O.
Langkah ketiga membuat ini praktis hanya untuk oplock filter. Handel yang dibuka di langkah 3 dapat memiliki DesiredAccess yang berisi maksimum FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | MENYINKRONKAN | READ_CONTROL dan masih tidak merusak oplock filter. Namun, DesiredAccess apa pun yang lebih besar dari FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE akan merusak oplock tingkat 1 atau batch dan membuat bendera FILE_RESERVE_OPFILTER tidak berguna untuk jenis oplock tersebut.
NTFS adalah satu-satunya sistem file Microsoft yang menerapkan FILE_RESERVE_OPFILTER.
IoCreateFileSpecifyDeviceObjectHint tidak dapat digunakan untuk mendapatkan handel ke volume.
Jika jalur nama file yang diteruskan ke IoCreateFileSpecifyDeviceObjectHint berisi titik pemisahan ulang, titik pemisahan ulang harus diselesaikan ke volume yang sama tempat file atau direktori berada. Jika tidak, kesalahan STATUS_INVALID_DEVICE_OBJECT_PARAMETER atau STATUS_MOUNT_POINT_NOT_RESOLVED dikembalikan.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Header | ntddk.h (termasuk Ntddk.h, Ntifs.h, FltKernel.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |