Bagikan melalui


Mengirimkan IRP ke Antrean I/O

[Berlaku untuk KMDF dan UMDF]

Driver berbasis kerangka kerja dapat secara dinamis menentukan antrean target untuk IRP masuk. Untuk mengirimkan IRP ke antrean tertentu, driver harus memanggil metode WdfDeviceWdmDispatchIrpToIoQueue .

Biasanya, driver memanggil WdfDeviceWdmDispatchIrpToIoQueue dari fungsi panggilan balik EvtDeviceWdmIrpPreprocess atau EvtDeviceWdmIrpDispatch . Untuk performa terbaik, sebagian besar driver tidak menyediakan kedua fungsi panggilan balik.

Catatan Driver UMDF dapat menyediakan fungsi panggilan balik EvtDeviceWdmIrpDispatch , tetapi hanya driver KMDF yang dapat menyediakan EvtDeviceWdmIrpPreprocess.

Jika driver Anda sudah menyediakan EvtDeviceWdmIrpPreprocess, Anda dapat menggunakannya untuk memilih antrean secara dinamis. Jika tidak, berikan EvtDeviceWdmIrpDispatch dan panggil WdfDeviceWdmDispatchIrpToIoQueue dari dalam fungsi panggilan balik tersebut.

Selain itu, Anda harus mengetahui hal-hal berikut:

Mengirimkan IRP Yang Tidak Diproses Sebelumnya

Untuk mengirimkan runtime integrasi dari fungsi panggilan balik EvtDeviceWdmIrpDispatch driver, gunakan prosedur berikut:

  1. Dari fungsi panggilan balik EvtDriverDeviceAdd , driver memanggil fungsi panggilan balik WdfDeviceConfigureWdmIrpDispatchCallback untuk mendaftarkan fungsi panggilan balik EvtDeviceWdmIrpDispatch .

    Jika target adalah antrean I/O perangkat induk, driver KMDF harus memanggil WdfPdoInitAllowForwardingRequestToParent sebelum memanggil WdfDeviceCreate. Jika driver KMDF juga telah menyediakan fungsi panggilan balik EvtDeviceWdmIrpPreprocess , kerangka kerja memanggil yang berfungsi terlebih dahulu ketika IRP tiba. Setelah fungsi panggilan balik melakukan praproses permintaan, fungsi memanggil WdfDeviceWdmDispatchPreprocessedIrp untuk mengembalikan IRP ke kerangka kerja.

  2. Kerangka kerja memanggil fungsi panggilan balik EvtDeviceWdmIrpDispatch driver.

  3. Dari dalam EvtDeviceWdmIrpDispatch, driver dapat memanggil WdfDeviceWdmDispatchIrpToIoQueue atau WdfDeviceWdmDispatchIrp, tetapi tidak keduanya. Driver KMDF memiliki opsi tambahan untuk memanggil tidak satu pun dari metode ini, dan sebaliknya menyelesaikan IRP atau menandainya tertunda.

  4. Jika driver KMDF telah menetapkan bendera WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK dan belum mengaktifkan kemajuan penerusan terjamin untuk antrean I/O target, kerangka kerja kemudian memanggil EvtIoInCallerContext driver, jika disediakan. Setelah memproses permintaan sebelumnya, fungsi panggilan balik harus mengantrenya dengan memanggil WdfDeviceEnqueueRequest atau menyelesaikannya dengan memanggil WdfRequestComplete.

Mengirimkan IRP yang Telah Diproses Sebelumnya

Untuk mengirimkan runtime integrasi dari fungsi panggilan balik EvtDeviceWdmIrpPreprocess driver ke antrean I/O tertentu, gunakan prosedur berikut:

  1. Driver mendaftarkan fungsi panggilan balik EvtDeviceWdmIrpPreprocess dengan memanggil WdfDeviceInitAssignWdmIrpPreprocessCallback.
  2. Driver memanggil WdfPdoInitAllowForwardingRequestToParent jika targetnya adalah antrean I/O perangkat induk.
  3. Dari EvtDeviceWdmIrpPreprocess, panggil WdfDeviceWdmDispatchIrpToIoQueue dengan Bendera diatur ke WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP.
  4. Jika driver telah mengatur bendera WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK dan belum mengaktifkan kemajuan penerusan yang dijamin untuk antrean I/O target, kerangka kerja kemudian memanggil EvtIoInCallerContext driver, jika disediakan. Setelah fungsi panggilan balik selesai melakukan praproses permintaan, fungsi tersebut harus mengantrenya dengan memanggil WdfDeviceEnqueueRequest atau menyelesaikannya dengan memanggil WdfRequestComplete.