IRP_MJ_CREATE (filter FS dan FS)

Ketika Dikirim

Manajer I/O mengirimkan permintaan IRP_MJ_CREATE saat:

  • File atau direktori baru sedang dibuat.
  • File, perangkat, direktori, atau volume yang ada sedang dibuka.

Biasanya IRP ini dikirim atas nama aplikasi mode pengguna yang telah memanggil fungsi Microsoft Win32 seperti CreateFile atau atas nama komponen mode kernel yang telah memanggil fungsi seperti IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile, atau ZwOpenFile.

Jika permintaan pembuatan berhasil diselesaikan, komponen aplikasi atau mode kernel menerima handel ke objek file.

Operasi: Driver Sistem File

Jika objek perangkat target adalah objek perangkat kontrol sistem file, rutinitas pengiriman driver sistem file harus menyelesaikan IRP dan mengembalikan nilai NTSTATUS yang sesuai, setelah mengatur Irp-IoStatus.Status> dan Irp-IoStatus.Information> ke nilai yang sesuai.

Jika tidak, driver sistem file harus memproses permintaan buat.

Operasi: Driver Filter Sistem File Warisan

Jika objek perangkat target adalah objek perangkat kontrol driver filter, rutinitas pengiriman driver filter harus menyelesaikan IRP dan mengembalikan nilai NTSTATUS yang sesuai, setelah mengaturIrp-IoStatus.Status> dan Irp-IoStatus.Information> ke nilai yang sesuai.

Jika tidak, driver filter harus melakukan pemrosesan yang diperlukan. Kemudian, tergantung pada sifat filter, itu harus menyelesaikan IRP atau meneruskannya ke driver berikutnya yang lebih rendah pada tumpukan.

Umumnya, driver filter tidak boleh mengembalikan STATUS_PENDING sebagai respons terhadap IRP_MJ_CREATE. Namun, jika driver tingkat bawah mengembalikan STATUS_PENDING, driver filter harus meneruskan nilai status ini ke atas rantai driver.

Penulis driver filter sistem file harus mencatat bahwa IoCreateStreamFileObject menyebabkan permintaan IRP_MJ_CLEANUP dikirim ke tumpukan driver sistem file untuk volume. Karena sistem file sering membuat objek file aliran sebagai efek samping dari operasi selain IRP_MJ_CREATE, sulit bagi driver filter untuk mendeteksi pembuatan objek file aliran dengan andal. Dengan demikian, driver filter harus mengharapkan untuk menerima permintaan IRP_MJ_CLEANUP dan IRP_MJ_CLOSE untuk objek file yang sebelumnya tidak terlihat. Untuk IoCreateStreamFileObjectLite, permintaan IRP_MJ_CLEANUP tidak dikirim.

Ketika driver filter warisan mengeluarkan kembali permintaan buat dalam panggilan balik pasca-buat, mereka harus merilis dan mengatur buffer yang terkait dengan titik pemilahan ulang (buffer tambahan) ke NULL. Jika driver filter warisan tidak membebaskan buffer ini dan mengaturnya ke NULL, driver akan membocorkan memori. Driver minifilter tidak perlu melakukan ini karena Manajer Filter melakukannya untuk mereka.

Parameter

Sistem file atau driver filter warisan memanggil IoGetCurrentIrpStackLocation dengan IRP yang diberikan untuk mendapatkan pointer 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 pembuatan.

  • DeviceObject adalah penunjuk ke objek perangkat target.

  • Irp->AssociatedIrp.SystemBuffer menunjuk ke buffer terstruktur FILE_FULL_EA_INFORMATION, jika objek file mewakili file dengan atribut yang diperluas. Jika tidak, anggota ini diatur ke NULL.

  • Irp->Bendera diatur ke bendera berikut untuk permintaan ini:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode menunjukkan mode eksekusi proses yang meminta operasi, baik KernelMode atau UserMode. Jika bendera SL_FORCE_ACCESS_CHECK diatur, pemeriksaan akses harus dilakukan, bahkan jika Irp-RequestorMode> adalah KernelMode.

  • Irp->IoStatus menunjuk ke struktur IO_STATUS_BLOCK yang menerima status penyelesaian akhir dan informasi tentang operasi yang diminta. Sistem file mengatur anggota Informasi dari struktur ini ke salah satu nilai berikut:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize adalah ukuran alokasi awal, dalam byte, untuk file. Nilai bukan nol tidak berpengaruh kecuali file sedang dibuat, ditimpa, atau digantikan.

  • IrpSp->FileObject menunjuk ke objek file yang dibuat manajer I/O untuk mewakili file yang akan dibuat atau dibuka. Ketika sistem file memproses permintaan IRP_MJ_CREATE, sistem file mengatur bidang FsContext dan mungkin FsContext2 dalam objek file ini ke nilai yang spesifik untuk sistem file. Dengan demikian nilai bidang FsContext dan FsContext2 tidak dapat dianggap valid sampai setelah sistem file memproses permintaan pembuatan. Untuk informasi selengkapnya, lihat Aliran File, Konteks Aliran, dan Konteks Per-Stream.

    FltCancelFileOpen dan IoCancelFileOpen mengatur bendera FO_FILE_OPEN_CANCELLED di bidang Bendera objek file. Mengatur bendera ini menunjukkan bahwa permintaan IRP_MJ_CREATE telah dibatalkan, dan permintaan IRP_MJ_CLOSE akan dikeluarkan untuk objek file ini. Setelah permintaan pembuatan dibatalkan, permintaan tidak dapat diterbitkan kembali.

    Parameter IrpSp-FileObject> berisi penunjuk ke bidang RelatedFileObject, yang juga merupakan struktur FILE_OBJECT. Bidang RelatedFileObject dari struktur FILE_OBJECT digunakan untuk menunjukkan bahwa file tertentu telah dibuka relatif terhadap objek file yang sudah terbuka. Ini biasanya menunjukkan bahwa file relatif adalah direktori tetapi file berbasis aliran dapat dibuka relatif terhadap aliran file yang sudah ada. Bidang RelatedFileObject dari struktur FILE_OBJECT hanya valid selama pemrosesan IRP_MJ_CREATE.

  • IrpSp->Bendera dapat diatur ke satu atau beberapa nilai berikut:

    Bendera Makna
    SL_FORCE_ACCESS_CHECK 0x01 Jika bendera ini diatur, pemeriksaan akses harus dilakukan meskipun nilai IRP-RequestorMode> adalah KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Jika bendera ini diatur, file adalah file halaman.
    SL_OPEN_TARGET_DIRECTORY 0x04 Jika bendera ini diatur, direktori induk file harus dibuka.
    SL_STOP_ON_SYMLINK 0x08 Jika bendera ini diatur, traversal otomatis persimpangan dan tautan simbolis Manajer I/O ditekan, menyebabkan terbukanya persimpangan dan tautan simbolis untuk mengembalikan STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Jika bendera ini diatur, bendera ini memungkinkan pembuatan file baca-saja dengan opsi FILE_DELETE_ON_CLOSE. Opsi ini menyebabkan file dihapus saat handel ditutup.
    SL_CASE_SENSITIVE 0x80 Jika diatur, perbandingan nama file harus peka huruf besar/kecil.
  • IrpSp->MajorFunction diatur ke IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength adalah ukuran dalam byte buffer di Irp-AssociatedIrp.SystemBuffer>. Jika nilai Irp*->AssociatedIrp.SystemBuffer adalah NULL, anggota ini harus nol.

  • IrpSp->Parameters.Create.FileAttributes adalah bitmask bendera atribut yang akan diterapkan saat membuat atau membuka file. Atribut yang ditentukan secara eksplisit hanya diterapkan saat file dibuat, digantikan, atau, dalam beberapa kasus, ditimpa. Secara default, nilai ini FILE_ATTRIBUTE_NORMAL, yang dapat ditimpa oleh bendera lain atau kombinasi bendera yang kompatibel. Anggota ini sesuai dengan parameter FileAttributes ke IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options adalah bitmask bendera yang menentukan opsi yang akan diterapkan saat membuat atau membuka file, dan tindakan yang akan diambil jika file sudah ada.

    8 bit tinggi dari parameter ini sesuai dengan parameter Disposisi ke IoCreateFileSpecifyDeviceObjectHint.

    24 bit rendah dari anggota ini sesuai dengan parameter CreateOptions ke IoCreateFileSpecifyDeviceObjectHint. Filter sistem file dan driver minifilter yang melakukan pemindaian file (seperti program antivirus) harus memperhatikan bendera FILE_COMPLETE_IF_OPLOCKED. Jika bendera ini diatur, filter tidak boleh memblokir atau menunda operasi IRP_MJ_CREATE.

    Jika bendera FILE_COMPLETE_IF_OPLOCKED diatur di jalur pra-buat (buat pengiriman), filter tidak boleh memulai salah satu jenis operasi berikut, karena dapat menyebabkan jeda oplock:

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    Jika filter atau minifilter tidak dapat menghormati bendera FILE_COMPLETE_IF_OPLOCKED, filter atau minifilter harus menyelesaikan permintaan IRP_MJ_CREATE dengan STATUS_SHARING_VIOLATION.

    Jika bendera FILE_COMPLETE_IF_OPLOCKED diatur di jalur penyelesaian (pasca-buat), filter harus memeriksa apakah sistem file telah mengatur Irp-IoStatus.Status> ke nilai status STATUS_OPLOCK_BREAK_IN_PROGRESS. Jika nilai status ini tidak diatur, filter aman untuk memulai salah satu operasi di atas pada file. Jika nilai status ini diatur, oplock belum rusak, dan filter tidak boleh memulai operasi apa pun yang dapat menyebabkan jeda oplock. Dengan demikian filter harus menunda semua operasi di atas pada file sampai salah satu kondisi berikut ini benar:

    • Pemilik oplock mengirimkan permintaan FSCTL_OPLOCK_BREAK_ACKNOWLEDGE ke sistem file.
    • Komponen sistem selain filter atau minifilter mengirimkan sistem file permintaan I/O yang harus menunggu hingga jeda oplock selesai (seperti IRP_MJ_READ atau IRP_MJ_WRITE). Filter atau minifilter dapat memulai salah satu operasi di atas dari rutinitas pengirimannya (atau panggilan balik praoperasi) untuk operasi baru ini, karena rutinitas panggilan balik pengiriman atau praoperasi dimasukkan ke dalam status tunggu sampai jeda oplock selesai.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> menunjuk ke struktur ACCESS_STATE yang berisi konteks subjek objek, jenis akses yang diberikan, dan jenis akses yang diinginkan yang tersisa.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> adalah struktur ACCESS_MASK yang menentukan hak akses yang diminta untuk file. Untuk informasi selengkapnya, lihat deskripsi parameter DesiredAccess ke IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess adalah bitmask hak akses berbagi yang diminta untuk file tersebut. Jika anggota ini nol, akses eksklusif sedang diminta. Untuk informasi selengkapnya, lihat deskripsi parameter ShareAccess ke IoCreateFileSpecifyDeviceObjectHint.

Lihat juga

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileBuka

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileBuka

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE (Referensi Kernel WDK)

ZwCreateFile

ZwOpenFile