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.
Saat menghapus perangkat, driver fungsi harus membatalkan operasi apa pun yang dilakukannya untuk menambahkan dan memulai perangkat. Diskusi ini mencakup driver fungsi untuk perangkat periferal dan driver fungsi untuk perangkat bus.
Driver fungsi menghapus perangkat menggunakan prosedur seperti berikut ini dalam rutinitas DispatchPnP-nya :
Apakah ini driver fungsi untuk perangkat bus?
Jika demikian, mungkin menghapus PDO anak yang luar biasa untuk perangkat di bus.
Jika pengemudi bus menangani permintaan IRP_MN_SURPRISE_REMOVAL sebelumnya untuk perangkat anak, tetapi pengemudi belum menerima permintaan IRP_MN_REMOVE_DEVICE berikutnya, pengemudi bus meninggalkan PDO anak tetap utuh. Di lain waktu, ketika semua handel ke perangkat anak ditutup, manajer PnP akan mengirim hapus IRP untuk perangkat anak dan driver bus menghapus PDO anak pada saat itu.
Jika pengemudi bus menangani permintaan IRP_MN_REMOVE_DEVICE sebelumnya untuk perangkat, dan belum ada permintaan IRP_MN_SURPRISE_REMOVAL berikutnya, maka driver bus menghapus PDO anak. Dalam hal ini, manajer PnP memastikan bahwa setiap fungsi dan driver filter telah dihapus dari perangkat anak (FDO dan filter DO telah dihapus) sebelum mengirim hapus IRP ke perangkat bus induk. PDO anak mungkin masih ada, sehingga pengemudi bus harus menghapus PDO anak sebelum menghapus perangkat bus.
Apakah driver sudah menangani permintaan IRP_MN_SURPRISE_REMOVAL sebelumnya untuk FDO ini?
Jika demikian, lakukan pembersihan yang tersisa dan lewati ke langkah 8, IoCallDriver.
Driver biasanya mempertahankan bendera di ekstensi perangkat yang menunjukkan apakah driver telah menangani permintaan IRP_MN_SURPRISE_REMOVAL untuk perangkat.
Jika driver sebelumnya mengaktifkan perangkat untuk bangun, batalkan permintaan IRP_MN_WAIT_WAKE .
Pastikan perangkat tidak aktif.
Jika perangkat belum tidak aktif sebagai respons terhadap IRP_MN_QUERY_REMOVE_DEVICE sebelumnya, driver harus menandai perangkat sebagai tidak menerima permintaan baru dan harus menyelesaikan permintaan apa pun yang diantrekan di driver ini. Driver harus menggagalkan permintaan luar biasa yang memerlukan akses ke perangkat.
Driver dapat menggunakan rutinitas IoXxxRemoveLockXxx untuk menghitung I/O yang luar biasa dan untuk mengatur peristiwa yang menunjukkan bahwa penghapusan pemrosesan dapat dilanjutkan.
Lakukan operasi power-down apa pun.
Setiap driver untuk perangkat melakukan operasi matikan, jika ada, ketika menerima permintaan IRP_MN_REMOVE_DEVICE . Pemilik kebijakan daya untuk perangkat, biasanya driver fungsi, tidak mengirim permintaan IRP_MN_SET_POWER terpisah untuk mengatur status daya perangkat ke D3. Sopir bus induk biasanya mematikan slot dan memberi tahu manajer daya dengan PoSetPowerState ketika pengemudi bus mendapatkan hapus IRP. Untuk informasi tambahan, lihat Manajemen Daya.
Nonaktifkan antarmuka perangkat apa pun dengan memanggil IoSetDeviceInterfaceState.
Bebaskan sumber daya perangkat keras apa pun untuk perangkat yang digunakan oleh driver.
Operasi yang tepat tergantung pada perangkat dan driver tetapi dapat mencakup pemutusan sambungan yang mengganggu IoDisconnectInterrupt, membebaskan rentang alamat fisik dengan MmUnmapIoSpace, dan membebaskan port I/O.
Teruskan permintaan IRP_MN_REMOVE_DEVICE ke driver berikutnya.
Siapkan lokasi tumpukan IRP untuk driver bawah berikutnya dengan IoSkipCurrentIrpStackLocation dan teruskan IRP ke driver berikutnya dengan IoCallDriver.
Driver tidak diharuskan menunggu driver yang mendasar menyelesaikan operasi penghapusan sebelum melanjutkan aktivitas penghapusannya.
Hapus objek perangkat dari tumpukan perangkat dengan IoDetachDevice.
Tentukan penunjuk ke objek perangkat bawah berikutnya sebagai parameter TargetDevice . Driver menerima pointer seperti itu dari panggilan ke IoAttachDeviceToDeviceStack dalam rutinitas AddDevice driver.
Bersihkan alokasi, memori, peristiwa, dan sebagainya khusus perangkat apa pun.
Bebaskan FDO dengan IoDeleteDevice.
Kembali dari rutinitas DispatchPnP , menyebarkan status pengembalian dari IoCallDriver.
Driver fungsi tidak menentukan rutinitas IoCompletion untuk hapus IRP, juga tidak menyelesaikan IRP. Hapus IRP diselesaikan oleh sopir bus induk.