Aturan DeferredRequestCompleted (kmdf)
Aturan DeferredRequestCompleted menentukan bahwa jika permintaan I/O yang disajikan ke antrean I/O default driver tidak diselesaikan dalam fungsi panggilan balik tetapi ditangguhkan untuk diproses nanti, permintaan harus diselesaikan dalam fungsi panggilan balik pemrosesan yang ditangguhkan, kecuali permintaan diteruskan dan dikirimkan ke kerangka kerja, atau kecuali metode WdfRequestStopAcknowledge dipanggil.
Aturan DeferredRequestCompleted mengharuskan Anda mengidentifikasi permintaan yang ditangguhkan menggunakan makro __sdv_save_request dan __sdv_retrieve_request . Untuk informasi tentang cara menggunakan makro ini, lihat Menggunakan __sdv_save_request dan __sdv_retrieve_request untuk Panggilan Prosedur Yang Ditangguhkan. Aturan prasyarat AliasWithinTimerDpc memeriksa keberadaan makro ini.
Permintaan yang disajikan ke antrean default driver melalui salah satu fungsi panggilan balik antrean dan ditangguhkan, harus diselesaikan sebelum keluar dari fungsi panggilan balik permintaan I/O, kecuali dalam kasus berikut:
Permintaan I/O diteruskan ke target I/O atau ke antrean lain
Permintaan I/O dikirimkan ke kerangka kerja (dengan memanggil WdfDeviceEnqueueRequest)
Metode WdfRequestStopAcknowledge dipanggil
Aturan diverifikasi ketika driver keluar dari fungsi panggilan balik berikut:
EvtIoStop, EvtCleanupCallback , atau EvtDestroyCallback untuk antrean
EvtCleanupCallback atau EvtDestroyCallback untuk objek file
EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback atau EvtDestroyCallback untuk perangkat
EvtDriverUnload
Fungsi panggilan balik antrean I/O untuk presentasi permintaan I/O adalah EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl, dan EvtIoInternalDeviceControl.
Fungsi panggilan balik pemrosesan yang ditangguhkan untuk permintaan I/O adalah EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable, dan EvtWorkItem.
Aturan DeferredRequestCompleted menggunakan panggilan ke metode WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize, atau WdfWorkItemEnqueue untuk menunjukkan bahwa permintaan I/O sedang ditangguhkan.
Model driver: KMDF
Cara menguji
Pada waktu kompilasi |
---|
Jalankan Pemverifikasi Driver Statis dan tentukan aturan DeferredRequestCompleted . Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver. |
Berlaku untuk
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlSy Secara sinkronWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue