DPRINT("CdromClassFindDevices() done\n");
return(FoundDevice);
-// return(TRUE);
}
return(STATUS_INSUFFICIENT_RESOURCES);
}
+ /* Initialize lookaside list for SRBs */
+ ScsiClassInitializeSrbLookasideList(DiskDeviceExtension,
+ 4);
+
/* Get disk geometry */
DiskDeviceExtension->DiskGeometry = ExAllocatePool(NonPagedPool,
sizeof(DISK_GEOMETRY));
{
DPRINT1("Failed to allocate geometry buffer!\n");
+ ExDeleteNPagedLookasideList(&DiskDeviceExtension->SrbLookasideListHead);
+
IoDeleteDevice(DiskDeviceObject);
/* Release (unclaim) the disk */
return(STATUS_SUCCESS);
}
+
/**********************************************************************
* NAME
* CdromClassReadTocEntry
Cdb->READ_TOC.AllocationLength[0] = Length >> 8;
Cdb->READ_TOC.AllocationLength[1] = Length & 0xff;
Cdb->READ_TOC.Msf = 1;
-
- return ScsiClassSendSrbSynchronous(DeviceObject,
+
+ return(ScsiClassSendSrbSynchronous(DeviceObject,
&Srb,
Buffer,
Length,
- FALSE);
+ FALSE));
}
+
static NTSTATUS
CdromClassReadLastSession(PDEVICE_OBJECT DeviceObject, UINT TrackNo, PVOID Buffer, UINT Length)
{
Cdb->READ_TOC.AllocationLength[0] = Length >> 8;
Cdb->READ_TOC.AllocationLength[1] = Length & 0xff;
Cdb->READ_TOC.Msf = 0;
-
- return ScsiClassSendSrbSynchronous(DeviceObject,
+
+ return(ScsiClassSendSrbSynchronous(DeviceObject,
&Srb,
Buffer,
Length,
- FALSE);
+ FALSE));
}
+
/**********************************************************************
* NAME EXPORTED
* CdromClassDeviceControl
}
}
break;
+
case IOCTL_CDROM_READ_TOC:
- DPRINT("IOCTL_CDROM_READ_TOC\n");
- if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(CDROM_TOC))
+ DPRINT("IOCTL_CDROM_READ_TOC\n");
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(CDROM_TOC))
{
- Status = STATUS_INFO_LENGTH_MISMATCH;
+ Status = STATUS_INFO_LENGTH_MISMATCH;
}
- else
+ else
{
- PCDROM_TOC TocBuffer;
- USHORT Length;
-
- TocBuffer = Irp->AssociatedIrp.SystemBuffer;
+ PCDROM_TOC TocBuffer;
+ USHORT Length;
- /* First read the lead out */
- Length = 4 + sizeof(TRACK_DATA);
- Status = CdromClassReadTocEntry(DeviceObject, 0xaa, TocBuffer, Length);
+ TocBuffer = Irp->AssociatedIrp.SystemBuffer;
- if (NT_SUCCESS(Status))
+ /* First read the lead out */
+ Length = 4 + sizeof(TRACK_DATA);
+ Status = CdromClassReadTocEntry(DeviceObject,
+ 0xAA,
+ TocBuffer,
+ Length);
+ if (NT_SUCCESS(Status))
{
- if (TocBuffer->FirstTrack == 0xaa)
- {
+ if (TocBuffer->FirstTrack == 0xaa)
+ {
/* there is an empty cd */
- Information = Length;
- }
- else
- {
+ Information = Length;
+ }
+ else
+ {
/* read the toc */
Length = 4 + sizeof(TRACK_DATA) * (TocBuffer->LastTrack - TocBuffer->FirstTrack + 2);
- Status = CdromClassReadTocEntry(DeviceObject, TocBuffer->FirstTrack, TocBuffer, Length);
- if (NT_SUCCESS(Status))
- {
- Information = Length;
- }
- }
+ Status = CdromClassReadTocEntry(DeviceObject,
+ TocBuffer->FirstTrack,
+ TocBuffer, Length);
+ if (NT_SUCCESS(Status))
+ {
+ Information = Length;
+ }
+ }
}
}
- break;
+ break;
+
case IOCTL_CDROM_GET_LAST_SESSION:
- DPRINT("IOCTL_CDROM_GET_LAST_SESSION\n");
- if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < 4 + sizeof(TRACK_DATA))
+ DPRINT("IOCTL_CDROM_GET_LAST_SESSION\n");
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < 4 + sizeof(TRACK_DATA))
{
- Status = STATUS_INFO_LENGTH_MISMATCH;
+ Status = STATUS_INFO_LENGTH_MISMATCH;
}
- else
+ else
{
- USHORT Length;
- PCDROM_TOC TocBuffer = Irp->AssociatedIrp.SystemBuffer;
-
- Length = 4 + sizeof(TRACK_DATA);
- Status = CdromClassReadLastSession(DeviceObject, 0, TocBuffer, Length);
- if (NT_SUCCESS(Status))
+ PCDROM_TOC TocBuffer;
+ USHORT Length;
+
+ TocBuffer = Irp->AssociatedIrp.SystemBuffer;
+ Length = 4 + sizeof(TRACK_DATA);
+ Status = CdromClassReadLastSession(DeviceObject,
+ 0,
+ TocBuffer,
+ Length);
+ if (NT_SUCCESS(Status))
{
- Information = Length;
+ Information = Length;
}
}
- break;
+ break;
+
default:
/* Call the common device control function */
return(ScsiClassDeviceControl(DeviceObject, Irp));