If it has an AdapterControl routine, an NT device driver must provide resident storage for the following:
·Context information to be used in its DMA operations
·An AdapterObject pointer returned by HalGetAdapter
·A ULONG-type variable to hold the system-determined maximum NumberOfMapRegisters available for any given DMA transfer request
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:
·A ControllerObject pointer returned by IoCreateController
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.