Menangani IRP_MN_SET_POWER untuk Status Daya Perangkat
IRP set-power perangkat meminta perubahan status untuk satu perangkat dan dikirim ke semua driver di tumpukan untuk perangkat. IRP seperti itu menentukan DevicePowerState di anggota Power.Type dari lokasi tumpukan I/O.
Driver menangani runtime integrasi power-down saat mereka melakukan perjalanan menumpuk. Untuk runtime integrasi power-up, driver mengatur rutinitas IoCompletion saat IRP menelusuri tumpukan, lalu menangani RUNP dalam rutinitas IoCompletion saat runtime integrasi mencadangkan tumpukan. Driver dalam tumpukan perangkat umum menangani IRP set-power perangkat sebagai berikut:
Sebagian besar driver filter hanya boleh memanggil IoMarkIrpPending, meneruskan IRP ke driver yang lebih rendah berikutnya (lihat Passing Power IRP), dan mengembalikan STATUS_PENDING dari rutinitas DispatchPower . Namun, beberapa driver filter mungkin terlebih dahulu perlu melakukan tugas khusus perangkat, seperti mengantrekan IRP masuk atau menyimpan status daya perangkat.
Driver fungsi memanggil IoMarkIrpPending, melakukan tugas khusus perangkat (seperti menyelesaikan permintaan I/O yang tertunda, mengantre permintaan I/O yang masuk, menyimpan konteks perangkat, atau mengubah daya perangkat), mengatur rutinitas IoCompletion jika perlu, dan meneruskan IRP daya perangkat ke driver yang lebih rendah berikutnya (lihat Passing Power IRP). Ini mengembalikan STATUS_PENDING dari rutinitas DispatchPower-nya .
Driver bus mengubah daya perangkat jika mampu melakukannya dan kemudian memanggil PoSetPowerState untuk memberi tahu manajer daya tentang status daya perangkat baru. Di Windows Server 2003, Windows XP, dan Windows 2000 saja, driver juga harus memanggil PoStartNextPowerIrp untuk memulai power IRP berikutnya setelah menetapkan status daya. Driver kemudian menyelesaikan IRP, menentukan IO_NO_INCREMENT. Jika driver tidak dapat segera menyelesaikan IRP, driver memanggil IoMarkIrpPending, mengembalikan STATUS_PENDING dari rutinitas DispatchPower-nya , dan menyelesaikan IRP nanti.
Bahkan jika perangkat target sudah dalam status daya yang diminta, setiap fungsi atau driver filter harus meneruskan IRP ke driver yang lebih rendah berikutnya. Setiap IRP set-power harus melakukan perjalanan sepanjang jalan menumpuk tumpukan perangkat ke pengemudi bus, yang menyelesaikannya.
Fungsi dan filter driver yang terletak di atas driver bus tidak boleh gagal IRP daya set perangkat. Driver bus dapat mengalihkan IRP daya perangkat jika perangkat dilepas atau sedang dilepas.
Setiap driver (fungsi, filter, dan driver bus) dalam tumpukan driver harus memanggil PoSetPowerState untuk memberi tahu manajer daya tentang perubahan status daya objek perangkat yang sesuai.
Seperti tugas driver lain yang terkait dengan power-up dan power-down perangkat, panggilan ke PoSetPowerState harus terjadi setelah perangkat menyala (jika status baru adalah D0) atau sebelum perangkat mati (jika status baru adalah status lain).
Setiap driver harus melacak status daya perangkatnya. Manajer daya tidak menyediakan informasi ini kepada driver.
Saat menangani permintaan IRP_MN_SET_POWER untuk status daya perangkat, driver harus kembali dari rutinitas DispatchPower secepat mungkin. Driver tidak boleh menunggu dalam rutinitas DispatchPower untuk peristiwa kernel yang disinyalir oleh kode yang menangani IRP yang sama. Karena RUNP daya disinkronkan di seluruh sistem, kebuntuan mungkin terjadi.
Untuk memastikan tingkat performa sistem tertinggi, terutama untuk aplikasi multimedia, driver harus melakukan operasi yang memakan waktu pada tingkat permintaan interupsi (IRQL) sama dengan PASSIVE_LEVEL. Untuk melakukan operasi di IRQL= PASSIVE_LEVEL, driver dapat menggunakan utas khusus atau utas pekerja sistem. Untuk panduan tentang mengoptimalkan performa driver untuk platform multimedia, lihat Panduan Desain Perangkat Media Streaming.
Langkah-langkah tepat yang harus dilakukan driver untuk menangani IRP daya tergantung pada apakah perangkat menyala atau mati, seperti yang dijelaskan di bagian berikut: