Creating Framework Request Objects
Framework request objects represent I/O requests that the I/O manager has sent to a driver. Framework-based drivers process each I/O request by calling framework request object methods.
Each I/O request contains a WDM I/O request packet (IRP structure), but framework-based drivers typically do not need to access the IRP structure.
Most framework request objects are created by the framework, but your driver can also create request objects.
Request Objects Created by the Framework
When a framework-based driver receives an I/O request packet (IRP) from the I/O manager, the framework intercepts the IRP and creates a framework request object. The framework places the request object into an I/O queue and, if the driver has registered request handlers for the queue, calls the appropriate handler.
The following diagram illustrates the steps that occur when the framework creates a request object for a read operation.
The following steps correspond to the numbers in the preceding diagram:
A user-mode application reads a file by calling the Microsoft Win32 ReadFile function.
The ReadFile function calls the I/O manager, which runs in kernel mode.
The I/O manager allocates an IRP structure and stores an IRP_MJ_READ function code in the structure.
The I/O manager calls the DispatchRead standard driver routine for driver x, passing a pointer to the IRP structure. Because driver x is a framework-based driver, the framework provides the driver's DispatchRead routine.
The framework creates a request object that represents the IRP structure. The framework adds the request object to one of the driver's queue objects.
The framework calls the driver's EvtIoRead request handler, passing a queue object handle and a request object handle.
Request Objects Created by a Driver
Framework-based drivers can also create request objects. For example, a driver might create request objects if it receives a read or write request for an amount of data that is larger than the driver's I/O targets can handle at one time. In such a situation, the driver can divide the data into several smaller requests and use additional request objects to send these smaller requests to one or more I/O targets.
To create a request object, your driver should call WdfRequestCreate followed by framework object methods that initialize the request, such as WdfUsbTargetPipeFormatRequestForRead.
If a driver receives WDM IRPs in a WDM dispatch routine and then services or forwards them by using the framework, the driver can call WdfRequestCreateFromIrp.