If it has an AdapterControl routine, an NT device driver must provide resident storage for the following:
The driver can provide the necessary storage in a device extension, in a controller extension, or in nonpaged pool allocated by the driver.
If it has a ControllerControl routine, an NT device driver must provide resident storage for the following:
Any NT device driver can provide the necessary storage in a device extension or in nonpaged pool allocated by the driver. Usually, NT drivers that use controller objects store the ControllerObject pointer in the device extension of each device object that represents a physical or logical device controlled by the hardware represented by the controller object.
The driver writer determines the size and internal structure of the ControllerObject->ControllerExtension.
A controller object, which cannot be given a name, cannot be the target of an I/O request. The hardware it represents usually controls a set of homogeneous devices that are the actual targets of I/O requests.