Bagikan melalui


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
FLT_PREOP_COMPLETE
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.
FLT_PREOP_PENDING
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 .
FLT_PREOP_SUCCESS_WITH_CALLBACK
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

Lihat juga

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltInitializeOplock

FltOplockFsctrl

FsRtlCheckOplockEx

IO_STATUS_BLOCK

PFLT_PRE_OPERATION_CALLBACK