Bagikan melalui


IRP_MJ_WRITE (FS dan driver filter)

Ketika Dikirim

Manajer I/O atau driver sistem file mengirimkan permintaan IRP_MJ_WRITE. Permintaan ini dapat dikirim, misalnya, ketika aplikasi mode pengguna memanggil fungsi Win32 seperti WriteFile atau ketika komponen mode kernel memanggil ZwWriteFile.

Operasi: Driver Sistem File

Driver sistem file harus mengekstrak dan mendekode objek file untuk menentukan parameter dan kode fungsi minor.

Untuk permintaan penulisan MDL, sistem file harus memeriksa kode fungsi minor untuk menentukan operasi mana yang diminta. Berikut ini adalah kode fungsi minor yang valid, yang hanya dapat digunakan untuk I/O file yang di-cache:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Untuk informasi selengkapnya tentang cara menangani IRP ini, pelajari sampel FASTFAT yang disertakan dalam Windows Driver Kit (WDK).

Operasi: Driver Filter Sistem File Warisan

Driver filter harus melakukan pemrosesan yang diperlukan dan, tergantung pada sifat filter, melakukan salah satu tindakan berikut:

  • Selesaikan atau gagalkan IRP, atau
  • Teruskan IRP ke driver berikutnya yang lebih rendah pada tumpukan.

Parameter

Sistem file atau driver filter memanggil IoGetCurrentIrpStackLocation untuk IRP yang diberikan untuk mendapatkan penunjuk ke lokasi tumpukannya sendiri di IRP. Dalam parameter berikut, Irp menunjuk ke IRP dan IrpSp menunjuk ke IO_STACK_LOCATION. Driver dapat menggunakan informasi yang diatur dalam anggota IRP berikut dan lokasi tumpukan IRP untuk memproses permintaan buat:

  • DeviceObject adalah penunjuk ke objek perangkat target.

  • Irp-AssociatedIrp.SystemBuffer> menunjuk ke buffer yang disediakan sistem untuk digunakan sebagai buffer sistem perantara, jika bendera DO_BUFFERED_IO diatur dalam DeviceObject-Flags>. Jika tidak, anggota ini diatur ke NULL.

  • Irp-IoStatus> menunjuk ke struktur IO_STATUS_BLOCK yang menerima status penyelesaian akhir dan informasi tentang operasi yang diminta. Jika permintaan IRP_MJ_WRITE gagal, rutinitas pengiriman tulis sistem file mengembalikan nilai NTSTATUS kesalahan, dan nilai Irp-IoStatus.Information> tidak terdefinisi dan tidak boleh digunakan.

  • Irp-MdlAddress> adalah alamat daftar deskriptor memori (MDL) yang menjelaskan halaman tempat data akan ditulis.

  • IrpSp-FileObject> menunjuk ke objek file yang terkait dengan DeviceObject. Jika bendera FO_SYNCHRONOUS_IO diatur dalam IrpSp-FileObject-Flags>>, objek file dibuka untuk I/O sinkron.

    Parameter IrpSp-FileObject> berisi penunjuk ke bidang RelatedFileObject , yang juga merupakan struktur FILE_OBJECT. Bidang RelatedFileObject dari struktur FILE_OBJECT tidak valid selama pemrosesan IRP_MJ_WRITE dan tidak boleh digunakan.

  • IrpSp-Flags>: Jika bendera SL_FORCE_DIRECT_WRITE diatur, driver mode kernel dapat menulis ke area volume yang biasanya tidak dapat mereka tulis karena pemblokiran tulis langsung. Pemblokiran tulis langsung diimplementasikan karena alasan keamanan di Windows Vista dan sistem operasi yang lebih baru. Bendera ini diperiksa baik di lapisan sistem file maupun lapisan tumpukan penyimpanan. Untuk informasi selengkapnya tentang pemblokiran tulis langsung, lihat Memblokir Operasi Tulis Langsung ke Volume dan Disk. Bendera SL_FORCE_DIRECT_WRITE tersedia di Windows Vista dan versi Windows yang lebih baru.

  • IrpSp-MajorFunction> diatur ke IRP_MJ_WRITE.

  • IrpSp-MinorFunction> menentukan operasi yang diminta dan berisi salah satu nilai berikut. Jika kode fungsi minor tidak ditentukan, operasinya adalah penulisan standar (setara dengan IRP_MN_NORMAL).

    MinorFunction Deskripsi
    IRP_MN_NORMAL Permintaan tulis adalah untuk operasi tulis standar
    IRP_MN_DPC Permintaan tulis berasal dari rutinitas DPC
    IRP_MN_MDL Mengembalikan MDL yang menjelaskan data yang di-cache file di Irp-MdlAddress>; pemanggil menggunakan MDL ini untuk menulis data langsung ke cache
    IRP_MN_COMPLETE Tidak digunakan dengan sendirinya; hanya terjadi dalam kombinasi dengan setidaknya IRP_MN_MDL. Lihat Keterangan.
    IRP_MN_COMPRESSED Permintaan tulis adalah untuk file terkompresi
    IRP_MN_MDL_DPC Permintaan tulis berasal dari rutinitas DPC dan mengembalikan MDL yang menjelaskan data yang di-cache file di Irp-MdlAddress>
    IRP_MN_COMPLETE_MDL Menunjukkan bahwa pemanggil, yang menggunakan MDL untuk menulis data langsung ke cache, selesai menggunakan MDL
    IRP_MN_COMPLETE_MDL_DPC Menunjukkan bahwa pemanggil, yang menggunakan MDL untuk menulis data langsung ke cache, selesai menggunakan MDL; permintaan tulis berasal dari rutinitas DPC
  • IrpSp-Parameters.Write.ByteOffset> adalah variabel LARGE_INTEGER yang menentukan offset byte awal dalam file data yang akan ditulis.

    Dalam keadaan tertentu, parameter ini mungkin berisi nilai khusus. Misalnya, ketika benar, kondisi berikut menunjukkan bahwa akhir file saat ini harus digunakan alih-alih nilai offset file eksplisit: IrpSp-Parameters.Write.ByteOffset.LowPart> == FILE_WRITE_TO_END_OF_FILE dan IrpSp-Parameters.Write.ByteOffset.HighPart> == -1

  • IrpSp-Parameters.Write.Key> adalah nilai kunci yang terkait dengan kunci rentang byte pada file target.

  • IrpSp-Parameters.Write.Length> adalah panjang dalam byte data yang akan ditulis. Jika operasi penulisan berhasil, jumlah byte yang ditulis dikembalikan dalam anggota Informasi dari struktur IO_STATUS_BLOCK yang ditujukkan oleh Irp-IoStatus>.

Keterangan

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

Poin berikut menjelaskan penulisan standar versus penulisan MDL berbasis IRP:

  • Untuk melakukan penulisan standar:

    1. Penerbit membuat IRP dengan MajorFunction = IRP_MJ_WRITE, MinorFunction = IRP_MN_NORMAL (yaitu, 0) dan menyediakan data untuk ditulis di Irp-AssociatedIrp.SystemBuffer>.
    2. Ketika mereka mengirim IRP ke sistem file, data yang akan ditulis sudah ada di IRP. Jadi penulisan selesai ketika sistem file selesai memproses IRP; misalnya, dengan menyalin data dari buffer ke cache untuk penulisan yang di-cache.
  • Untuk melakukan penulisan MDL berbasis IRP:

    1. Penerbit membuat IRP dengan MajorFunction = IRP_MJ_WRITE, MinorFunction = IRP_MN_MDL, tetapi tidak menyediakan buffer data. Mereka mengirim IRP ini ke sistem file.
    2. Sistem file membangun MDL, menempatkannya di IRP, dan menyelesaikan IRP.
    3. Pengeluar sertifikat menggunakan MDL tersebut untuk menyalin data langsung ke cache file.
    4. Ketika pengeluar sertifikat selesai menyalin data ke dalam cache, mereka membuat IRP lain dengan MajorFunction = IRP_MJ_WRITE, MinorFunction = (IRP_MN_MDL | IRP_MN_COMPLETE) dan kirimkan ke sistem file.
    5. Sistem file membebaskan MDL, dan operasi tulis sekarang selesai.

Lihat juga

CcMdlWriteComplete

CcPrepareMdlWrite

FLT_IO_PARAMETER_BLOCK

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ

IRP_MJ_WRITE (Referensi Kernel WDK)

ZwWriteFile