IRP_MN_WAIT_WAKE

IRP ini memungkinkan driver untuk membangunkan sistem tidur atau membangunkan perangkat tidur.

Kode Utama

IRP_MJ_POWER

Ketika Dikirim

Driver yang memiliki kebijakan daya menargetkan IRP ini ke PDO-nya untuk memungkinkan perangkatnya terbangun sebagai respons terhadap peristiwa eksternal, seperti panggilan telepon masuk. Driver harus memanggil PoRequestPowerIrp untuk mengirim IRP ini.

Sebagai aturan umum, driver harus mengirim IRP ini segera setelah menentukan bahwa perangkatnya harus diaktifkan untuk bangun. Akibatnya, driver untuk sebagian besar perangkat tersebut mengirim IRP ini setelah menyalakan perangkat mereka dan sebelum menyelesaikan permintaan IRP_MN_START_DEVICE .

Namun, driver dapat mengirim IRP setiap kali perangkat dalam status berfungsi (PowerDeviceD0). Tumpukan perangkat tidak boleh dalam transisi; artinya, driver tidak boleh mengirim IRP_MN_WAIT_WAKE sementara IRP daya lainnya aktif di tumpukan perangkatnya.

IRP tunggu/bangun tidak mengubah status daya perangkat atau sistem. Ini hanya memungkinkan sinyal bangun dari perangkat. Ketika sinyal bangun tiba, pemilik kebijakan harus memanggil PoRequestPowerIrp untuk mengirim IRP set-power untuk mengembalikan perangkatnya ke D0.

Driver harus berjalan di IRQL = PASSIVE_LEVEL untuk mengirim IRP ini. Namun, IRP dapat diselesaikan di IRQL = DISPATCH_LEVEL.

Parameter Input

Parameters.WaitWake.PowerState berisi status daya sistem terendah (paling sedikit bertenaga) dari mana perangkat harus diizinkan untuk membangunkan sistem.

Parameter Output

Tidak ada.

Blok Status I/O

Driver mengatur Irp-IoStatus.Status> ke salah satu hal berikut:

STATUS_PENDING
Driver menerima IRP dan menunggu perangkat untuk memberi sinyal bangun.

STATUS_INVALID_DEVICE_STATE
Perangkat dalam keadaan kurang bertenaga daripada status DeviceWake yang ditentukan dalam struktur DEVICE_CAPABILITIES untuk perangkat, atau perangkat tidak dapat membangkitkan sistem dari status SystemWake yang diteruskan dalam IRP.

STATUS_NOT_SUPPORTED
Perangkat tidak mendukung bangun.

STATUS_DEVICE_BUSY
Permintaan IRP_MN_WAIT_WAKE sudah tertunda dan harus diselesaikan atau dibatalkan sebelum permintaan IRP_MN_WAIT_WAKE lain dapat dikeluarkan.

STATUS_SUCCESS
Perangkat telah memberi sinyal peristiwa bangun.

STATUS_CANCELLED
IRP telah dibatalkan.

Jika driver harus gagal dalam IRP ini, driver akan segera menyelesaikan IRP dan tidak meneruskan IRP ke driver yang lebih rendah berikutnya.

Operasi

Driver mengirim IRP_MN_WAIT_WAKE karena salah satu dari dua alasan:

  1. Untuk memungkinkan perangkatnya membangunkan sistem tidur sebagai respons terhadap sinyal bangun eksternal.

  2. Untuk memungkinkan perangkatnya terbangun dari status tidur perangkat sebagai respons terhadap sinyal bangun eksternal.

IRP harus diteruskan ke tumpukan perangkat ke driver bus untuk perangkat, yang memanggil IoMarkIrpPending dan mengembalikan STATUS_PENDING dari rutinitas DispatchPower - nya. IRP tetap tertunda sampai sinyal bangun terjadi atau sampai driver yang mengirim IRP membatalkannya.

Hanya satu IRP tunggu/bangun yang dapat ditahan tertunda untuk PDO pada waktu tertentu. Jika driver sudah memegang IRP tunggu/bangun untuk PDO, IRP tambahan tersebut harus gagal dengan STATUS_DEVICE_BUSY. Driver yang menghitung lebih dari satu PDO anak dapat memiliki IRP tunggu/bangun yang tertunda untuk setiap PDO tersebut.

Setiap driver menetapkan rutinitas IoCompletion saat IRP menelusuri tumpukan perangkat. Ketika perangkat memberi sinyal peristiwa bangun, driver bus melayani sinyal bangun dan menyelesaikan IRP, mengembalikan STATUS_SUCCESS. Manajer I/O kemudian memanggil rutinitas IoCompletion dari driver yang lebih tinggi berikutnya, dan seterusnya pada tumpukan perangkat.

Ketika driver mengirim IRP tunggu/bangun, driver harus menentukan rutinitas panggilan balik dalam panggilan PoRequestPowerIrp . Dalam rutinitas panggilan balik, driver biasanya melayani perangkat. Misalnya, pemilik kebijakan daya untuk perangkat harus memanggil PoRequestPowerIrp untuk mengirim IRP_MN_SET_POWER untuk status perangkat D0.

Driver yang bertindak sebagai driver bus untuk satu perangkat dan pemilik kebijakan untuk perangkat induk meminta IRP IRP_MN_WAIT_WAKE untuk tumpukan perangkat induk ketika menerima permintaan IRP_MN_WAIT_WAKE dari PDO anak. Jika driver menghitung lebih dari satu PDO anak, driver harus meminta hanya satu IRP tunggu/bangun untuk tumpukan perangkat induk tidak peduli berapa banyak PDO anak yang mengirim permintaan tunggu/bangun. Sebaliknya, driver seperti itu harus menyimpan jumlah internal runtime integrasi tunggu/bangun, meningkatkan jumlah setiap kali menerima permintaan dan mengurangi hitungan setiap kali menyelesaikan permintaan. Jika jumlahnya bukan nol setelah menyelesaikan IRP tunggu/bangun, driver harus mengirim IRP tunggu/bangun lain ke tumpukan perangkatnya ke "rearm" itu sendiri untuk bangun. Untuk informasi selengkapnya, lihat Memahami Jalur IRP Tunggu/Bangun melalui Pohon Perangkat.

Untuk membatalkan IRP_MN_WAIT_WAKE, driver memanggil IoCancelIrp. Hanya driver yang berasal dari IRP yang dapat membatalkannya. Driver membatalkan IRP_MN_WAIT_WAKE tertunda ketika salah satu hal berikut ini terjadi:

  • Driver menerima IRP PnP yang menghentikan atau menghapus perangkat.

  • Sistem akan tidur dan sinyal bangun perangkat tidak boleh membangunkannya.

Persyaratan

Header

Wdm.h (termasuk Wdm.h, Ntddk.h, atau Ntifs.h)

Lihat juga

PoRequestPowerIrp