Optimizations
By testing the value of the Irp->PendingReturned field, a driver can take advantage of the pending bit to optimize post-processing work for an I/O request. For example, a driver can use the processor cache efficiently, thus improving throughput, by post-processing the IRP after the IoCallDriver routine returns a synchronous response. The logic of such an optimization follows:
· In a synchronous I/O response, the thread that initiated the I/O request can perform post-processing if IoCallDriver does not return STATUS_PENDING. In this case, the IRP is complete when IoCallDriver returns, so the dispatch routine can perform any required processing.
· In an asynchronous I/O response, the IoCompletion routine should perform the post-processing if IoCallDriver returns STATUS_PENDING. The IoCompletion routine must test the value of Irp->PendingReturned, as described in “IoCompletion Routines and Asynchronous I/O Responses” earlier in this paper. If the value of Irp‑>PendingReturned is TRUE, the IoCompletion routine performs the required post-processing.
The operating system uses this exact technique for read requests, write requests, and some I/O control codes (IOCTLs). Consequently, if a driver fails to follow the guidelines in “Summary of Guidelines for Pending IRPs” earlier in this paper, the operating system will perform post-processing twice or not at all