Changed the detection of the last session from IOCTL_CDROM_READ_TOC to IOCTL_CDROM_GET_LAST_SESSION.

Fixed the calculation of the VolumeOffset.

svn path=/trunk/; revision=3512
This commit is contained in:
Hartmut Birr 2002-09-17 20:42:59 +00:00
parent fe3896a798
commit 60457afcdc

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: fsctl.c,v 1.10 2002/09/15 22:25:05 hbirr Exp $ /* $Id: fsctl.c,v 1.11 2002/09/17 20:42:59 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -185,27 +185,32 @@ CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
NTSTATUS Status; NTSTATUS Status;
ULONG Sector; ULONG Sector;
PVD_HEADER VdHeader; PVD_HEADER VdHeader;
PCDROM_TOC Toc;
ULONG Size; ULONG Size;
ULONG Offset; ULONG Offset;
ULONG i; ULONG i;
PTRACK_DATA TrackData; struct
{
UCHAR Length[2];
UCHAR FirstSession;
UCHAR LastSession;
TRACK_DATA TrackData;
}
Toc;
DPRINT("CdfsGetVolumeData\n"); DPRINT("CdfsGetVolumeData\n");
Buffer = ExAllocatePool(NonPagedPool, Buffer = ExAllocatePool(NonPagedPool,
max (CDFS_BASIC_SECTOR, CDROM_TOC_SIZE)); CDFS_BASIC_SECTOR);
if (Buffer == NULL) if (Buffer == NULL)
return(STATUS_INSUFFICIENT_RESOURCES); return(STATUS_INSUFFICIENT_RESOURCES);
Toc = (PCDROM_TOC)Buffer; Size = sizeof(Toc);
Size = sizeof(CDROM_TOC);
Status = CdfsDeviceIoControl(DeviceObject, Status = CdfsDeviceIoControl(DeviceObject,
IOCTL_CDROM_READ_TOC, IOCTL_CDROM_GET_LAST_SESSION,
NULL, NULL,
0, 0,
Toc, &Toc,
&Size); &Size);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -213,34 +218,17 @@ CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
return Status; return Status;
} }
CHECKPOINT; DPRINT("FirstSession %d, LastSession %d, FirstTrack %d\n",
if (Toc->FirstTrack == 0xaa) Toc.FirstSession, Toc.LastSession, Toc.TrackData.TrackNumber);
{
ExFreePool(Buffer);
return STATUS_UNSUCCESSFUL;
}
for (i = Toc->LastTrack; i >= Toc->FirstTrack; i--) Offset = 0;
for (i = 0; i < 4; i++)
{ {
TrackData = &Toc->TrackData[i - 1]; Offset = (Offset << 8) + Toc.TrackData.Address[i];
if (TrackData->Control & 0x4)
{
/* we have found the last data session */
CHECKPOINT;
break;
}
} }
CdInfo->VolumeOffset = Offset;
if (i < Toc->FirstTrack) DPRINT("Offset of first track in last session %d\n", Offset);
{
/* there is no data session on the cd */
CHECKPOINT;
ExFreePool(Buffer);
return STATUS_UNSUCCESSFUL;
}
Offset = msf_to_lba(TrackData->Address[1], TrackData->Address[2], TrackData->Address[3]);
CdInfo->VolumeOffset = Offset * BLOCKSIZE;
CdInfo->JolietLevel = 0; CdInfo->JolietLevel = 0;
VdHeader = (PVD_HEADER)Buffer; VdHeader = (PVD_HEADER)Buffer;