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 pointer 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.

Mengembalikan nilai

Rutinitas panggilan balik ini mengembalikan salah satu nilai FLT_PREOP_CALLBACK_STATUS berikut:

Menampilkan kode Deskripsi
FLT_PREOP_COMPLETE Driver minifilter sedang menyelesaikan operasi I/O. Manajer filter tidak mengirim operasi I/O ke driver minifilter apa pun di bawah pemanggil di tumpukan driver atau ke sistem file. Dalam hal ini, manajer filter hanya memanggil rutinitas panggilan balik pasca-operasi dari driver minifilter di atas pemanggil di tumpukan driver.
FLT_PREOP_DISALLOW_FASTIO Operasi ini adalah operasi I/O yang cepat, dan driver minifilter tidak memungkinkan jalur I/O cepat digunakan untuk operasi ini. Manajer filter tidak mengirim operasi I/O cepat ke driver minifilter apa pun di bawah pemanggil di tumpukan driver atau ke sistem file. Dalam hal ini, manajer filter hanya memanggil rutinitas panggilan balik pasca-operasi dari driver minifilter di atas pemanggil di tumpukan driver.
FLT_PREOP_PENDING Driver minifilter telah menunggu operasi I/O, dan operasi masih tertunda. Manajer filter tidak memproses operasi I/O lebih lanjut sampai driver minifilter memanggil FltCompletePendedPreOperation.
FLT_PREOP_SUCCESS_NO_CALLBACK Driver minifilter mengembalikan operasi I/O ke manajer filter untuk diproses lebih lanjut. Dalam hal ini, manajer filter tidak memanggil panggilan balik pasca-operasi driver minifilter, jika ada, selama penyelesaian I/O.
FLT_PREOP_SUCCESS_WITH_CALLBACK Driver minifilter mengembalikan operasi I/O ke manajer filter untuk diproses lebih lanjut. Dalam hal ini, manajer filter memanggil panggilan balik pasca-operasi driver minifilter selama penyelesaian I/O.
FLT_PREOP_SYNCHRONIZE Driver minifilter mengembalikan operasi I/O ke manajer filter untuk diproses lebih lanjut, tetapi tidak menyelesaikan operasi. Dalam hal ini, manajer filter memanggil panggilan balik pasca-operasi minifilter dalam konteks utas saat ini di IRQL <= APC_LEVEL.
FLT_PREOP_DISALLOW_FSFILTER_IO Driver 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

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

Driver 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 . Driver minifilter meneruskan struktur ini sebagai parameter ke FltRegisterFilter dalam rutinitas DriverEntry-nya . Driver minifilter dapat mendaftarkan rutinitas panggilan balik pra-operasi untuk jenis operasi I/O tertentu tanpa mendaftarkan rutinitas callback pasca-operasi (PFLT_POST_OPERATION_CALLBACK) dan sebaliknya.

Jika rutinitas ini mengembalikan FLT_PREOP_COMPLETE, ia harus mengatur bidang IoStatus.Status struktur data panggilan balik 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.

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

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

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 .

Jika rutinitas panggilan balik pra-operasi driver minifilter mengembalikan FLT_PREOP_SYNCHRONIZE, driver minifilter harus mendaftarkan panggilan balik pasca-operasi yang sesuai untuk operasi tersebut.

FLT_PREOP_SYNCHRONIZE hanya boleh dikembalikan untuk operasi I/O berbasis IRP. Jika dikembalikan untuk operasi I/O yang bukan operasi berbasis IRP, manajer filter 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 manajer filter.

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

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.

Sistem file operasi tulis bulat dan baca di akhir file hingga 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
    );


Persyaratan

   
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