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.
Gambar yang mengilustrasikan pembukaan objek file menunjukkan IRP dengan dua lokasi tumpukan I/O, tetapi IRP dapat memiliki sejumlah lokasi tumpukan I/O, tergantung pada berapa banyak driver berlapis yang akan menangani permintaan tertentu.
Gambar berikut menggambarkan secara lebih rinci bagaimana driver dalam gambar Membuka Objek File menggunakan rutinitas dukungan I/O (rutinitas IoXxx) untuk memproses IRP untuk permintaan baca atau tulis.
Manajer I/O memanggil driver sistem file (FSD) dengan IRP yang telah dialokasikan untuk permintaan baca/tulis subsistem. FSD mengakses lokasi tumpukan I/O-nya di IRP untuk menentukan operasi apa yang harus dilakukannya.
FSD dapat memecah permintaan asli menjadi permintaan yang lebih kecil (mungkin untuk lebih dari satu driver perangkat) dengan memanggil rutinitas dukungan I/O (IoAllocateIrp) satu atau beberapa kali untuk mengalokasikan IRP tambahan. IRP tambahan dikembalikan ke FSD dengan lokasi tumpukan I/O yang diisi dengan nol untuk pengendali tingkat rendah. Atas kebijakannya, FSD dapat menggunakan kembali IRP asli, daripada mengalokasikan IRP tambahan seperti yang ditunjukkan pada gambar sebelumnya, dengan menyiapkan lokasi tumpukan I/O driver berikutnya yang lebih rendah di IRP asli dan meneruskannya ke driver yang lebih rendah.
Untuk setiap IRP yang dialokasikan pengemudi, FSD pada gambar sebelumnya memanggil rutinitas dukungan I/O untuk mendaftarkan rutinitas penyelesaian yang disediakan FSD; dalam rutinitas penyelesaian, FSD dapat menentukan apakah driver yang lebih rendah memenuhi permintaan dan dapat membebaskan setiap IRP yang dialokasikan driver ketika driver yang lebih rendah telah menyelesaikannya. Manajer I/O akan memanggil rutinitas penyelesaian yang disediakan FSD apakah setiap IRP yang dialokasikan driver berhasil diselesaikan, diselesaikan dengan status kesalahan, atau dibatalkan. Driver tingkat tinggi bertanggung jawab untuk membebaskan setiap IRP (Indeks Request Packet) yang dialokasikan dan disiapkan atas namanya sendiri untuk driver tingkat bawah. Manajer I/O membebaskan IRP yang dialokasikan setelah semua driver menyelesaikannya.
Selanjutnya, FSD memanggil rutinitas dukungan I/O (IoGetNextIrpStackLocation) untuk mengakses lokasi tumpukan I/O driver tingkat lebih rendah berikutnya untuk menyiapkan permintaan driver berikutnya yang lebih rendah. (Pada angka sebelumnya, driver bawah berikutnya kebetulan adalah driver tingkat terendah.) FSD kemudian memanggil rutinitas dukungan I/O (IoCallDriver) untuk meneruskan IRP tersebut ke driver berikutnya yang lebih rendah.
Ketika dipanggil dengan IRP, driver tingkat terendah memeriksa lokasi tumpukan I/O-nya untuk menentukan operasi apa (ditunjukkan oleh kode fungsi IRP_MJ_XXX ) yang harus dilakukan pada perangkat target. Perangkat target diwakili oleh objek perangkat di lokasi tumpukan I/O yang ditunjuk dan diteruskan dengan IRP ke driver. Driver tingkat terendah dapat mengasumsikan bahwa manajer I/O telah merutekan IRP ke titik masuk yang ditentukan driver untuk operasi IRP_MJ_XXX (di sini IRP_MJ_READ atau IRP_MJ_WRITE) dan bahwa driver tingkat yang lebih tinggi telah memeriksa validitas parameter lain untuk permintaan tersebut.
Jika tidak ada driver tingkat yang lebih tinggi, driver tingkat terendah akan memeriksa apakah parameter input untuk operasi IRP_MJ_XXX valid. Jika ya, driver biasanya memanggil rutinitas dukungan I/O untuk memberi tahu manajer I/O bahwa operasi perangkat tertunda pada IRP dan untuk mengantrekan IRP atau meneruskannya ke rutinitas lain yang disediakan driver yang mengakses perangkat target (di sini, perangkat fisik atau logis: disk atau partisi pada disk).
Manajer I/O menentukan apakah driver sudah sibuk memproses IRP lain untuk perangkat target, mengantrekan IRP jika ya, dan kembali. Jika tidak, manajer I/O merutekan IRP ke rutinitas yang disediakan driver yang memulai operasi I/O pada perangkatnya. (Pada tahap ini, kedua driver pada gambar sebelumnya dan manajer I/O mengembalikan kendali.)
Ketika perangkat melakukan interupsi, rutinitas layanan interupsi driver (ISR) hanya melakukan apa yang harus dilakukan untuk menghentikan perangkat dari melakukan interupsi dan merekam konteks yang diperlukan tentang operasi. ISR kemudian memanggil rutin dukungan I/O (IoRequestDpc) dengan IRP untuk mengantrekan rutin DPC yang disediakan oleh driver (Panggilan Prosedur Tangguhan) untuk menyelesaikan operasi yang diminta dengan prioritas perangkat keras yang lebih rendah daripada ISR.
Ketika DPC driver mendapatkan kontrol, ia menggunakan konteks (yang diteruskan dalam pemanggilan ISR ke IoRequestDpc) untuk menyelesaikan operasi I/O. DPC memanggil rutinitas dukungan untuk menghapus antrean IRP berikutnya (jika ada) dan meneruskan IRP tersebut ke rutinitas yang disediakan driver yang memulai operasi I/O pada perangkat (lihat Langkah 5). DPC kemudian menetapkan status tentang operasi yang baru saja selesai di blok status I/O IRP dan mengembalikannya ke manajer I/O dengan IoCompleteRequest.
Manajer I/O mengatur nol untuk lokasi tumpukan I/O dari driver tingkat terendah di IRP dan memanggil rutinitas penyelesaian yang terdaftar untuk sistem file (lihat Langkah 3) dengan IRP yang dialokasikan FSD. Rutinitas penyelesaian ini memeriksa blok status I/O untuk menentukan apakah akan mencoba kembali permintaan atau memperbarui status internal apa pun yang dipertahankan tentang permintaan asli dan membebaskan IRP yang dialokasikan drivernya. Sistem file dapat mengumpulkan informasi status untuk semua IRP yang dialokasikan driver yang dikirimnya ke driver tingkat bawah sehingga dapat mengatur status I/O dan menyelesaikan IRP asli. Ketika sistem file telah menyelesaikan IRP asli, manajer I/O mengembalikan nilai NTSTATUS kepada pengguna awal (fungsi asli subsistem) dari operasi I/O.
Seperti driver sistem file yang ditunjukkan dalam gambar Pemrosesan IRP dalam Driver Berlapis, setiap driver baru yang ditambahkan ke dalam rantai driver yang ada dapat melakukan semua hal berikut:
Atur rutinitas penyelesaiannya sendiri di dalam IRP. Rutinitas IoCompletion memeriksa blok status I/O untuk menentukan apakah driver yang lebih rendah berhasil menyelesaikan IRP, membatalkan IRP, dan/atau menyelesaikannya dengan kesalahan. Rutinitas penyelesaian juga dapat memperbarui status IRP tertentu yang mungkin telah disimpan driver, melepaskan sumber daya khusus operasi apa pun yang mungkin telah dialokasikan driver, dan sebagainya, sebelum menyelesaikan IRP. Selain itu, rutinitas penyelesaian dapat menunda penyelesaian IRP (dengan memberi tahu manajer I/O bahwa lebih banyak pemrosesan diperlukan pada IRP), dan dapat mengirim permintaan lain ke driver tingkat bawah berikutnya sebelum memungkinkan IRP selesai.
Siapkan lokasi tumpukan I/O driver tingkat lebih rendah berikutnya di IRP yang dialokasikan dan kirim permintaan ke driver tingkat bawah berikutnya.
Teruskan permintaan masuk apa pun ke driver yang lebih rendah dengan menyiapkan lokasi tumpukan I/O driver yang lebih rendah berikutnya di setiap IRP dan memanggil IoCallDriver. (Perhatikan bahwa untuk IRP dengan kode fungsi utama IRP_MJ_POWER, driver harus menggunakan PoCallDriver.)
Setiap objek perangkat yang dibuat driver mewakili perangkat fisik, logis, atau virtual tempat driver tertentu melakukan permintaan I/O. Untuk informasi terperinci tentang membuat dan menyiapkan objek perangkat, lihat Objek Perangkat dan Tumpukan Perangkat.
Seperti yang juga ditunjukkan oleh gambar Pemrosesan IRP dalam Driver Berlapis, sebagian besar driver memproses setiap IRP secara bertahap melalui serangkaian rutinitas standar yang didefinisikan oleh sistem dan disediakan oleh driver, namun driver pada tingkat yang berbeda dalam rantai memiliki rutinitas standar yang berbeda. Misalnya, hanya driver tingkat terendah yang menangani gangguan dari perangkat fisik, sehingga hanya driver tingkat terendah yang akan memiliki ISR dan DPC yang menyelesaikan operasi I/O berbasis interupsi. Di sisi lain, karena driver seperti itu tahu bahwa I/O selesai ketika menerima gangguan dari perangkatnya, ia tidak perlu rutinitas penyelesaian. Hanya driver tingkat lebih tinggi yang akan memiliki satu atau beberapa rutinitas penyelesaian seperti FSD dalam gambar ini.