Bagikan melalui


DispatchPower Routines

Fungsi rutin DispatchPower driver mendukung manajemen daya dengan menangani IRP untuk kode fungsi I/O IRP_MJ_POWER. Terkait dengan kode fungsi IRP_MJ_POWER adalah beberapa kode fungsi I/O kecil untuk Power Management. Manajer daya menggunakan kode fungsi kecil ini untuk mengarahkan driver untuk mengubah status daya, menunggu dan menanggapi peristiwa bangun sistem, dan untuk mengkueri driver tentang perangkat mereka.

Rutinitas DispatchPower setiap driver melakukan tugas-tugas berikut:

  • Tangani IRP jika memungkinkan.

  • Teruskan IRP ke driver di tingkat lebih rendah dalam tumpukan perangkat, menggunakan PoCallDriver.

  • Jika driver bus, lakukan operasi daya yang diminta pada perangkat dan selesaikan IRP.

Semua driver untuk perangkat harus memiliki kesempatan untuk menangani IRP daya untuk perangkat, kecuali dalam beberapa kasus di mana driver fungsi atau filter diizinkan untuk mematikan IRP. Sebagian besar driver fungsi dan filter melakukan beberapa pemrosesan atau mengatur rutinitas IoCompletion untuk setiap IRP daya, lalu meneruskan IRP ke driver di bawahnya tanpa menyelesaikannya. Akhirnya IRP mencapai sopir bus, yang secara fisik mengubah status daya perangkat jika diperlukan dan menyelesaikan IRP.

Ketika IRP telah selesai, manajer I/O memanggil rutinitas IoCompletion apa pun yang ditetapkan oleh driver saat IRP melakukan perjalanan ke tumpukan perangkat. Apakah driver perlu mengatur rutinitas penyelesaian tergantung pada jenis IRP dan persyaratan individu driver.

IRP Daya yang menyalakan perangkat harus ditangani terlebih dahulu oleh driver terendah di tumpukan perangkat (driver bus yang mendasar) dan kemudian oleh setiap driver berturut-turut pada tumpukan. Power IRPs yang mematikan perangkat harus ditangani terlebih dahulu oleh driver di bagian atas rangkaian perangkat dan kemudian oleh setiap driver selanjutnya dalam rangkaian.

Penanganan Khusus untuk Perangkat yang Dapat Dilepas

Dalam rutinitas DispatchPower mereka, driver perangkat yang dapat dilepas harus memeriksa untuk melihat apakah perangkat masih ada. Jika perangkat telah dihapus, driver tidak boleh meneruskan IRP ke driver bawah berikutnya. Sebagai gantinya, driver harus melakukan hal berikut:

  • Panggil PoStartNextPowerIrp untuk mulai memproses IRP daya berikutnya.

  • Atur Irp-IoStatus.Status> ke STATUS_DELETE_PENDING.

  • Panggil IoCompleteRequest, yang menentukan IO_NO_INCREMENT, untuk menyelesaikan IRP.

  • Mengembalikan kode STATUS_DELETE_PENDING.