Bagikan melalui


Menghapus Perangkat di Driver Bus

Saat menghapus perangkat anak (PDO anak), driver bus induk harus membatalkan operasi apa pun yang dilakukannya untuk menambahkan dan memulai perangkat.

Driver bus menghapus perangkat anak dengan prosedur seperti berikut dalam rutinitas DispatchPnP-nya :

  1. Apakah driver menangani permintaan IRP_MN_SURPRISE_REMOVAL sebelumnya untuk PDO ini?

    Jika demikian, lakukan pembersihan yang tersisa dan lewati ke langkah 4.

    Driver biasanya mempertahankan bendera di ekstensi perangkat yang menunjukkan apakah driver telah menangani permintaan IRP_MN_SURPRISE_REMOVAL untuk perangkat.

  2. Selesaikan permintaan apa pun yang diantrekan di driver.

  3. Hapus daya dari perangkat, jika driver bus mampu melakukannya, dan beri tahu manajer daya dengan memanggil PoSetPowerState.

    Driver bus mematikan perangkat anak, jika memungkinkan, dan memberi tahu manajer daya tentang perubahan status daya perangkat. Pengemudi bus melakukan ini sebagai tanggapan atas permintaan IRP_MN_REMOVE_DEVICE ; pemilik kebijakan daya perangkat tidak mengirim permintaan IRP_MN_SET_POWER saat perangkat sedang dihapus. Untuk informasi tambahan, lihat Manajemen Daya.

  4. Jika driver bus melaporkan perangkat ini dalam respons terbarunya terhadap permintaan IRP_MN_QUERY_DEVICE_RELATIONS untuk BusRelations, perangkat masih ada secara fisik pada komputer. Dalam hal ini, pengemudi bus:

    • Mempertahankan PDO untuk perangkat hingga perangkat dihapus secara fisik.

    • Mengatur Irp-IoStatus.Status> ke STATUS_SUCCESS.

    • Menyelesaikan IRP dengan IoCompleteRequest.

    • Mengembalikan dari rutinitas DispatchPnP .

    Driver bus harus terus melaporkan perangkat ini dalam enumerasi berikutnya (IRP_MN_QUERY_DEVICE_RELATIONS untuk BusRelations) hingga perangkat dihapus secara fisik. Manajer PnP melacak apakah perangkat yang dijumlahkan telah ditambahkan dan dimulai.

  5. Jika perangkat tidak disertakan dalam respons terbaru pengemudi bus terhadap permintaan IRP_MN_QUERY_DEVICE_RELATIONSuntuk BusRelations, driver bus menganggap perangkat dihapus secara fisik dari mesin. Dalam hal ini, pengemudi bus melakukan hal berikut:

    • Membersihkan alokasi, memori, peristiwa, dan sebagainya khusus perangkat.

    • Mengatur Irp-IoStatus.Status> ke STATUS_SUCCESS.

    • Menyelesaikan IRP dengan IoCompleteRequest.

    • Membebaskan PDO dengan IoDeleteDevice.

      Pengemudi bus harus menghapus PDO jika driver menghilangkan perangkat dari daftar BusRelations terbarunya. Jika pengguna menyambungkan perangkat ke komputer lagi, driver bus harus membuat PDO baru sebagai respons terhadap kueri BusRelations berikutnya. Jika driver bus menggunakan kembali PDO yang sama untuk instans baru perangkat, komputer tidak akan beroperasi dengan benar.

    • Mengembalikan dari rutinitas DispatchPnP .

Jika perangkat masih ada ketika manajer PnP mengirim permintaan IRP_MN_REMOVE_DEVICE , driver bus mempertahankan PDO. Jika, di lain waktu, perangkat dihapus secara fisik dari bus, manajer PnP mengirimkan IRP_MN_REMOVE_DEVICE lain. Setelah menerima penghapusan IRP berikutnya, driver bus menghapus PDO untuk perangkat.

Pengemudi bus harus dapat menangani IRP_MN_REMOVE_DEVICE untuk perangkat yang telah dihapus dan PDO-nya ditandai untuk dihapus. Menanggapi IRP seperti itu, pengemudi bus dapat berhasil melakukan IRP atau mengembalikan STATUS_NO_SUCH_DEVICE. PDO untuk perangkat belum dihapus dalam hal ini, meskipun panggilan sebelumnya driver bus ke IoDeleteDevice, karena beberapa komponen masih memiliki referensi ke objek . Oleh karena itu, pengemudi bus dapat mengakses PDO saat menangani penghapusan kedua IRP. Pengemudi bus tidak boleh memanggil IoDeleteDevice untuk kedua kalinya untuk PDO; sistem I/O menghapus PDO ketika jumlah referensinya mencapai nol.

Driver bus tidak menghapus struktur datanya untuk perangkat anak hingga menerima permintaan IRP_MN_REMOVE_DEVICE untuk perangkat. Driver bus mungkin mendeteksi bahwa perangkat telah dihapus dan memanggil IoInvalidateDeviceRelations, tetapi tidak boleh menghapus PDO perangkat sampai manajer PnP mengirim permintaan IRP_MN_REMOVE_DEVICE .