SCSI Port I/O Control Codes
All storage class drivers are required to set the minor function code with IRP_MJ_DEVICE_CONTROL in the port driver's I/O stack location of any IRP that a class driver allocates and sets up to send on to the system port driver. For example, a legacy class driver must set this minor function code when it makes an IOCTL_SCSI_GET_ADDRESS request to obtain the address of a target device.
For incoming IRPs originating with a user I/O request or with a higher-level driver, storage class drivers should ignore the minor function code in the port driver's I/O stack location, leaving it as is. In general, such requests can be sent directly to the system-supplied port driver only if no storage class driver for the target device exists. Otherwise, such requests must be directed to the storage class driver for the appropriate type of underlying storage device.
This section contains I/O control requests that a storage port driver supports. All public I/O control codes for the port driver use buffered I/O. Consequently, most input or output data for these requests is at Irp->AssociatedIrp.SystemBuffer.