Bagikan melalui


Mendukung operasi BypassIO

Mulai Windows 11, semua minifilter harus menambahkan dukungan untuk operasi BypassIO. Operasi BypassIO diminta dengan memanggil FltFsControlFile atau ZwFsControlFile dengan:

Halaman ini menyediakan detail untuk setiap operasi BypassIO. Permintaan operasi ditentukan sebagai nilai FS_BPIO_OPERATIONS di anggota Operasi FS_BPIO_INPUT.

Untuk informasi selengkapnya tentang BypassIO, lihat BypassIO untuk filter.

permintaan FS_BPIO_OP_ENABLE

Permintaan ini dapat berasal dari mode pengguna atau kernel. BypassIO pada tulisan non-cache saat ini tidak didukung.

FS_BPIO_OP_ENABLE meminta sistem mengaktifkan BypassIO untuk file yang diberikan, yang berarti driver mungkin tidak melihat semua bacaan non-cache untuk file tersebut.

BypassIO adalah konsep per file terbuka; artinya, permintaan FS_BPIO_OP_ENABLE hanya berdampak pada objek file yang terkait dengan permintaan aktifkan, dan tidak mengubah perilaku pembukaan lain pada file atau aliran yang sama. Jika beberapa permintaan aktifkan ke objek file yang sama dikirim, hanya permintaan pertama yang bermakna, dan semua permintaan berikutnya diabaikan.

Dalam panggilan balik praoperasi driver:

  • Jika driver dapat mendukung BypassIO untuk file yang diberikan, itu harus meneruskan permintaan ke bawah tumpukan.

  • Jika driver tidak dapat mendukung BypassIO untuk file yang diberikan, driver harus memanggil FltVetoBypassIo dengan informasi berikut:

    • Nama driver, yang berada dalam struktur FLT_RELATED_OBJECTS yang dituju parameter FltObjects.
    • Kode kesalahan NTSTATUS yang menjelaskan mengapa Anda mem-veto permintaan pengaktifan di parameter OperationStatus .
    • String deskriptif unik dengan detail tentang mengapa Anda mem-veto permintaan pengaktifan dalam parameter FailureReason .

    FltVetoBypassIo menulis nama driver, kode kesalahan, dan string yang menjelaskan mengapa minifilter memveto permintaan pengaktifan dalam struktur FS_BPIO_OUTPUT dan menulis peristiwa ETW dengan status, alasan yang disediakan filter, dan nama filter ke log peristiwa.

Minifilter harus menyelesaikan FSCTL_MANAGE_BYPASS_IO dengan STATUS_SUCCESS jika FltVetoBypassIo berhasil; jika tidak, itu harus mengembalikan kesalahan yang dikembalikan FltVetoBypassIo .

Selama pasca-operasi, driver dapat melihat apakah semua driver di bawahnya mampu mendukung BypassIO. Jika ya, driver harus mempertahankan status yang diperlukan untuk file dan melanjutkan pemrosesan penyelesaian. Ini adalah tanggung jawab sistem file dan filter untuk mempertahankan status untuk menangani permintaan dengan benar yang mungkin tidak kompatibel dengan status yang diaktifkan BypassIO.

Catatan

Semua filter dalam tumpukan sistem file memiliki kesempatan untuk mem-veto permintaan pengaktifan BypassIO selama pra-operasi, tetapi dianjurkan untuk tetap mengaktifkannya sebanyak mungkin.

Sistem file secara otomatis mem-veto bypassIO mengaktifkan permintaan untuk jenis file berikut:

  • Direktori (aliran data alternatif pada direktori dapat menggunakan BypassIO)
  • Volume (DASD terbuka)
  • File terkompresi NTFS
  • File yang di-enkripsi NTFS
  • File Sparse
  • FIle halaman
  • Semua file pada volume DAX

Sebagian besar filter tidak perlu mempertahankan status bahwa BypassIO diaktifkan pada aliran tertentu. Sebagai gantinya, informasi ini dapat dikueri dengan memanggil FsRtlGetBypassIoOpenCount.

contoh FS_BPIO_OP_ENABLE: filter enkripsi

Saat filter enkripsi menerima operasi FS_BPIO_OP_ENABLE pada file:

  • Jika file sudah dienkripsi, filter harus memanggil FltVetoBypassIo untuk memveto operasi BypassIO, memberikan status yang sesuai dan pesan diagnostik, seperti:

    • OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
    • FailureReason = "File terenkripsi tidak didukung"
  • Jika file saat ini tidak dienkripsi, filter harus mengizinkan BypassIO. Jika permintaan selanjutnya dibuat untuk mengenkripsi file ini, filter dapat menggunakan operasi FS_BPIO_OP_STREAM_PAUSE untuk menonaktifkan BypassIO.

permintaan FS_BPIO_OP_DISABLE

Permintaan ini dapat berasal dari mode pengguna atau kernel. Ini memungkinkan driver untuk membersihkan status BypassIO terkait.

Jika driver sebelumnya mengizinkan BypassIO untuk diaktifkan pada file ini dan sekarang perlu menonaktifkan dukungan BypassIO untuk file, itu harus mengirim operasi FS_BPIO_OP_DISABLE FSCTL_MANAGE_BYPASS_IO ke bagian atas tumpukan sistem file menggunakan handel terkait. Contoh kapan kondisi ini mungkin terjadi adalah driver enkripsi yang menerima permintaan untuk mengenkripsi file ini.

Jika driver menerima FS_BPIO_OP_DISABLE tetapi saat ini tidak mengaktifkan BypassIO, driver harus mengabaikan permintaan. Jika operasi ini dikirim pada file yang saat ini tidak mengaktifkan BypassIO, operasi ini harus diabaikan.

Operasi ini seharusnya tidak gagal.

permintaan FS_BPIO_OP_QUERY

Permintaan ini dapat berasal dari mode pengguna atau kernel.

Filter harus memproses permintaan FS_BPIO_OP_QUERY yang mirip dengan operasi FS_BPIO_OP_ENABLE, memanggil FltVetoBypassIo untuk memveto sebagaimana mestinya dengan informasi diagnostik yang sama seperti yang dijelaskan sebelumnya dalam parameter yang sesuai. Perbedaan utamanya adalah bahwa driver tidak memasukkan status BypassIO ENABLE selama KUERI.

Operasi FS_BPIO_OP_QUERY dapat dikirim pada handel direktori dan volume ( permintaan FS_BPIO_OP_ENABLE tidak dapat dikirim pada handel direktori atau volume).

Contoh kueri: filter enkripsi

Saat filter enkripsi menerima operasi FS_BPIO_OP_QUERY pada file:

  • Jika file sudah dienkripsi, filter harus memanggil FltVetoBypassIo untuk memveto operasi BypassIO, memberikan status dan pesan diagnostik yang sesuai, seperti:

    • OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
    • FailureReason = "File terenkripsi tidak didukung"
  • Jika file saat ini tidak dienkripsi, filter akan berhasil dalam permintaan kueri.

permintaan FS_BPIO_OP_VOLUME_STACK_PAUSE

Permintaan ini dapat berasal dari mode pengguna atau kernel.

Jika driver tumpukan volume sebelumnya mengizinkan BypassIO diaktifkan pada volume, dan sekarang perlu menghentikan BypassIO (misalnya, karena beberapa permintaan eksternal), driver harus mengirim operasi FSCTL_MANAGE_BYPASS_IO FS_BPIO_OP_VOLUME_STACK_PAUSE ke bagian atas tumpukan volume untuk memberi tahu sistem file untuk berhenti melakukan BypassIO pada volume volume dan tumpukan penyimpanan ini. Sistem file mengosongkan semua operasi BypassIO aktif dari volume ini dan kemudian mengembalikan. Driver tumpukan volume kemudian dapat memproses permintaan eksternal.

Semua file yang diaktifkan BypassIO aktif kemudian berhenti melakukan operasi BypassIO tingkat tumpukan penyimpanan. Permintaan operasi ini:

  • Dapat dikirim pada handel volume atau handel file apa pun untuk volume yang diberikan.
  • Dapat dikirim beberapa kali ke volume yang sama.
  • Dapat dikirim jika tidak ada file dengan dukungan BypassIO pada volume.

BypassIO terus beroperasi pada tumpukan sistem file.

Operasi ini seharusnya tidak gagal.

Contoh jeda tumpukan volume

BitLocker adalah contoh komponen yang menggunakan operasi ini ketika perlu mengaktifkan enkripsi pada volume.

Contoh lain adalah skenario berikut: Katakanlah Volsnap mengizinkan BypassIO diaktifkan pada volume yang tidak memiliki rekam jepret volume aktif. Kemudian, permintaan dibuat untuk membuat rekam jepret volume. Volsnap melakukan tindakan berikut sebelum melanjutkan:

  • Mengirim operasi FS_BPIO_OP_VOLUME_STACK_PAUSE ke bagian atas tumpukan yang meminta agar sistem menonaktifkan BypassIO pada tumpukan volume. Ini dilakukan setiap kali rekam jepret baru dibuat. Setelah berhasil dikembalikan, BypassIO sekarang dinonaktifkan dan dikosongkan pada volume yang diberikan.
  • Memproses permintaan pembuatan rekam jepret

Volsnap kemudian harus mem-veto semua permintaan BPIO_OP_ENABLE dan BPIO_OP_QUERY di masa mendatang pada volume ini.

permintaan FS_BPIO_OP_VOLUME_STACK_RESUME

Driver tumpukan volume mengirimkan operasi FSCTL ini ke sistem file untuk melanjutkan pemrosesan BypassIO pada volume yang diberikan. Ini mengirimkan operasi ini ketika skenario yang menyebabkan driver mengirim FS_BPIO_OP_VOLUME_STACK_PAUSE tidak lagi aktif. Operasi ini dapat dikirim meskipun BypassIO saat ini tidak diaktifkan atau dijeda.

Permintaan ini dapat berasal dari mode pengguna atau kernel.

Operasi ini seharusnya tidak gagal.

Contoh resume tumpukan volume

Menggunakan skenario jeda tumpukan volume yang dijelaskan sebelumnya, katakanlah volume tidak lagi memiliki rekam jepret aktif. Volsnap akan mengirim FS_BPIO_OP_VOLUME_STACK_RESUME hanya setelah rekam jepret terakhir hilang.

permintaan FS_BPIO_OP_STREAM_PAUSE

Filter dapat mengirim operasi FS_BPIO_OP_STREAM_PAUSE untuk menjeda BypassIO pada aliran. Permintaan ini dapat berasal dari mode pengguna atau kernel. Semua file aktif dengan dukungan BypassIO berhenti melakukan operasi BypassIO.

Secara khusus, jika filter yang sebelumnya mengizinkan BypassIO diaktifkan pada aliran dan kemudian perlu menghentikan BypassIO (karena permintaan eksternal seperti permintaan untuk mengenkripsi file atau direktori), itu dapat mengirim FS_BPIO_OP_STREAM_PAUSE ke bawah tumpukan filter untuk memberi tahu sistem file untuk berhenti melakukan BypassIO pada aliran yang diberikan. Filter tidak boleh mengirim operasi ini ke bagian atas tumpukan.

Sebelum sistem file kembali, sistem file menjeda semua handel BypassIO yang terbuka pada aliran dan menyelesaikan semua operasi BypassIO aktif pada aliran. Tindakan ini memastikan bahwa, saat dikembalikan, filter dapat melakukan operasi file yang perlu dilakukan.

Operasi ini dapat dikirim beberapa kali ke aliran yang sama. Sistem file mengabaikannya jika dikirim pada aliran yang saat ini tidak diaktifkan BypassIO.

Jika filter melakukan operasi jeda aliran, BypassIO berlanjut pada volume dan tumpukan penyimpanan.

Operasi ini seharusnya tidak gagal.

Contoh jeda aliran: filter enkripsi

Katakanlah filter enkripsi memungkinkan BypassIO diaktifkan pada aliran yang kemudian tidak dienkripsi, tetapi kemudian menerima permintaan untuk mengenkripsi aliran ini.

Sebelum filter enkripsi berlanjut, filter enkripsi harus memanggil FsRtlGetBypassIoOpenCount untuk menentukan apakah BypassIO aktif pada aliran ini. Jika ya, filter enkripsi mengirimkan operasi FS_BPIO_OP_STREAM_PAUSE yang meminta sistem menonaktifkan BypassIO. Setelah berhasil dikembalikan, BypassIO dinonaktifkan dan dikosongkan, sehingga filter dapat dengan aman melakukan permintaan enkripsi. Untuk menghilangkan kemungkinan kondisi balapan, filter harus mem-veto semua permintaan FS_BPIO_OP_ENABLE dan FS_BPIO_OP_QUERY di masa mendatang pada aliran terenkripsi ini sekarang.

permintaan FS_BPIO_OP_STREAM_RESUME

Ketika skenario yang menyebabkan filter mengirim operasi FS_BPIO_OP_STREAM_PAUSE tidak ada lagi, filter mengirim operasi FS_BPIO_OP_STREAM_RESUME ke sistem file untuk melanjutkan pemrosesan BypassIO dari aliran tertentu. Permintaan ini dapat berasal dari mode pengguna atau kernel.

Jika operasi ini dikirim ketika BypassIO saat ini tidak diaktifkan atau dijeda, operasi akan diabaikan.

Jeda dan lanjutkan tidak dihitung referensi. Sebaliknya, pada resume, sistem file mengeluarkan permintaan FS_BPIO_OP_QUERY ke bagian atas tumpukan sistem file untuk menentukan apakah ada filter yang tersisa yang masih memblokir. Sistem file melanjutkan BypassIO hanya jika semua filter dalam tumpukan tidak memblokir BypassIO.

Operasi ini seharusnya tidak gagal.

Contoh resume stream: filter enkripsi

Menggunakan skenario FS_BPIO_OP_STREAM_PAUSE yang dijelaskan sebelumnya, katakanlah file yang sebelumnya dienkripsi setelah panggilan ke FS_BPIO_OP_STREAM_PAUSE tidak lagi dienkripsi. Filter kemudian harus mengirim operasi FS_BPIO_OP_STREAM_RESUME untuk memungkinkan BypassIO dilanjutkan pada aliran tersebut.

permintaan FS_BPIO_OP_GET_INFO

Permintaan ini dapat berasal dari mode pengguna atau kernel. Sistem file mengembalikan informasi tentang BypassIO untuk volume dalam struktur FS_BPIO_INFO.