Lokasi Tumpukan I/O

Manajer I/O memberi setiap driver dalam rantai driver berlapis lokasi tumpukan I/O untuk setiap IRP yang disiapkannya. Setiap lokasi tumpukan I/O terdiri dari struktur IO_STACK_LOCATION .

Manajer I/O membuat array lokasi tumpukan I/O untuk setiap IRP, dengan elemen array yang sesuai dengan setiap driver dalam rantai driver berlapis. Setiap driver memiliki salah satu lokasi tumpukan dalam paket dan memanggil IoGetCurrentIrpStackLocation untuk mendapatkan informasi khusus driver tentang operasi I/O.

Setiap driver dalam rantai seperti itu bertanggung jawab untuk memanggil IoGetNextIrpStackLocation, lalu menyiapkan lokasi tumpukan I/O driver yang lebih rendah berikutnya. Lokasi tumpukan I/O driver tingkat yang lebih tinggi juga dapat digunakan untuk menyimpan konteks tentang operasi sehingga rutinitas IoCompletion driver dapat melakukan operasi pembersihannya.

Gambar Runtime integrasi Pemrosesan dalam Driver Berlapis menunjukkan dua lokasi tumpukan I/O di IRP asli karena menunjukkan dua driver, driver sistem file dan driver perangkat penyimpanan massal. IRP yang dialokasikan driver dalam IRP Pemrosesan pada gambar Driver Berlapis tidak memiliki lokasi tumpukan untuk FSD (Driver Sistem File) yang membuatnya. Setiap driver tingkat yang lebih tinggi yang mengalokasikan IRP untuk driver tingkat bawah juga menentukan berapa banyak lokasi tumpukan I/O yang harus dimiliki IRP baru, sesuai dengan nilai StackSize dari objek perangkat driver berikutnya yang lebih rendah.

Gambar berikut menunjukkan konten IRP secara lebih rinci.

diagram yang mengilustrasikan konten lokasi tumpukan i/o dalam irp.

Seperti yang ditunjukkan pada gambar, setiap lokasi tumpukan I/O khusus driver dalam IRP berisi informasi umum berikut:

  • Kode fungsi utama (IRP_MJ_XXX), menunjukkan operasi dasar yang harus dilakukan driver

  • Untuk beberapa kode fungsi utama yang ditangani oleh FSD, driver SCSI tingkat lebih tinggi, dan semua driver PnP, kode fungsi minor (IRP_MN_XXX), menunjukkan subcase operasi dasar mana yang harus dilakukan driver

  • Sekumpulan argumen khusus operasi, seperti panjang dan lokasi awal buffer tempat atau dari mana driver mentransfer data

  • Penunjuk ke objek perangkat yang dibuat driver, mewakili perangkat target (fisik, logis, atau virtual) untuk operasi yang diminta

  • Penunjuk ke objek file, mewakili file, perangkat, direktori, atau volume yang terbuka

    Driver sistem file mengakses objek file melalui lokasi tumpukan I/O-nya di IRP. Driver lain biasanya mengabaikan objek file.

Kumpulan kode fungsi utama dan minor IRP yang ditangani driver tertentu dapat spesifik untuk jenis perangkat. Namun, driver tingkat terendah dan driver perantara (termasuk fungsi PnP dan driver filter) biasanya menangani serangkaian permintaan dasar berikut:

  • IRP_MJ_CREATE — buka objek perangkat target, yang menunjukkan bahwa objek tersebut ada dan tersedia untuk operasi I/O

  • IRP_MJ_READ — mentransfer data dari perangkat

  • IRP_MJ_WRITE — mentransfer data ke perangkat

  • IRP_MJ_DEVICE_CONTROL — siapkan (atau reset) perangkat, sesuai dengan kode kontrol I/O khusus jenis perangkat (IOCTL) yang ditentukan sistem

  • IRP_MJ_CLOSE — tutup objek perangkat target

  • IRP_MJ_PNP — lakukan operasi Plug and Play pada perangkat. Permintaan IRP_MJ_PNP dikirim oleh manajer PnP melalui manajer I/O.

  • IRP_MJ_POWER — lakukan operasi daya pada perangkat. Permintaan IRP_MJ_POWER dikirim oleh manajer daya melalui manajer I/O.

Untuk informasi selengkapnya tentang kode fungsi IRP utama yang harus ditangani driver, lihat Kode Fungsi Utama IRP.

Secara umum, manajer I/O mengirim RUN dengan setidaknya dua lokasi tumpukan I/O ke driver perangkat penyimpanan massal karena sistem file berlapis di atas driver lain untuk perangkat penyimpanan massal. Manajer I/O mengirim RUN dengan satu lokasi tumpukan ke driver apa pun yang tidak memiliki driver lain yang berlapis di atasnya.

Namun, manajer I/O memberikan dukungan untuk menambahkan driver baru ke rantai driver yang ada dalam sistem. Misalnya, driver cermin perantara yang mencadangkan data pada partisi disk tertentu mungkin dimasukkan di antara sepasang driver, seperti driver sistem file dan driver tingkat terendah yang ditunjukkan dalam Runtime integrasi Pemrosesan pada gambar Driver Berlapis . Ketika driver baru ini melampirkan dirinya ke tumpukan perangkat, manajer I/O menyesuaikan jumlah lokasi tumpukan I/O di semua RUN yang dikirimnya ke sistem file, cermin, dan driver tingkat terendah. Setiap IRP yang sistem file dalam runtime integrasi Pemrosesan pada gambar Driver Berlapis yang dialokasikan juga akan berisi lokasi tumpukan I/O lain untuk driver cermin baru tersebut.

Perhatikan bahwa dukungan ini untuk menambahkan driver baru ke rantai yang ada menyiratkan pembatasan tertentu pada akses driver tertentu ke lokasi tumpukan I/O di IRP:

  • Driver tingkat yang lebih tinggi dalam rantai driver berlapis hanya dapat mengakses sendiri dan lokasi tumpukan I/O driver tingkat lebih rendah berikutnya di IRP apa pun. Driver seperti itu harus mengatur lokasi tumpukan I/O untuk driver tingkat bawah berikutnya dalam RUN. Namun, ketika merancang driver tingkat yang lebih tinggi, Anda tidak dapat memprediksi kapan (atau apakah) driver baru akan ditambahkan ke rantai yang ada tepat di bawah driver Anda.

    Oleh karena itu, Anda harus berasumsi bahwa setiap driver yang kemudian ditambahkan akan menangani kode fungsi utama IRP yang sama (IRP_MJ_XXX) seperti yang dilakukan driver tingkat bawah berikutnya yang terlantar.

  • Driver tingkat terendah dalam rantai driver berlapis hanya dapat mengakses lokasi tumpukan I/O sendiri di IRP apa pun. Saat merancang driver seperti itu, Anda tidak dapat memprediksi kapan (atau apakah) driver baru akan ditambahkan ke rantai yang ada di atas driver perangkat Anda.

    Dalam merancang driver tingkat terendah, asumsikan bahwa driver dapat terus memproses IRP menggunakan informasi yang diteruskan di lokasi tumpukan I/O sendiri, apa pun sumber asal IRP tertentu dan namun banyak driver yang berlapis di atasnya.