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.
Driver baru harus menggunakan kerangka kerja antrean IRP yang aman-batal di preferensi metode yang diuraikan di bagian ini.
Driver dengan utas yang didedikasikan untuk perangkat atau driver yang menggunakan utas kerja eksekutif, seperti sebagian besar FSD sistem, adalah jenis driver yang paling mungkin mengelola antrean internal run-time IRP mereka sendiri dalam antrean berinterlock. Semua driver PnP, termasuk driver WDM, juga harus mengantrekan IRP tertentu secara internal sambil membuat transisi PnP dan transisi status daya.
Biasanya, driver ini menyiapkan antrean bertaut ganda yang saling mengunci; setiap IRP berisi anggota dari jenis LIST_ENTRY, yang dapat digunakan driver untuk menautkan IRP secara berpasangan yang saat ini dipegangnya. Driver tidak dapat mengantrekan ulang IRP untuk percobaan ulang jika menyiapkan antrean berantai tunggal yang saling berhubungan.
Pengandar harus mengatur antrean yang saling mengunci pada inisialisasi perangkat. Gambar berikut menggambarkan antrean terhubung ganda yang berinterlock, rutinitas pendukung yang harus dipanggil driver untuk mengatur antrean seperti itu, dan satu set rutinitas ExInterlockedXxx yang dapat dipanggil driver untuk memasukkan IRP ke dalam dan menghapus IRP dari antrean.
Seperti terlihat pada gambar ini, pengemudi perangkat harus menyediakan penyimpanan untuk antrean itu sendiri dan elemen berikut untuk menyiapkan antrean bertaut ganda:
Kunci putaran eksekutif, yang harus dipanggil driver untuk menginisialisasi menggunakan KeInitializeSpinLock. Biasanya, sebuah driver menginisialisasi spin lock saat mengatur ekstensi perangkat untuk objek perangkatnya di rutinitas AddDevice.
Kepala daftar untuk antrean, yang harus dianaskan oleh driver dengan memanggil InitializeListHead.
Sebagian besar driver yang menggunakan antrean tertaut ganda menyediakan penyimpanan yang diperlukan dalam ekstensi perangkat objek perangkat yang dibuat driver. Antrean dan kunci putaran eksekutif dapat berada di ekstensi pengontrol (jika driver menggunakan objek pengontrol) atau di kumpulan yang tidak dialokasikan oleh driver.
Saat driver menerima permintaan I/O, driver dapat memasukkan IRP ke dalam antreannya dengan memanggil salah satu rutinitas dukungan berikut jika ListHead berjenis LIST_ENTRY, seperti yang ditunjukkan pada gambar sebelumnya:
ExInterlockedInsertTailList untuk menempatkan IRP di akhir antrean
ExInterlockedInsertHeadList untuk menempatkan IRP di bagian depan antrean. Driver biasanya memanggil rutinitas ini hanya ketika mereka harus mencoba kembali permintaan tertentu.
Driver harus meneruskan pointer ke IRP (ListEntry), serta penunjuk ListHead dan kunci putar eksekutif (Lock) yang sebelumnya diinisialisasi, ke masing-masing rutinitas ExInterlockedInsertXxxList ini. Hanya penunjuk ke ListHead dan Lock yang diperlukan saat driver mengeluarkan IRP dari antrean dengan memanggil ExInterlockedRemoveHeadList. Untuk mencegah kebuntuan, driver tidak boleh memegang ExecutiveSpinLock yang diteruskan ke rutinitas ExInterlockedXxx .
Karena antrean yang saling mengunci dilindungi oleh kunci putaran eksekutif, driver dapat memasukkan IRP ke dalam antrean yang ditautkan dua kali lipat dan menghapusnya dengan cara yang aman multiprosesor dari rutinitas driver apa pun yang berjalan kurang dari atau sama dengan IRQL = DISPATCH_LEVEL.
Antrean dengan ListHead jenis LIST_ENTRY, seperti yang ditunjukkan pada gambar sebelumnya, adalah daftar tertaut ganda. Satu dengan ListHead jenis SLIST_HEADER adalah daftar yang ditautkan secara berurutan. Driver menginisialisasi ListHead untuk antrian tautan tunggal berurutan yang terkunci dengan memanggil ExInitializeSListHead.
Driver yang tidak pernah mengulang operasi I/O dapat menggunakan ExInterlockedPushEntrySList dan ExInterlockedPopEntrySList untuk mengelola antrian IRP secara internal dalam antrian bertaut tunggal yang diurutkan dan saling terkunci. Setiap driver yang menggunakan jenis antrean yang saling mengunci ini juga harus menyediakan penyimpanan tetap untuk ListHead jenis SLIST_HEADER dan untuk ExecutiveSpinLock, seperti yang ditunjukkan pada gambar sebelumnya. Ia harus menginisialisasi kunci spin dan mengatur antreannya sebelum memanggil ExInterlockedPushEntrySList untuk memasukkan entri awal ke dalam antreannya.
Untuk informasi selengkapnya, lihat Mengelola Prioritas Perangkat Keras dan Kunci Putar. Untuk persyaratan IRQL untuk rutinitas dukungan tertentu, lihat halaman referensi rutin.