PFLT_PRE_OPERATION_CALLBACK fungsi panggilan balik (fltkernel.h)

Rutinitas PFLT_PRE_OPERATION_CALLBACK driver minifilter melakukan pemrosesan pra-operasi untuk operasi I/O.

Sintaks

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

Parameter

[in, out] Data

Penunjuk ke struktur data panggilan balik (FLT_CALLBACK_DATA) untuk operasi I/O.

[in] FltObjects

Penunjuk ke struktur FLT_RELATED_OBJECTS yang berisi penunjuk buram untuk objek yang terkait dengan permintaan I/O saat ini.

[out] CompletionContext

Jika rutinitas panggilan balik ini mengembalikan FLT_PREOP_SUCCESS_WITH_CALLBACK atau FLT_PREOP_SYNCHRONIZE, parameter ini adalah penunjuk konteks opsional untuk diteruskan ke rutinitas panggilan balik pasca-operasi yang sesuai. Jika tidak, harus NULL.

Nilai kembali

Rutinitas panggilan balik ini mengembalikan salah satu nilai FLT_PREOP_CALLBACK_STATUS berikut.

Menampilkan kode Deskripsi
FLT_PREOP_COMPLETE Minifilter sedang menyelesaikan operasi I/O. Lihat Keterangan untuk detailnya.
FLT_PREOP_DISALLOW_FASTIO Operasi ini adalah operasi I/O yang cepat, dan minifilter tidak memungkinkan jalur I/O cepat digunakan untuk operasi ini. Lihat Keterangan untuk detailnya.
FLT_PREOP_PENDING Minifilter telah menunggu operasi I/O, dan operasi masih tertunda. Lihat Keterangan untuk detailnya.
FLT_PREOP_SUCCESS_NO_CALLBACK Minifilter mengembalikan operasi I/O ke FltMgr untuk diproses lebih lanjut. Dalam hal ini, FltMgr tidak akan memanggil panggilan balik pasca-operasi driver minifilter, jika ada, selama penyelesaian I/O.
FLT_PREOP_SUCCESS_WITH_CALLBACK Minifilter mengembalikan operasi I/O ke FltMgr untuk diproses lebih lanjut. Dalam hal ini, FltMgr memanggil panggilan balik pasca-operasi minifilter selama penyelesaian I/O.
FLT_PREOP_SYNCHRONIZE Minifilter mengembalikan operasi I/O ke FltMgr untuk diproses lebih lanjut, tetapi tidak menyelesaikan operasi. Lihat Keterangan untuk detailnya.
FLT_PREOP_DISALLOW_FSFILTER_IO Minifilter melarang operasi QueryOpen cepat dan memaksa operasi ke jalur lambat. Melakukannya menyebabkan manajer I/O melayani permintaan dengan melakukan buka/kueri/tutup file. Driver minifilter hanya boleh mengembalikan status ini untuk QueryOpen.

Keterangan

Lihat Menulis rutinitas panggilan balik pra-operasi untuk informasi tambahan.

Panggilan balik pra-operasi minifilter memproses satu atau beberapa jenis operasi I/O. (Rutinitas panggilan balik ini mirip dengan rutinitas pengiriman dalam model filter warisan.)

Minifilter mendaftarkan rutinitas panggilan balik pra-operasi untuk jenis operasi I/O tertentu dengan menyimpan titik masuk rutinitas panggilan balik dalam array OperationRegistration dari struktur FLT_REGISTRATION . Minifilter meneruskan struktur ini sebagai parameter ke FltRegisterFilter dalam rutinitas DriverEntry-nya . Minifilter dapat mendaftarkan rutinitas panggilan balik pra-operasi untuk jenis operasi I/O tertentu tanpa mendaftarkan rutinitas panggilan balik pasca-operasi (PFLT_POST_OPERATION_CALLBACK) dan sebaliknya.

Rutinitas panggilan balik pra-operasi atau pasca-operasi driver minifilter dapat memodifikasi konten struktur data panggilan balik untuk operasi. Jika ya, maka harus memanggil FltSetCallbackDataDirty, kecuali telah mengubah konten bidang IoStatus struktur data panggilan balik.

IRQL untuk rutinitas panggilan balik generik ini tergantung pada jalur IO spesifiknya. Anda dapat dengan cepat dan murah memanggil KeGetCurrentIRQL jika Anda perlu mengetahui IRQL saat ini. Lihat Menulis rutinitas panggilan balik pra-operasi untuk informasi tambahan tentang IRQL.

Sistem file membulatkan operasi tulis dan baca di akhir file ke kelipatan ukuran sektor perangkat penyimpanan file yang mendasar. Saat memproses operasi pra-baca atau pra-tulis, filter yang mengalokasikan dan menukar buffer perlu membulatkan ukuran buffer yang dialokasikan hingga kelipatan ukuran sektor perangkat terkait. Jika tidak, panjang data yang ditransfer dari sistem file yang mendasar akan melebihi panjang buffer yang dialokasikan. Untuk informasi selengkapnya tentang menukar buffer, lihat Sampel Minifilter SwapBuffers.

Dimulai dengan Windows 8, CompletionContext menggunakan anotasi Flt_CompletionContext_Outptr yang menentukan nilai konteks yang valid berdasarkan hasil operasi. Berikut ini adalah contoh penggunaan untuk panggilan balik dengan anotasi untuk CompletionContext.

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Mengembalikan FLT_PREOP_COMPLETE

Jika rutinitas ini mengembalikan FLT_PREOP_COMPLETE, bidang IoStatus.Status struktur data panggilan balik harus diatur ke nilai NTSTATUS akhir untuk operasi I/O. Nilai NTSTATUS ini tidak dapat STATUS_PENDING. Untuk operasi pembersihan atau penutupan, nilai NTSTATUS harus berhasil selain STATUS_PENDING karena operasi pembersihan dan penutupan tidak dapat gagal.

Ketika rutinitas ini kembali FLT_PREOP_COMPLETE, FltMgr tidak akan mengirim operasi I/O ke driver minifilter apa pun di bawah pemanggil di tumpukan driver atau ke sistem file. Dalam hal ini, FltMgr hanya memanggil rutinitas panggilan balik pasca-operasi dari driver minifilter di atas penelepon di tumpukan driver.

Mengembalikan FLT_PREOP_DISALLOW_FASTIO

Jika rutinitas ini mengembalikan FLT_PREOP_DISALLOW_FASTIO, tidak boleh mengatur bidang IoStatus.Status struktur data panggilan balik karena FltMgr secara otomatis mengatur bidang ini ke STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO hanya dapat dikembalikan untuk operasi I/O yang cepat. Untuk menentukan apakah struktur data panggilan balik yang diberikan mewakili operasi I/O cepat, gunakan makro FLT_IS_FASTIO_OPERATION .

Ketika rutinitas ini kembali FLT_PREOP_DISALLOW_FASTIO, FltMgr tidak akan mengirim operasi I/O cepat ke driver minifilter apa pun di bawah pemanggil di tumpukan driver atau ke sistem file. Dalam hal ini, FltMgr hanya memanggil rutinitas panggilan balik pasca-operasi dari driver minifilter di atas penelepon di tumpukan driver.

Mengembalikan FLT_PREOP_PENDING

FLT_PREOP_PENDING hanya dapat dikembalikan untuk operasi I/O berbasis IRP karena hanya operasi I/O berbasis IRP yang dapat ditunda. Untuk menentukan apakah struktur data panggilan balik tertentu mewakili operasi I/O berbasis IRP, gunakan makro FLT_IS_IRP_OPERATION .

Ketika rutinitas ini kembali FLT_PREOP_PENDING, FltMgr tidak akan memproses operasi I/O lebih lanjut sampai driver minifilter memanggil FltCompletePendedPreOperation.

Mengembalikan FLT_PREOP_SYNCHRONIZE

Jika rutinitas panggilan balik pra-operasi minifilter mengembalikan FLT_PREOP_SYNCHRONIZE, minifilter harus telah mendaftarkan panggilan balik pasca-operasi yang sesuai untuk operasi tersebut. Ketika rutinitas ini kembali FLT_PREOP_SYNCHRONIZE, FltMgr memanggil panggilan balik pasca-operasi minifilter dalam konteks utas saat ini di IRQL <= APC_LEVEL.

FLT_PREOP_SYNCHRONIZE hanya boleh dikembalikan untuk operasi I/O berbasis IRP. Jika dikembalikan untuk operasi I/O yang bukan operasi berbasis IRP, FltMgr memperlakukan nilai pengembalian ini seolah-olah itu FLT_PREOP_SUCCESS_WITH_CALLBACK.

Driver minifilter tidak boleh mengembalikan FLT_PREOP_SYNCHRONIZE untuk membuat operasi, karena operasi ini sudah disinkronkan oleh FltMgr.

Minifilter tidak boleh mengembalikan FLT_PREOP_SYNCHRONIZE untuk operasi baca dan tulis asinkron. Melakukannya dapat sangat menurunkan driver minifilter dan performa sistem.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Microsoft Windows 2000 Update Rollup 1 untuk SP4, Windows XP SP2, Windows Server 2003 SP1, dan sistem operasi Windows yang lebih baru.
Target Platform Desktop
Header fltkernel.h (termasuk FltKernel.h)
IRQL Lihat bagian Keterangan

Lihat juga

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr

KeGetCurrentIRQL