Handling Requests to Storage Peripherals
For all requests that require the storage port driver to execute a request over an underlying bus, the class driver must set up an IRP with a SCSI request block (SRB) containing a SCSI command descriptor block (CDB). Consequently, most storage class drivers have one or more internal BuildRequest routines to build SRBs. For more information about such routines, see Storage Class Driver's BuildRequest Routine.
Storage class drivers also pass on IRP_MJ_SCSI requests to the underlying storage port driver. Such a request can originate from a Storage Filter Drivers.
For IOCTL_SCSI_PASS_THROUGH requests, described in Handling SCSI Pass-Through Requests, the class driver is responsible for setting the MinorFunction code to IRP_MJ_DEVICE_CONTROL in the port driver's I/O stack location of the IRP before passing the IRP_MJ_DEVICE_CONTROL request on to the port driver with IoCallDriver.
Every storage class driver is responsible for splitting up transfer requests (IRP_MJ_READ and/or IRP_MJ_WRITE) that exceed the underlying HBA's capabilities. Consequently, most class drivers also call an internal SplitTransferRequest routine, described in Storage Class Driver's SplitTransferRequest Routine, or implement the same functionality in their dispatch routines for read and write requests.
For additional information about handling requests to storage peripherals, see the following topics: