update for HEAD-2003021201
[reactos.git] / drivers / storage / cdrom / cdrom.c
index 08440ca..886bd42 100644 (file)
@@ -275,7 +275,6 @@ CdromClassFindDevices(IN PDRIVER_OBJECT DriverObject,
   DPRINT("CdromClassFindDevices() done\n");
 
   return(FoundDevice);
-//  return(TRUE);
 }
 
 
@@ -462,6 +461,10 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
       return(STATUS_INSUFFICIENT_RESOURCES);
     }
 
+  /* Initialize lookaside list for SRBs */
+  ScsiClassInitializeSrbLookasideList(DiskDeviceExtension,
+                                     4);
+
   /* Get disk geometry */
   DiskDeviceExtension->DiskGeometry = ExAllocatePool(NonPagedPool,
                                                     sizeof(DISK_GEOMETRY));
@@ -469,6 +472,8 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
     {
       DPRINT1("Failed to allocate geometry buffer!\n");
 
+      ExDeleteNPagedLookasideList(&DiskDeviceExtension->SrbLookasideListHead);
+
       IoDeleteDevice(DiskDeviceObject);
 
       /* Release (unclaim) the disk */
@@ -511,6 +516,7 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
   return(STATUS_SUCCESS);
 }
 
+
 /**********************************************************************
  * NAME
  *     CdromClassReadTocEntry
@@ -543,14 +549,15 @@ CdromClassReadTocEntry(PDEVICE_OBJECT DeviceObject, UINT TrackNo, PVOID Buffer,
   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)
 {
@@ -569,14 +576,15 @@ CdromClassReadLastSession(PDEVICE_OBJECT DeviceObject, UINT TrackNo, PVOID Buffe
   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
@@ -649,62 +657,73 @@ CdromClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
              }
          }
        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));