Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Untuk mengalokasikan IRP untuk permintaan asinkron, yang akan diproses dalam konteks utas arbitrer oleh driver yang lebih rendah, rutinitas DispatchReadWrite dapat memanggil salah satu rutinitas dukungan berikut:
IoAllocateIrp, yang mengalokasikan IRP dan sejumlah lokasi tumpukan I/O yang diinisialisasi nol
Rutinitas pengiriman harus mengatur lokasi tumpukan I/O driver berikutnya yang lebih rendah untuk IRP yang baru dialokasikan, biasanya dengan menyalin (mungkin dimodifikasi) informasi dari lokasi tumpukannya sendiri di IRP asli. Jika driver tingkat yang lebih tinggi mengalokasikan lokasi tumpukan I/O sendiri untuk IRP yang baru dialokasikan, rutinitas pengiriman dapat mengatur informasi konteks per permintaan di sana untuk rutinitas IoCompletion yang akan digunakan.
IoBuildAsynchronousFsdRequest, yang menyiapkan lokasi tumpukan I/O driver berikutnya yang lebih rendah untuk pemanggil, sesuai dengan parameter yang ditentukan pemanggil
Driver tingkat yang lebih tinggi dapat memanggil rutinitas ini untuk mengalokasikan runtime integrasi untuk permintaan IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERS, dan IRP_MJ_SHUTDOWN .
Ketika rutinitas IoCompletion dipanggil untuk IRP seperti itu, ia dapat memeriksa blok status I/O, dan jika perlu (atau mungkin) mengatur lokasi tumpukan I/O driver berikutnya yang lebih rendah di IRP lagi dan mencoba kembali permintaan atau menggunakannya kembali. Namun, rutinitas IoCompletion tidak memiliki penyimpanan konteks lokal untuk dirinya sendiri di IRP, sehingga driver harus mempertahankan konteks tentang permintaan asli di tempat lain dalam memori penduduk.
IoMakeAssociatedIrp, yang mengalokasikan IRP dan sejumlah lokasi tumpukan I/O yang diinisialisasi nol, dan mengaitkan IRP dengan IRP master .
Driver menengah tidak dapat memanggil IoMakeAssociatedIrp untuk membuat RUN untuk driver yang lebih rendah.
Setiap driver tingkat tertinggi yang memanggil IoMakeAssociatedIrp untuk membuat RUNPS untuk driver yang lebih rendah dapat mengembalikan kontrol ke manajer I/O setelah mengirim runtime integrasi terkait dan memanggil IoMarkIrpPending untuk IRP master asli. Driver tingkat tertinggi dapat mengandalkan manajer I/O untuk menyelesaikan IRP master ketika semua IRP terkait telah diselesaikan oleh driver yang lebih rendah.
Driver jarang mengatur rutinitas IoCompletion untuk IRP terkait. Jika driver tingkat tertinggi memanggil IoSetCompletionRoutine untuk IRP terkait yang dibuatnya, manajer I/O tidak menyelesaikan IRP master jika driver mengembalikan STATUS_MORE_PROCESSING_REQUIRED dari rutinitas IoCompletion-nya . Dalam keadaan ini, rutinitas IoCompletion driver harus secara eksplisit menyelesaikan IRP master dengan IoCompleteRequest.
Jika driver mengalokasikan lokasi tumpukan I/O sendiri di IRP baru, rutinitas pengiriman harus memanggil IoSetNextIrpStackLocation sebelum memanggil IoGetCurrentIrpStackLocation untuk mengatur konteks di lokasi tumpukan I/O sendiri untuk rutinitas IoCompletion . Untuk informasi selengkapnya, lihat Memproses RUNP di Driver Intermediate-Level.
Rutinitas pengiriman harus memanggil IoMarkIrpPending dengan IRP asli, tetapi tidak dengan IRP yang dialokasikan driver karena rutinitas IoCompletion akan membebaskannya.
Jika rutinitas pengiriman mengalokasikan IRP untuk transfer parsial dan driver perangkat yang mendasar mungkin mengontrol perangkat media yang dapat dilepas, rutinitas pengiriman harus menyiapkan konteks utas dalam IRP yang baru dialokasikan dari nilai di Tail.Overlay.Thread di IRP asli.
Driver yang mendasar untuk perangkat media yang dapat dilepas mungkin memanggil IoSetHardErrorOrVerifyDevice, yang mereferensikan pointer di Irp-Tail.Overlay.Thread>, untuk IRP yang dialokasikan driver. Jika driver memanggil rutinitas dukungan ini, driver sistem file dapat mengirim kotak dialog ke utas pengguna yang sesuai yang meminta pengguna untuk membatalkan, mencoba kembali, atau gagal operasi yang tidak dapat dipenuhi driver. Lihat Mendukung Media yang Dapat Dihapus untuk informasi selengkapnya.
Rutinitas pengiriman harus mengembalikan STATUS_PENDING setelah mengirim semua IRP yang dialokasikan driver ke driver yang lebih rendah.
Rutinitas IoCompletion driver harus membebaskan semua IRP yang dialokasikan driver dengan IoFreeIrp sebelum memanggil IoCompleteRequest untuk IRP asli. Ketika menyelesaikan IRP asli, rutinitas IoCompletion harus membebaskan semua IRP yang dialokasikan driver sebelum mengembalikan kontrol.
Setiap driver tingkat yang lebih tinggi menyiapkan IRP yang dialokasikan driver (dan digunakan kembali) untuk driver yang lebih rendah sedemikian rupa sehingga tidak relevan dengan driver perangkat yang mendasar apakah permintaan tertentu berasal dari driver perantara atau berasal dari sumber lain, seperti sistem file atau aplikasi mode pengguna.
Driver tingkat tertinggi dapat memanggil IoMakeAssociatedIrp untuk mengalokasikan IRP dan mengaturnya untuk rantai driver yang lebih rendah. Manajer I/O secara otomatis menyelesaikan IRP asli ketika semua IRP terkait telah selesai, selama driver tidak memanggil IoSetCompletionRoutine dengan IRP asli atau dengan salah satu IRP terkait yang dialokasikannya. Namun, driver tingkat tertinggi tidak boleh mengalokasikan IRP terkait untuk IRP apa pun yang meminta operasi I/O yang di-buffer.
Driver tingkat menengah tidak dapat mengalokasikan IRP untuk driver tingkat bawah dengan memanggil IoMakeAssociatedIrp. Setiap IRP yang diterima driver perantara mungkin sudah menjadi IRP terkait, dan driver tidak dapat mengaitkan IRP lain dengan IRP seperti itu.
Sebaliknya, jika driver perantara membuat IRP untuk driver yang lebih rendah, driver harus memanggil IoAllocateIrp, IoBuildDeviceIoControlRequest, IoBuildSynchronousFsdRequest, atau IoBuildAsynchronousFsdRequest. Namun, IoBuildSynchronousFsdRequest hanya dapat dipanggil dalam keadaan berikut:
Dengan utas yang dibuat driver untuk membangun RUN untuk permintaan baca atau tulis, karena utas tersebut dapat menunggu dalam konteks utas nonarbitrer (sendiri) pada objek dispatcher, seperti Peristiwa yang diinisialisasi driver yang diteruskan ke IoBuildSynchronousFsdRequest
Dalam konteks utas sistem selama inisialisasi atau saat membongkar
Untuk membangun IRP untuk operasi yang secara inheren sinkron, seperti membuat, membersihkan, mematikan, menutup, dan permintaan kontrol perangkat
Namun, driver lebih cenderung memanggil IoBuildDeviceIoControlRequest untuk mengalokasikan IRP kontrol perangkat daripada IoBuildSynchronousFsdRequest.