Implemented verify override for device access routines and started experimental media change support.

svn path=/trunk/; revision=6590
This commit is contained in:
Eric Kohl 2003-11-09 11:20:28 +00:00
parent 0327d87e6e
commit 2433129700
5 changed files with 192 additions and 189 deletions

View file

@ -221,21 +221,17 @@ typedef struct
extern PCDFS_GLOBAL_DATA CdfsGlobalData; extern PCDFS_GLOBAL_DATA CdfsGlobalData;
NTSTATUS
CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskSector,
IN ULONG SectorCount,
IN OUT PUCHAR Buffer);
int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 ); int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max ); void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
/* cleanup.c */ /* cleanup.c */
NTSTATUS STDCALL NTSTATUS STDCALL
CdfsCleanup(PDEVICE_OBJECT DeviceObject, CdfsCleanup(PDEVICE_OBJECT DeviceObject,
PIRP Irp); PIRP Irp);
/* close.c */ /* close.c */
NTSTATUS STDCALL NTSTATUS STDCALL
@ -246,27 +242,25 @@ NTSTATUS
CdfsCloseFile(PDEVICE_EXTENSION DeviceExt, CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
PFILE_OBJECT FileObject); PFILE_OBJECT FileObject);
/* common.c */ /* common.c */
NTSTATUS NTSTATUS
CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject, CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskSector, IN ULONG DiskSector,
IN ULONG SectorCount, IN ULONG SectorCount,
IN OUT PUCHAR Buffer); IN OUT PUCHAR Buffer,
IN BOOLEAN Override);
NTSTATUS
CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskSector,
IN ULONG SectorCount,
IN OUT PUCHAR Buffer);
NTSTATUS NTSTATUS
CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
IN ULONG CtlCode, IN ULONG CtlCode,
IN PVOID InputBuffer, IN PVOID InputBuffer,
IN ULONG InputBufferSize, IN ULONG InputBufferSize,
IN OUT PVOID OutputBuffer, IN OUT PVOID OutputBuffer,
IN OUT PULONG pOutputBufferSize); IN OUT PULONG pOutputBufferSize,
IN BOOLEAN Override);
/* create.c */ /* create.c */
@ -349,12 +343,18 @@ NTSTATUS STDCALL
CdfsSetInformation(PDEVICE_OBJECT DeviceObject, CdfsSetInformation(PDEVICE_OBJECT DeviceObject,
PIRP Irp); PIRP Irp);
/* fsctl.c */ /* fsctl.c */
NTSTATUS
CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
PCDINFO CdInfo);
NTSTATUS STDCALL NTSTATUS STDCALL
CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject, CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
PIRP Irp); PIRP Irp);
/* misc.c */ /* misc.c */
BOOLEAN BOOLEAN
@ -373,6 +373,7 @@ VOID
CdfsFileFlagsToAttributes(PFCB Fcb, CdfsFileFlagsToAttributes(PFCB Fcb,
PULONG FileAttributes); PULONG FileAttributes);
/* rw.c */ /* rw.c */
NTSTATUS STDCALL NTSTATUS STDCALL

View file

@ -1,6 +1,6 @@
/* /*
* ReactOS kernel * ReactOS kernel
* Copyright (C) 2002 ReactOS Team * Copyright (C) 2002, 2003 ReactOS Team
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,13 +16,14 @@
* 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: common.c,v 1.5 2002/09/15 22:25:05 hbirr Exp $ /* $Id: common.c,v 1.6 2003/11/09 11:20:28 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/fs/vfat/volume.c * FILE: drivers/fs/cdfs/common.c
* PURPOSE: CDROM (ISO 9660) filesystem driver * PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER: Art Yerkes * PROGRAMMER: Art Yerkes
* Eric Kohl
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -41,8 +42,10 @@ NTSTATUS
CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject, CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskSector, IN ULONG DiskSector,
IN ULONG SectorCount, IN ULONG SectorCount,
IN OUT PUCHAR Buffer) IN OUT PUCHAR Buffer,
IN BOOLEAN Override)
{ {
PIO_STACK_LOCATION Stack;
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
LARGE_INTEGER Offset; LARGE_INTEGER Offset;
ULONG BlockSize; ULONG BlockSize;
@ -79,6 +82,12 @@ CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
return(STATUS_INSUFFICIENT_RESOURCES); return(STATUS_INSUFFICIENT_RESOURCES);
} }
if (Override)
{
Stack = IoGetNextIrpStackLocation(Irp);
Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
}
DPRINT("Calling IO Driver... with irp %x\n", Irp); DPRINT("Calling IO Driver... with irp %x\n", Irp);
Status = IoCallDriver(DeviceObject, Irp); Status = IoCallDriver(DeviceObject, Irp);
@ -119,90 +128,20 @@ CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
} }
NTSTATUS
CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskSector,
IN ULONG SectorCount,
IN OUT PUCHAR Buffer)
{
PIO_STACK_LOCATION Stack;
IO_STATUS_BLOCK IoStatus;
LARGE_INTEGER Offset;
ULONG BlockSize;
KEVENT Event;
PIRP Irp;
NTSTATUS Status;
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Offset.u.LowPart = DiskSector << 11;
Offset.u.HighPart = DiskSector >> 21;
BlockSize = BLOCKSIZE * SectorCount;
DPRINT("CdfsReadSectors(DeviceObject %x, DiskSector %d, Buffer %x)\n",
DeviceObject, DiskSector, Buffer);
DPRINT("Offset %I64x BlockSize %ld\n",
Offset.QuadPart,
BlockSize);
DPRINT("Building synchronous FSD Request...\n");
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
DeviceObject,
Buffer,
BlockSize,
&Offset,
&Event,
&IoStatus);
if (Irp == NULL)
{
DPRINT("IoBuildSynchronousFsdRequest failed\n");
return(STATUS_INSUFFICIENT_RESOURCES);
}
// Stack = IoGetCurrentIrpStackLocation(Irp);
// Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
DPRINT("Calling IO Driver... with irp %x\n", Irp);
Status = IoCallDriver(DeviceObject, Irp);
DPRINT("Waiting for IO Operation for %x\n", Irp);
if (Status == STATUS_PENDING)
{
DPRINT("Operation pending\n");
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
DPRINT("Getting IO Status... for %x\n", Irp);
Status = IoStatus.Status;
}
if (!NT_SUCCESS(Status))
{
DPRINT("CdfsReadSectors() failed (Status %x)\n", Status);
DPRINT("(DeviceObject %x, DiskSector %x, Buffer %x, Offset 0x%I64x)\n",
DeviceObject, DiskSector, Buffer,
Offset.QuadPart);
return(Status);
}
DPRINT("Block request succeeded for %x\n", Irp);
return(STATUS_SUCCESS);
}
NTSTATUS NTSTATUS
CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
IN ULONG CtlCode, IN ULONG CtlCode,
IN PVOID InputBuffer, IN PVOID InputBuffer,
IN ULONG InputBufferSize, IN ULONG InputBufferSize,
IN OUT PVOID OutputBuffer, IN OUT PVOID OutputBuffer,
IN OUT PULONG pOutputBufferSize) IN OUT PULONG pOutputBufferSize,
IN BOOLEAN Override)
{ {
PIO_STACK_LOCATION Stack;
IO_STATUS_BLOCK IoStatus;
ULONG OutputBufferSize = 0; ULONG OutputBufferSize = 0;
KEVENT Event; KEVENT Event;
PIRP Irp; PIRP Irp;
IO_STATUS_BLOCK IoStatus;
NTSTATUS Status; NTSTATUS Status;
DPRINT("CdfsDeviceIoControl(DeviceObject %x, CtlCode %x, " DPRINT("CdfsDeviceIoControl(DeviceObject %x, CtlCode %x, "
@ -212,45 +151,54 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
pOutputBufferSize ? *pOutputBufferSize : 0); pOutputBufferSize ? *pOutputBufferSize : 0);
if (pOutputBufferSize) if (pOutputBufferSize)
{ {
OutputBufferSize = *pOutputBufferSize; OutputBufferSize = *pOutputBufferSize;
} }
KeInitializeEvent (&Event, NotificationEvent, FALSE); KeInitializeEvent (&Event, NotificationEvent, FALSE);
DPRINT("Building device I/O control request ...\n"); DPRINT("Building device I/O control request ...\n");
Irp = IoBuildDeviceIoControlRequest(CtlCode, Irp = IoBuildDeviceIoControlRequest(CtlCode,
DeviceObject, DeviceObject,
InputBuffer, InputBuffer,
InputBufferSize, InputBufferSize,
OutputBuffer, OutputBuffer,
OutputBufferSize, OutputBufferSize,
FALSE, FALSE,
&Event, &Event,
&IoStatus); &IoStatus);
if (Irp == NULL) if (Irp == NULL)
{ {
DPRINT("IoBuildDeviceIoControlRequest failed\n"); DPRINT("IoBuildDeviceIoControlRequest failed\n");
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
if (Override)
{
Stack = IoGetNextIrpStackLocation(Irp);
Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
}
DPRINT ("Calling IO Driver... with irp %x\n", Irp); DPRINT ("Calling IO Driver... with irp %x\n", Irp);
Status = IoCallDriver(DeviceObject, Irp); Status = IoCallDriver(DeviceObject, Irp);
DPRINT ("Waiting for IO Operation for %x\n", Irp); DPRINT ("Waiting for IO Operation for %x\n", Irp);
if (Status == STATUS_PENDING) if (Status == STATUS_PENDING)
{ {
DPRINT ("Operation pending\n"); DPRINT ("Operation pending\n");
KeWaitForSingleObject (&Event, Suspended, KernelMode, FALSE, NULL); KeWaitForSingleObject (&Event, Suspended, KernelMode, FALSE, NULL);
DPRINT ("Getting IO Status... for %x\n", Irp); DPRINT ("Getting IO Status... for %x\n", Irp);
Status = IoStatus.Status; Status = IoStatus.Status;
} }
if (OutputBufferSize)
{ if (pOutputBufferSize)
{
*pOutputBufferSize = OutputBufferSize; *pOutputBufferSize = OutputBufferSize;
} }
DPRINT("Returning Status %x\n", Status); DPRINT("Returning Status %x\n", Status);
return Status; return Status;
} }

View file

@ -1,6 +1,6 @@
/* /*
* ReactOS kernel * ReactOS kernel
* Copyright (C) 2002 ReactOS Team * Copyright (C) 2002, 2003 ReactOS Team
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,14 +16,14 @@
* 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: create.c,v 1.8 2003/02/13 22:24:15 hbirr Exp $ /* $Id: create.c,v 1.9 2003/11/09 11:20:28 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/fs/cdfs/cdfs.c * FILE: services/fs/cdfs/cdfs.c
* PURPOSE: CDROM (ISO 9660) filesystem driver * PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER: Art Yerkes * PROGRAMMER: Art Yerkes
* UPDATE HISTORY: * Eric Kohl
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -35,6 +35,8 @@
#include "cdfs.h" #include "cdfs.h"
//#define MEDIA_CHANGE_SUPPORT
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
@ -89,6 +91,10 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
PFCB Fcb; PFCB Fcb;
NTSTATUS Status; NTSTATUS Status;
PWSTR AbsFileName = NULL; PWSTR AbsFileName = NULL;
#ifdef MEDIA_CHANGE_SUPPORT
ULONG MediaChangeCount = 0;
ULONG BufferSize;
#endif
DPRINT("CdfsOpenFile(%08lx, %08lx, %S)\n", DeviceExt, FileObject, FileName); DPRINT("CdfsOpenFile(%08lx, %08lx, %S)\n", DeviceExt, FileObject, FileName);
@ -107,6 +113,50 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
return(STATUS_UNSUCCESSFUL); return(STATUS_UNSUCCESSFUL);
} }
#ifdef MEDIA_CHANGE_SUPPORT
BufferSize = sizeof(ULONG);
Status = CdfsDeviceIoControl (DeviceExt->StorageDevice,
IOCTL_CDROM_CHECK_VERIFY,
NULL,
0,
(PVOID)&MediaChangeCount,
&BufferSize,
TRUE);
DPRINT ("Status %lx\n", Status);
if (Status == STATUS_VERIFY_REQUIRED)
{
CDINFO CdInfo;
DPRINT1 ("Media change detected!\n");
Status = CdfsGetVolumeData (DeviceExt->StorageDevice,
&CdInfo);
if (!NT_SUCCESS(Status))
{
DPRINT1 ("CdfsGetVolumeData() failed (Status %lx)\n", Status);
return Status;
}
/* FIXME: Comparing the serial numbers is not enough */
if (DeviceExt->CdInfo.SerialNumber == CdInfo.SerialNumber)
{
DPRINT1 ("Same CD\n");
}
else
{
DPRINT1 ("Different CD\n");
}
}
else if (!NT_SUCCESS(Status))
{
DPRINT1 ("Status %lx\n", Status);
return Status;
}
else
{
DPRINT ("MediaChangeCount %lu\n", MediaChangeCount);
}
#endif
//FIXME: Get cannonical path name (remove .'s, ..'s and extra separators) //FIXME: Get cannonical path name (remove .'s, ..'s and extra separators)
DPRINT("PathName to open: %S\n", FileName); DPRINT("PathName to open: %S\n", FileName);

View file

@ -1,6 +1,6 @@
/* /*
* ReactOS kernel * ReactOS kernel
* Copyright (C) 2002 ReactOS Team * Copyright (C) 2002, 2003 ReactOS Team
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,14 +16,14 @@
* 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.14 2003/06/07 11:34:35 chorns Exp $ /* $Id: fsctl.c,v 1.15 2003/11/09 11:20:28 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/fs/cdfs/fsctl.c * FILE: drivers/fs/cdfs/fsctl.c
* PURPOSE: CDROM (ISO 9660) filesystem driver * PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER: Art Yerkes * PROGRAMMER: Art Yerkes
* UPDATE HISTORY: * Eric Kohl
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -36,6 +36,7 @@
#include "cdfs.h" #include "cdfs.h"
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
static inline static inline
@ -44,8 +45,9 @@ int msf_to_lba (BYTE m, BYTE s, BYTE f)
return (((m * 60) + s) * 75 + f) - 150; return (((m * 60) + s) * 75 + f) - 150;
} }
static VOID static VOID
CdfsGetPVDData(PUCHAR Buffer, CdfsGetPVDData(PUCHAR Buffer,
PCDINFO CdInfo) PCDINFO CdInfo)
{ {
PPVD Pvd; PPVD Pvd;
@ -177,7 +179,7 @@ CdfsGetSVDData(PUCHAR Buffer,
} }
static NTSTATUS NTSTATUS
CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject, CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
PCDINFO CdInfo) PCDINFO CdInfo)
{ {
@ -198,103 +200,104 @@ CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
Toc; Toc;
DPRINT("CdfsGetVolumeData\n"); DPRINT("CdfsGetVolumeData\n");
Buffer = ExAllocatePool(NonPagedPool, Buffer = ExAllocatePool(NonPagedPool,
CDFS_BASIC_SECTOR); CDFS_BASIC_SECTOR);
if (Buffer == NULL) if (Buffer == NULL)
return(STATUS_INSUFFICIENT_RESOURCES); return STATUS_INSUFFICIENT_RESOURCES;
Size = sizeof(Toc); Size = sizeof(Toc);
Status = CdfsDeviceIoControl(DeviceObject, Status = CdfsDeviceIoControl(DeviceObject,
IOCTL_CDROM_GET_LAST_SESSION, IOCTL_CDROM_GET_LAST_SESSION,
NULL, NULL,
0, 0,
&Toc, &Toc,
&Size); &Size,
TRUE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ExFreePool(Buffer); ExFreePool(Buffer);
return Status; return Status;
} }
DPRINT("FirstSession %d, LastSession %d, FirstTrack %d\n", DPRINT("FirstSession %d, LastSession %d, FirstTrack %d\n",
Toc.FirstSession, Toc.LastSession, Toc.TrackData.TrackNumber); Toc.FirstSession, Toc.LastSession, Toc.TrackData.TrackNumber);
Offset = 0; Offset = 0;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
Offset = (Offset << 8) + Toc.TrackData.Address[i]; Offset = (Offset << 8) + Toc.TrackData.Address[i];
} }
CdInfo->VolumeOffset = Offset; CdInfo->VolumeOffset = Offset;
DPRINT("Offset of first track in last session %d\n", Offset); DPRINT("Offset of first track in last session %d\n", Offset);
CdInfo->JolietLevel = 0; CdInfo->JolietLevel = 0;
VdHeader = (PVD_HEADER)Buffer; VdHeader = (PVD_HEADER)Buffer;
Buffer[0] = 0; Buffer[0] = 0;
for (Sector = CDFS_PRIMARY_DESCRIPTOR_LOCATION; Sector < 100 && Buffer[0] != 255; Sector++) for (Sector = CDFS_PRIMARY_DESCRIPTOR_LOCATION; Sector < 100 && Buffer[0] != 255; Sector++)
{ {
/* Read the Primary Volume Descriptor (PVD) */ /* Read the Primary Volume Descriptor (PVD) */
Status = CdfsReadRawSectors(DeviceObject, Status = CdfsReadSectors (DeviceObject,
Sector + Offset, Sector + Offset,
1, 1,
Buffer); Buffer,
if (!NT_SUCCESS(Status)) TRUE);
if (!NT_SUCCESS(Status))
{ {
ExFreePool(Buffer); ExFreePool(Buffer);
return(Status); return Status;
} }
if (Sector == CDFS_PRIMARY_DESCRIPTOR_LOCATION) if (Sector == CDFS_PRIMARY_DESCRIPTOR_LOCATION)
{ {
DPRINT("CD-identifier: [%.5s]\n", Buffer + 1); DPRINT("CD-identifier: [%.5s]\n", Buffer + 1);
if (Buffer[0] != 1 || Buffer[1] != 'C' || Buffer[2] != 'D' || if (Buffer[0] != 1 || Buffer[1] != 'C' || Buffer[2] != 'D' ||
Buffer[3] != '0' || Buffer[4] != '0' || Buffer[5] != '1') Buffer[3] != '0' || Buffer[4] != '0' || Buffer[5] != '1')
{ {
ExFreePool(Buffer); ExFreePool(Buffer);
return STATUS_UNRECOGNIZED_VOLUME; return STATUS_UNRECOGNIZED_VOLUME;
} }
} }
switch (VdHeader->VdType) switch (VdHeader->VdType)
{ {
case 0: case 0:
DPRINT("BootVolumeDescriptor found!\n"); DPRINT("BootVolumeDescriptor found!\n");
break; break;
case 1: case 1:
DPRINT("PrimaryVolumeDescriptor found!\n"); DPRINT("PrimaryVolumeDescriptor found!\n");
CdfsGetPVDData(Buffer, CdInfo); CdfsGetPVDData(Buffer, CdInfo);
break; break;
case 2: case 2:
DPRINT("SupplementaryVolumeDescriptor found!\n"); DPRINT("SupplementaryVolumeDescriptor found!\n");
CdfsGetSVDData(Buffer, CdInfo); CdfsGetSVDData(Buffer, CdInfo);
break; break;
case 3: case 3:
DPRINT("VolumePartitionDescriptor found!\n"); DPRINT("VolumePartitionDescriptor found!\n");
break; break;
case 255: case 255:
DPRINT("VolumeDescriptorSetTerminator found!\n"); DPRINT("VolumeDescriptorSetTerminator found!\n");
break; break;
default: default:
DPRINT1("Unknown volume descriptor type %u found!\n", VdHeader->VdType); DPRINT1("Unknown volume descriptor type %u found!\n", VdHeader->VdType);
break; break;
} }
}
}
ExFreePool(Buffer); ExFreePool(Buffer);
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
static NTSTATUS static NTSTATUS
CdfsMountVolume(PDEVICE_OBJECT DeviceObject, CdfsMountVolume(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
@ -347,7 +350,7 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject,
Vpb->VolumeLabelLength = CdInfo.VolumeLabelLength; Vpb->VolumeLabelLength = CdInfo.VolumeLabelLength;
RtlCopyMemory(Vpb->VolumeLabel, CdInfo.VolumeLabel, CdInfo.VolumeLabelLength * sizeof(WCHAR)); RtlCopyMemory(Vpb->VolumeLabel, CdInfo.VolumeLabel, CdInfo.VolumeLabelLength * sizeof(WCHAR));
RtlCopyMemory(&DeviceExt->CdInfo, &CdInfo, sizeof(CDINFO)); RtlCopyMemory(&DeviceExt->CdInfo, &CdInfo, sizeof(CDINFO));
NewDeviceObject->Vpb = DeviceToMount->Vpb; NewDeviceObject->Vpb = DeviceToMount->Vpb;
DeviceExt->StorageDevice = DeviceToMount; DeviceExt->StorageDevice = DeviceToMount;
@ -461,13 +464,13 @@ CdfsVerifyVolume(PDEVICE_OBJECT DeviceObject,
Status = CdfsGetVolumeData(DeviceToVerify, &CdInfo); Status = CdfsGetVolumeData(DeviceToVerify, &CdInfo);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
DPRINT("Current serial number %08lx Vpb serial number %08lx\n", DPRINT("Current serial number %08lx Vpb serial number %08lx\n",
CdInfo.SerialNumber, DeviceToVerify->Vpb->SerialNumber); CdInfo.SerialNumber, DeviceToVerify->Vpb->SerialNumber);
if (CdInfo.SerialNumber != DeviceToVerify->Vpb->SerialNumber) if (CdInfo.SerialNumber != DeviceToVerify->Vpb->SerialNumber)
Status = STATUS_WRONG_VOLUME; Status = STATUS_WRONG_VOLUME;
} }
return(Status); return(Status);
} }

View file

@ -1,6 +1,6 @@
/* /*
* ReactOS kernel * ReactOS kernel
* Copyright (C) 2002 ReactOS Team * Copyright (C) 2002, 2003 ReactOS Team
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,14 +16,14 @@
* 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: rw.c,v 1.10 2003/02/13 22:24:15 hbirr Exp $ /* $Id: rw.c,v 1.11 2003/11/09 11:20:28 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/fs/cdfs/rw.c * FILE: drivers/fs/cdfs/rw.c
* PURPOSE: CDROM (ISO 9660) filesystem driver * PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER: Art Yerkes * PROGRAMMER: Art Yerkes
* UPDATE HISTORY: * Eric Kohl
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -112,7 +112,8 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt,
Status = CdfsReadSectors(DeviceExt->StorageDevice, Status = CdfsReadSectors(DeviceExt->StorageDevice,
Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE), Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
Length / BLOCKSIZE, Length / BLOCKSIZE,
Buffer); Buffer,
FALSE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
*LengthRead = Length; *LengthRead = Length;