Fungsi FltCbdqInitialize (fltkernel.h)

FltCbdqInitialize menginisialisasi tabel pengiriman antrean data panggilan balik driver minifilter.

Sintaks

NTSTATUS FLTAPI FltCbdqInitialize(
  [in]      PFLT_INSTANCE                                 Instance,
  [in, out] PFLT_CALLBACK_DATA_QUEUE                      Cbdq,
  [in]      PFLT_CALLBACK_DATA_QUEUE_INSERT_IO            CbdqInsertIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO            CbdqRemoveIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO         CbdqPeekNextIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_ACQUIRE              CbdqAcquire,
  [in]      PFLT_CALLBACK_DATA_QUEUE_RELEASE              CbdqRelease,
  [in]      PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo
);

Parameter

[in] Instance

Penunjuk instans buram untuk instans yang antrean data panggilan baliknya akan diinisialisasi.

[in, out] Cbdq

Penunjuk ke antrean data panggilan balik yang dialokasikan oleh driver minifilter.

[in] CbdqInsertIo

Penunjuk ke rutinitas panggilan balik sisipan yang disediakan penelepon. Manajer Filter memanggil rutinitas ini untuk menyisipkan struktur data panggilan balik yang ditentukan ke dalam antrean. Rutinitas ini dinyatakan sebagai berikut:

typedef NTSTATUS
(*PFLT_CALLBACK_DATA_QUEUE_INSERT_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID InsertContext
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Cbd

Arahkan ke struktur data panggilan balik untuk dimasukkan ke dalam antrean.

SisipkanKonteks

Penunjuk informasi konteks yang diteruskan sebagai parameter InsertContext ke FltCbdqInsertIo.

[in] CbdqRemoveIo

Penunjuk ke rutinitas hapus panggilan balik yang disediakan penelepon. Manajer Filter memanggil rutinitas ini untuk menghapus struktur data panggilan balik yang ditentukan dari antrean. Rutinitas ini dinyatakan sebagai berikut:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Cbd

Arahkan ke struktur data panggilan balik yang akan dihapus dari antrean.

[in] CbdqPeekNextIo

Penunjuk ke rutinitas panggilan balik intip yang disediakan penelepon. Manajer Filter memanggil fungsi ini untuk mendapatkan penunjuk ke operasi I/O berikutnya yang cocok dengan PeekContext dalam antrean; atau, jika Cbdadalah NULL, untuk mendapatkan penunjuk ke operasi I/O pertama yang cocok dalam antrean. Driver minifilter sepenuhnya mendefinisikan arti PeekContext dan menentukan kapan operasi I/O cocok dengan PeekContext tertentu. Rutinitas ini dinyatakan sebagai berikut:

typedef PFLT_CALLBACK_DATA
(*PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO)(
      _In_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID PeekContext
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Cbd

Arahkan ke struktur data panggilan balik yang menandai posisi dalam antrean untuk mulai mencari kecocokan dengan PeekContext. Jika CbdNULL, pencarian dimulai di kepala antrean.

PeekContext

Penunjuk informasi konteks yang diteruskan sebagai parameter PeekContext ke FltCbdqRemoveNextIo.

[in] CbdqAcquire

Penunjuk ke rutinitas panggilan balik penguncian antrean yang disediakan penelepon. Manajer Filter memanggil rutinitas ini untuk memperoleh kunci pada antrean sebelum mencoba menyisipkan atau menghapus item dari antrean. Rutinitas ini dinyatakan sebagai berikut:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_ACQUIRE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Out_opt_ PKIRQL Irql
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Irql

Penunjuk ke variabel yang disediakan sistem yang menerima IRQL saat ini. Variabel yang sama diteruskan ke rutinitas CbdqRelease yang sesuai.

[in] CbdqRelease

Penunjuk ke rutinitas panggilan balik kunci antrean rilis yang disediakan penelepon. Manajer Filter memanggil rutinitas ini untuk melepaskan kunci yang diperolehnya dengan memanggil rutinitas CbdqAcquire yang sesuai. Rutinitas ini dinyatakan sebagai berikut:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_RELEASE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ KIRQL Irql
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Irql

Variabel yang disediakan sistem yang sama yang menerima IRQL saat ini sebagai parameter Irql ke rutinitas CbdqAcquire yang sesuai.

[in] CbdqCompleteCanceledIo

Pointer ke rutinitas pembatalan yang disediakan penelepon. Manajer Filter memanggil rutinitas ini untuk memberi sinyal ke driver minifilter untuk menyelesaikan operasi I/O yang dibatalkan. Rutinitas ini dinyatakan sebagai berikut:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Inout_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

Arahkan kursor ke antrean data panggilan balik driver minifilter yang batal aman. Antrean ini harus telah diinisialisasi dengan memanggil FltCbdqInitialize.

Cbd

Arahkan ke struktur data panggilan balik untuk operasi I/O yang dibatalkan.

Nilai kembali

FltCbdqInitialize mengembalikan STATUS_SUCCESS atau nilai NTSTATUS yang sesuai.

Keterangan

Antrean data panggilan balik yang baru diinisialisasi dalam status diaktifkan, yang berarti bahwa item struktur data panggilan balik dapat dimasukkan ke dalam antrean. Antrean dapat dinonaktifkan dengan memanggil FltCbdqDisable dan diaktifkan kembali dengan memanggil FltCbdqEnable.

Driver minifilter dapat menggunakan rutinitas FltCbdqXxx untuk menerapkan antrean data panggilan balik untuk operasi I/O berbasis IRP. Dengan menggunakan rutinitas ini, pengemudi minifilter dapat membuat antrean mereka batal aman; sistem secara transparan menangani pembatalan I/O untuk driver minifilter.

Rutinitas FltCbdqXxx hanya dapat digunakan untuk 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 .

Driver minifilter dapat menggunakan implementasi internal apa pun untuk antrean. Manajer Filter berinteraksi dengan implementasi antrean driver minifilter hanya melalui serangkaian rutinitas pengiriman yang disediakan oleh FltCbdqInitialize.

Sistem secara otomatis mengunci dan membuka kunci antrean seperlunya. Driver minifilter tidak menerapkan penguncian apa pun di dalam rutinitas CbdqInsertIo, CbdqRemoveIo, dan CbdqPeekNextIo mereka.

Driver minifilter dapat menggunakan salah satu primitif sinkronisasi sistem operasi sebagai mekanisme penguncian dalam rutinitas CbdqAcquire dan CbdqRelease mereka, seperti kunci putar, objek mutex, atau variabel sumber daya. Perhatikan bahwa jika driver minifilter menggunakan kunci putar daripada mutex atau sumber daya untuk melindungi antrean, itu dapat memanggil rutinitas FltCbdqXxx di IRQL <= DISPATCH_LEVEL. Jika mutex atau sumber daya digunakan, driver minifilter harus berjalan di IRQL <= APC_LEVEL ketika memanggil salah satu rutinitas ini kecuali FltCbdqInitialize.

Driver minifilter tidak memanipulasi antrean secara langsung. Sebaliknya, ia memanggil FltCbdqInsertIo, FltCbdqRemoveIo, dan FltCbdqRemoveNextIo untuk menambahkan atau menghapus struktur data panggilan balik. Rutinitas ini pada gilirannya memanggil fungsi panggilan balik yang disediakan driver minifilter untuk FltCbdqInitialize.

Driver minifilter harus menerapkan rutinitas antrean sebagai berikut.

Rutinitas Cbdq Implementasi
CbdqInsertIo Sisipkan struktur data panggilan balik yang ditentukan ke dalam antrean.
CbdqRemoveIo Hapus struktur data panggilan balik yang ditentukan dari antrean.
CbdqPeekNextIo Rutinitas ini harus memungkinkan sistem untuk mengulangi struktur data panggilan balik dengan PeekContext yang cocok dalam antrean. Cbd = CbdqPeekNextIo(Cbdq, NULL, PeekContext) harus mengembalikan entri pencocokan pertama dalam antrean, dan CbdqPeekNextIo(Cbdq, Cbd, PeekContext) harus mengembalikan entri pencocokan berikutnya setelah struktur data panggilan balik yang diberikan dalam antrean. Driver minifilter sepenuhnya mendefinisikan arti PeekContext dan menentukan kapan struktur data panggilan balik cocok dengan nilai PeekContext .
CbdqAcquire Rutinitas ini harus mengunci antrean sehingga tidak ada utas lain yang dapat mengaksesnya. Driver minifilter dapat menggunakan mekanisme penguncian apa pun untuk mengunci antrean. Jika driver minifilter menggunakan rutinitas KeAcquireSpinLock , driver minifilter dapat menggunakan lokasi memori yang ditujukkan oleh parameter Irql rutin untuk menyimpan IRQL. Jika tidak, driver minifilter dapat mengabaikan parameter tersebut.
CbdqRelease Rutinitas ini harus membuka kunci antrean yang dibuat oleh CbdqAcquire. Jika driver minifilter menggunakan kunci putar dan mengembalikan nilai IRQL dalam parameter IrqlCbdqAcquire, sistem meneruskan nilai tersebut dalam parameter IrqlCbdqRelease. Driver minifilter dapat menggunakan IRQL untuk membuka kunci spin dengan memanggil KeReleaseSpinLock. Jika tidak, driver minifilter dapat mengabaikan parameter Irql .
CbdqCompleteCanceledIo Rutinitas ini harus menyelesaikan operasi I/O yang dibatalkan. Biasanya, driver minifilter hanya dapat memanggil FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL). Driver minifilter tidak perlu menghapus antrean struktur data panggilan balik -- Manajer Filter secara otomatis memanggil CbdqRemoveIo antrean sebelum memanggil CbdqCompleteCanceledIo.

Persyaratan

Persyaratan Nilai
Target Platform Universal
Header fltkernel.h (termasuk Fltkernel.h)
IRQL Tingkat apa pun

Lihat juga

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInsertIo

FltCbdqRemoveIo

FltCbdqRemoveNextIo

FltCompletePendedPreOperation

KeAcquireSpinLock

KeReleaseSpinLock