Membatalkan IRP Tunggu/Bangun

Hanya driver yang mengirim IRP tunggu/bangun yang dapat membatalkan IRP tersebut.

Driver mungkin perlu membatalkan IRP tunggu/bangun yang tertunda dalam keadaan berikut:

  • Driver menerima permintaan PnP IRP_MN_STOP_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE, atau IRP_MN_SURPRISE_REMOVAL untuk perangkat. Driver harus penerbitan ulang IRP tunggu/bangun (PoRequestPowerIrp) setelah perangkat dimulai ulang.

  • Sistem akan tidur, tetapi perangkat tidak boleh diaktifkan untuk membangunkan sistem.

    Misalnya, driver hub USB mungkin mengirim permintaan IRP_MN_WAIT_WAKE pada start-up perangkat jika nantinya menempatkan salah satu perangkat inputnya ke dalam keadaan tidur. Saat sistem dalam keadaan berfungsi, sinyal bangun dari perangkat mengembalikan perangkat ke status kerja (tetapi tidak berpengaruh pada status daya sistem). Ketika sistem bersiap untuk mematikan, driver hub USB membatalkan IRP ini jika perangkat tidak boleh diizinkan untuk membangkitkan sistem.

  • Sistem memasuki status tidur dari mana perangkat tidak dapat membangunkannya. Artinya, ia memasuki status kurang didukung daripada nilai SystemWake yang ditentukan dalam struktur DEVICE_CAPABILITIES .

  • Perangkat memasuki status daya yang tidak dapat merespons sinyal bangun. Artinya, ia memasuki status kurang didukung daripada nilai DeviceWake yang ditentukan dalam struktur DEVICE_CAPABILITIES .

Untuk membatalkan IRP tunggu/bangun, driver yang mengirim IRP memanggil IoCancelIrp, meneruskan pointer ke IRP yang sebelumnya dikembalikan ketika driver bernama PoRequestPowerIrp.

Driver tidak boleh membatalkan IRP tunggu/bangun yang tidak dikirimnya.

Batalkan Rutinitas untuk RUNP Tunggu/Bangun

Banyak driver fungsi dan bus harus mengatur Batalkan rutinitas untuk runtime integrasi tunggu/bangun yang tertunda; jenis driver berikut harus mengatur rutinitas tersebut:

  • Driver yang mengubah setelan perangkat untuk memfungsikan atau menonaktifkan bangun.

  • Driver yang mengirim IRP_MN_WAIT_WAKE permintaan ke driver perangkat induk.

Rutinitas Batal memungkinkan driver menonaktifkan bangun untuk perangkatnya dan membersihkan data apa pun yang terkait dengan IRP tunggu/bangun yang tertunda. Driver yang meminta runtime integrasi tunggu/bangun untuk perangkat induk juga dapat membatalkan IRP tersebut.

Dalam rutinitas Batalkan tunggu/bangun, driver harus mengambil langkah-langkah berikut:

  1. Panggil IoSetCancelRoutine untuk mengatur ulang rutinitas Batal untuk IRP ke NULL.

  2. Panggil IoReleaseCancelSpinLock, melewati CancelIRQL yang ditentukan dalam IRP untuk melepaskan kunci spin pembatalan untuk IRP.

  3. Reset bidang yang relevan di ekstensi perangkat. Misalnya, ketika IRP tunggu/bangun tertunda, sebagian besar driver mengatur bendera dan menyimpan penunjuk ke IRP di ekstensi perangkat.

    Perhatikan bahwa dimungkinkan bagi driver untuk menerima IRP tunggu/bangun saat membatalkan IRP lain seperti itu. Driver harus memeriksa untuk melihat apakah sudah memiliki IRP di bawah perlindungan kunci putaran (atau yang setara). Jika demikian, driver harus menyinkronkan penanganannya dengan hati-hati untuk memastikan bahwa ia membatalkan IRP yang benar. Untuk informasi selengkapnya tentang menggunakan kunci spin di Batalkan rutinitas, lihat Membatalkan RUNPS.

  4. Ubah pengaturan perangkat yang diperlukan. Misalnya, driver modem akan menonaktifkan pengaturan bangun perangkat.

  5. Atur Irp-IoStatus.Status> ke STATUS_CANCELLED.

  6. Panggil IoCompleteRequest untuk menyelesaikan IRP tunggu/bangun, yang menentukan IO_NO_INCREMENT.

  7. Jika sebelumnya driver meminta IRP_MN_WAIT_WAKE terkait untuk perangkat induk, driver harus membatalkan IRP tersebut dari dalam rutinitas Batalkan . Driver harus melepaskan kunci putar batal sebelum membatalkan IRP induk.

    Misalnya, driver yang bertindak sebagai driver bus untuk perangkat dan memiliki driver kebijakan daya untuk induknya harus membatalkan IRP tunggu/bangun terkait yang sebelumnya dikirim ke induknya. Memanggil IoCancelIrp akan memanggil rutinitas Batalkan induk, dan seterusnya di tumpukan perangkat.