Any driver that sets up device objects of type FILE_DEVICE_TAPE is required to handle at least four types of requests.
IRP_MJ_CREATE
Operation
Returns STATUS_SUCCESS, indicating the existence of the device.
When Called
A higher-level driver is attempting to connect one of its device objects to the target device object, or a user-mode process has attempted to open a file stored on the physical device, thereby causing a file system to carry out a mount operation.
I/O Status Block
Returns STATUS_SUCCESS in the Status field and zero in the Information field.
IRP_MJ_SHUTDOWN
Operation
Transfers data cached in the device or in the driver’s internal buffer(s) into system memory or out to the device before the system is shut down. If the device or driver supports caching or buffering data, the driver must handle this request.
When Called
The user has decided to shut down the system.
I/O Status Block
The Status field is set to STATUS_SUCCESS when the transfer is complete.
IRP_MJ_READ
Operation
Transfers data from the underlying device to system memory.
Output
Drivers of tape devices generally use direct I/O, so the lowest-level driver transfers data using DMA or PIO into the buffer described by the MDL at Irp->MdlAddress.
When Called
A Win32® application with a handle for the opened file object that represents the tape device has requested a data transfer.
I/O Status Block
The Information field is set to the number of bytes transferred, whatever the Status field’s value. In addition to STATUS_SUCCESS, possible values are any of the following:
STATUS_INSUFFICIENT_RESOURCES
STATUS_DEVICE_DATA_ERROR
STATUS_INVALID_DEVICE_REQUEST
STATUS_NO_SUCH_DEVICE
STATUS_IO_TIMEOUT
STATUS_IO_DEVICE_ERROR
STATUS_DEVICE_NOT_READY
STATUS_NO_MEDIA_IN_DEVICE
STATUS_VERIFY_REQUIRED
IRP_MJ_WRITE
Operation
Transfers data from system memory to the underlying device.
Output
Drivers of tape devices generally use direct I/O, so the lowest-level driver transfers data using DMA or PIO into the buffer described by the MDL at Irp->MdlAddress.
When Called
A Win32 application with a handle for the opened file object that represents the tape device has requested a data transfer.
I/O Status Block
The Information field is set to the number of bytes transferred, whatever the Status field’s value. Possible values are any of those returned for read requests and STATUS_MEDIA_WRITE_PROTECTED.
IRP_MJ_DEVICE_CONTROL
Operation
Determined by the I/O control code set at Parameters.DeviceIoControl.IoControlCode in the driver’s I/O stack location of the IRP.
When Called
A Win32 application with a handle for the opened file object that represents the tape device has called DeviceIoControl, or a higher-level driver has set up the request.
I/O Status Block
Also determined by the operation, either STATUS_SUCCESS or an appropriate STATUS_XXX value. For most operations, the set of STATUS_XXX values includes those propagated from a call to a support routine or lower-level driver and/or those chosen by the driver designer. In general, the Information field of the I/O status block is set to the number of bytes returned or transferred.