1.2.2 Driver-Allocated IRPs

IoBuildAsynchronousFsdRequest
Allocates and sets up an IRP specifying a major function code (IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_SHUTDOWN, or IRP_MJ_FLUSH_BUFFERS) with a pointer to the lower driver’s device object on which the I/O should occur, a pointer to a buffer which will contain the data to be read or which contains the data to be written, the length of the buffer in bytes, a pointer to the starting offset on the media, and a pointer to the I/O status block where the called driver can return status information and the caller’s IoCompletion routine can access it. Returns a pointer to the IRP so the caller can set any necessary minor function code and set up its IoCompletion routine before sending the IRP to the target driver.
IoBuildSynchronousFsdRequest 
Allocates and sets up an IRP specifying a major function code (IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_SHUTDOWN, or IRP_MJ_FLUSH_BUFFERS) with a pointer to the lower driver’s device object on which the I/O should occur, a pointer to a buffer which will contain the data to be read or which contains the data to be written, the length of the buffer in bytes, a pointer to the starting offset on the media, a pointer to an event object to be set to the Signaled state when the requested operation completes, and a pointer to the I/O status block where the called driver can return status information and the caller’s IoCompletion routine can access it. Returns a pointer to the IRP so the caller can set any necessary minor function code and set up its IoCompletion routine before sending the IRP to the target driver.
IoBuildDeviceIoControlRequest
Allocates and sets up an IRP specifying a major function code (either IRP_MJ_INTERNAL_DEVICE_CONTROL or IRP_MJ_DEVICE_CONTROL) with an optional input or output buffer, a pointer to the lower driver’s device object, an event to be set to the Signaled state when the requested operation completes, and an I/O status block to be set by the to-be-called driver. Returns a pointer the the IRP so the caller can set the appropriate IOCTL_XXX before sending the IRP to the next-lower-level driver.
IoSizeOfIrp 
Returns the size in bytes required for an IRP with a given count of I/O stack locations.
IoAllocateIrp 
Allocates an IRP, given the number of I/O stack locations (optionally, for the caller, but at least one for each driver layered under the caller) and whether to charge quota against the caller. Returns a pointer to an IRP in nonpaged system space if successful; otherwise, returns NULL.
IoInitializeIrp 
Initializes an IRP, given a pointer to an already allocated IRP, its length in bytes, and the number of I/O stack locations it has.
IoSetNextIrpStackLocation 
Sets the current IRP stack location to the caller’s in an IRP, which must have been allocated by a preceding call to IoAllocateIrp that specified a stack-size argument large enough to give the caller its own stack location.
IoAllocateMdl 
Allocates a MDL large enough to map the starting address and length supplied by the caller; optionally associates the MDL with a given IRP.
IoBuildPartialMdl 
Builds an MDL for the specified starting virtual address and length in bytes from a given source MDL. Drivers that split large transfer requests into a number of smaller transfers can call this routine.
IoFreeMdl 
Releases a given MDL allocated by the caller.
IoMakeAssociatedIrp 
Allocates and initializes an IRP to be associated with a master IRP sent to the highest-level driver, allowing the driver to “split” the original request and send associated IRPs on to lower-level drivers or to the device.
IoSetCompletionRoutine 
Registers a driver-supplied IoCompletion routine with a given IRP, so the IoCompletion routine is called when lower-level drivers have completed the request, so the caller can release the IRP it allocated with IoAllocateIrp or IoBuildAsynchronousFsdRequest and any other resources it allocated to set up an IRP for lower drivers and/or perform any I/O completion processing necessary.
IoCallDriver 
Sends an IRP to a lower-level driver.
IoFreeIrp 
Releases an IRP that was allocated by the caller.