7.1  CD-ROM I/O Requests

Any driver that sets up device objects of type FILE_DEVICE_CD_ROM is required to handle three types of requests:

IRP_MJ_CREATE
IRP_MJ_READ
IRP_MJ_DEVICE_CONTROL

IRP_MJ_CREATE

Operation

Returns STATUS_SUCCESS, indicating that the device exists. For the caller, this request opens the device for I/O.

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_READ

Operation

Transfers data from the underlying device to system memory.

Output

Drivers of CD-ROM 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 CD-ROM 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_DEVICE_BUSY

STATUS_NO_MEDIA_IN_DEVICE

STATUS_VERIFY_REQUIRED

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 CD-ROM 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 possible 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 when the device driver completes the IRP.