Fungsi FltCheckOplockEx (fltkernel.h)
Driver minifilter memanggil rutinitas FltCheckOplockEx untuk menyinkronkan struktur data panggilan balik untuk operasi I/O file berbasis IRP yang memiliki status kunci oportunistik (oplock) file saat ini.
Sintaks
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplockEx(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in] ULONG Flags,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Parameter
[in] Oplock
Penunjuk oplock buram untuk file. Pointer ini harus diinisialisasi oleh panggilan sebelumnya ke FltInitializeOplock.
[in] CallbackData
Penunjuk ke struktur FLT_CALLBACK_DATAdata panggilan balik untuk operasi I/O.
[in] Flags
Bitmask untuk operasi I/O file terkait. Driver minifilter mengatur bit untuk menentukan perilaku FltCheckOplockEx. Parameter Bendera memiliki opsi berikut:
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001)
Memungkinkan pemutusan kunci oportunistik untuk melanjutkan tanpa memblokir atau menunggu operasi yang menyebabkan jeda oplock.
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002)
Menentukan bahwa FltCheckOplockEx hanya boleh memeriksa kunci kunci oportunistik pada FILE_OBJECT yang terkait dengan operasi I/O. Operasi I/O ini diwakili oleh data panggilan balik yang ditunjuk oleh parameter CallbackData . FltCheckOplockEx kemudian harus menambahkan kunci jika kunci disediakan dalam operasi I/O. Tidak ada pemrosesan oplock lain yang terjadi; artinya, tidak ada pemutusan kunci oportunistik yang akan terjadi.
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004)
Menentukan bahwa FsRtlCheckOplockEx harus mengembalikan status apa pun yang sebelumnya disiapkan melalui panggilan ke rutinitas FltOplockFsctrl . FltOplockFsctrl dipanggil ketika permintaan IRP_MJ_CREATE diproses. Permintaan IRP_MJ_CREATE ini menentukan bendera FILE_OPEN_REQUIRING_OPLOCK dalam parameter opsi buat. Bendera OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK biasanya digunakan dalam pemrosesan akhir permintaan buat seperti itu ketika sebelumnya gagal.
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008)
Memungkinkan semua pemutusan kunci oportunistik untuk melanjutkan terlepas dari kunci kunci oportunistik.
[in, optional] Context
Penunjuk ke informasi konteks yang ditentukan pemanggil untuk diteruskan ke rutinitas panggilan balik yang ditunjukkan oleh WaitCompletionRoutine dan PrePostCallbackDataRoutine . Manajer Filter memperlakukan informasi ini sebagai buram.
[in, optional] WaitCompletionRoutine
Penunjuk ke rutinitas panggilan balik yang disediakan penelepon. Jika pemutusan oplock sedang berlangsung, Manajer Filter memanggil rutinitas ini ketika pemutusan oplock selesai. Parameter ini bersifat opsional dan dapat berupa NULL. Jika NULL, penelepon dimasukkan ke dalam status tunggu sampai pemecahan oplock selesai.
Rutinitas ini dinyatakan sebagai berikut:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
Rutinitas ini memiliki parameter berikut:
CallbackData
Penunjuk ke struktur data panggilan balik untuk operasi I/O.
Konteks
Penunjuk informasi konteks yang diteruskan dalam parameter Konteks ke FltCheckOplockEx.
[in, optional] PrePostCallbackDataRoutine
Penunjuk ke rutinitas panggilan balik yang disediakan penelepon untuk dipanggil jika operasi I/O diposting ke antrean kerja. Parameter ini bersifat opsional dan dapat berupa NULL.
Rutinitas ini dinyatakan sebagai berikut:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
CallbackData
Penunjuk ke struktur data panggilan balik untuk operasi I/O.
Konteks
Penunjuk informasi konteks yang diteruskan dalam parameter Konteks ke FltCheckOplockEx.
Nilai kembali
FltCheckOplockEx mengembalikan salah satu kode FLT_PREOP_CALLBACK_STATUS berikut:
Menampilkan kode | Deskripsi |
---|---|
|
FltCheckOplockEx mengalami kegagalan alokasi kumpulan, atau panggilan ke fungsi FsRtlCheckOplockEx mengembalikan kesalahan. FltCheckOplockEx mengatur kode kesalahan di anggota Status dari struktur IO_STATUS_BLOCK anggota IoStatus dari struktur data panggilan balik FLT_CALLBACK_DATA . Parameter CallbackData menunjuk ke struktur FLT_CALLBACK_DATA ini. |
|
Pemutusan oplock dimulai, yang menyebabkan Manajer Filter memposting operasi I/O ke antrean kerja. Operasi I/O diwakili oleh data panggilan balik yang ditunjuk oleh parameter CallbackData . |
|
Data panggilan balik yang ditunjuk parameter CallbackData tidak tertunda, dan operasi I/O segera dilakukan. Ketahuilah bahwa jika penelepon yang ditentukan OPLOCK_FLAG_COMPLETE_IF_OPLOCKED dalam parameter Bendera , pemutusan oplock mungkin benar-benar sedang berlangsung meskipun operasi I/O tidak tertunda. Untuk menentukan apakah ini situasinya, pemanggil harus memeriksa STATUS_OPLOCK_BREAK_IN_PROGRESS di anggota Status struktur IO_STATUS_BLOCK anggota IoStatus dari struktur data panggilan balik FLT_CALLBACK_DATA . |
Keterangan
Driver minifilter memanggil FltCheckOplockEx untuk menyinkronkan operasi I/O berbasis IRP dengan status oplock file saat ini sesuai dengan kondisi berikut:
Jika operasi I/O akan menyebabkan oplock rusak, jeda oplock dimulai.
Jika operasi I/O tidak dapat dilanjutkan sampai jeda oplock selesai, FltCheckOplockEx mengembalikan FLT_PREOP_PENDING dan memanggil rutinitas panggilan balik yang ditunjuk oleh parameter PrePostCallbackDataRoutine .
Jika driver minifilter menggunakan oplock, driver harus memanggil FltCheckOplockEx dari rutinitas callback praoperasi (PFLT_PRE_OPERATION_CALLBACK) untuk operasi I/O yang dapat menyebabkan jeda oplock. Aturan ini berlaku untuk jenis operasi I/O berikut, karena operasi ini dapat menyebabkan jeda oplock:
IRP_MJ_CLEANUP
IRP_MJ_CREATE
IRP_MJ_FILE_SYSTEM_CONTROL
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_LOCK_CONTROL
IRP_MJ_READ
IRP_MJ_SET_INFORMATION
IRP_MJ_WRITE
Operasi I/O harus merupakan operasi I/O berbasis IRP. Untuk menentukan apakah struktur data panggilan balik tertentu mewakili operasi I/O berbasis IRP, gunakan makro FLT_IS_IRP_OPERATION .
Minifilter tidak boleh memanggil FltCheckOplockEx lagi dalam panggilan balik yang ditentukan dalam WaitCompletionRoutine. Melakukannya dapat mengakibatkan kondisi kebuntuan jika paket oplock memanggil panggilan balik penyelesaian sebelum FltCheckOplockEx kembali.
Untuk informasi selengkapnya tentang kunci oportunistik, lihat dokumentasi Microsoft Windows SDK.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Rutinitas FltCheckOplockEx tersedia dimulai dengan Windows 7. |
Target Platform | Universal |
Header | fltkernel.h (termasuk Fltkernel.h) |
Pustaka | FltMgr.lib |
IRQL | <= APC_LEVEL |