Bagikan melalui


Lokasi Tumpukan I/O

Manajer I/O memberikan setiap driver dalam rantai driver berlapis sebuah posisi tumpukan I/O untuk setiap IRP yang dikonstruksinya. 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 pada driver tingkat tinggi juga dapat digunakan untuk menyimpan informasi konteks mengenai operasi, sehingga rutinitas IoCompletion pada driver dapat melakukan operasi pembersihan.

Gambar Pemrosesan IRP dalam Driver Berlapis menunjukkan dua posisi tumpukan I/O di IRP asli karena memperlihatkan dua driver, yaitu driver sistem file dan driver perangkat penyimpanan massal. IRP yang dialokasikan oleh driver dalam gambar Pemrosesan IRP di Driver Berlapis tidak memiliki lokasi stack untuk FSD (Driver Sistem File) yang membuatnya. Setiap driver level tinggi yang mengalokasikan IRP untuk driver level lebih rendah juga menentukan jumlah lokasi tumpukan I/O untuk IRP baru, sesuai dengan nilai StackSize dari objek perangkat driver tingkat bawah berikutnya.

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, terdapat kode fungsi kecil (IRP_MN_XXX) yang menunjukkan kasus sub-operasi dasar mana yang harus dilakukan oleh driver.

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

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

  • Penunjuk ke objek file, mewakili file, perangkat, direktori, atau volume 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, pengelola I/O mengirim IRP dengan setidaknya dua lokasi tumpukan I/O ke driver perangkat penyimpanan massal karena sistem file ditumpuk di atas driver lainnya untuk perangkat penyimpanan massal. Manajer I/O mengirim IRP 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, penggerak cermin perantara yang mencadangkan data pada partisi disk tertentu mungkin dimasukkan antara sepasang driver, seperti driver sistem file dan driver tingkat terendah yang ditunjukkan dalam gambar Pemrosesan IRP dalam Driver Berlapis. Ketika driver baru ini terpasang ke dalam tumpukan perangkat, manajer I/O menyesuaikan jumlah lokasi tumpukan I/O di semua IRP yang dikirimnya ke sistem file, mirror, dan driver level terendah. Setiap IRP yang dialokasikan sistem file dalam Pemrosesan IRP pada Driver Berlapis 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 batasan tertentu pada akses driver tertentu ke lokasi tumpukan I/O di IRP:

  • Driver level tinggi dalam rantai driver bertingkat hanya dapat mengakses lokasi tumpukan I/O miliknya sendiri dan milik driver level lebih rendah berikutnya dalam IRP mana pun. Driver seperti itu harus mengatur lokasi tumpukan I/O untuk driver tingkat bawah berikutnya dalam IRP. Namun, saat 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 driver yang ditambahkan berikutnya akan menangani kode fungsi utama IRP yang sama (IRP_MJ_XXX) seperti driver tingkat bawah berikutnya yang terlantar.

  • Driver paling rendah dalam rantai driver berlapis hanya dapat mengakses lokasi tumpukan I/O sendiri pada 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-nya sendiri, apa pun sumber asal IRP tertentu dan berapa pun banyaknya driver yang berlapis di atasnya.