Storage Filter Driver's Support of I/O Requests
A higher-level storage filter driver (SFD) intercepts IRPs from user applications and higher-level drivers and modifies them as needed before passing them to the next-lower driver (a storage class driver or another filter driver). Such an SFD supplies device-specific support for requests that require special handling, such as translating data sent to or returned from the device in a nonstandard format, or programming the device in response to an IRP_MJ_DEVICE_CONTROL request.
A lower-level SFD monitors SRBs and/or IRPs issued by a storage class driver and modifies them as needed before passing them to the next-lower driver (a storage port driver or another filter driver).
Both higher- and lower-level SFDs can let the lower drivers process all I/O requests that require no special handling.
Like a storage class driver, an SFD has the following requirements common to all higher-level kernel-mode drivers:
It must supply a set of Dispatch routines to which the I/O manager and/or still higher-level drivers can send IRPs for appropriate I/O operations. An SFD must support the same set of IRP_MJ_XXX as the storage class driver for its type of device.
For IRP_MJ_DEVICE_CONTROL requests, it must support as many of the class driver-supported I/O control codes as its physical device can handle and, if possible, emulate support for any remaining I/O control codes in the driver.
It must have a DriverEntry routine, an AddDevice routine, an Unload routine, and Dispatch routines to handle PnP and power IRPs and can have any other standard higher-level driver routine, such as IoCompletion routines, as necessary.
It must follow the rules for processing PnP, power management, and system control IRPs.
If its device has special features, an SFD can support a set of driver-defined I/O control codes in addition to the system-required set of device-type-specific I/O control codes for IRP_MJ_DEVICE_CONTROL requests.