diff --git a/reactos/drivers/fs/cdfs/cdfs.c b/reactos/drivers/fs/cdfs/cdfs.c index 1cf29cef884..a67d3a5b53a 100644 --- a/reactos/drivers/fs/cdfs/cdfs.c +++ b/reactos/drivers/fs/cdfs/cdfs.c @@ -1,6 +1,6 @@ /* * 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 * 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 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cdfs.c,v 1.9 2003/09/20 20:31:57 weiden Exp $ +/* $Id: cdfs.c,v 1.10 2003/11/10 11:32:08 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: services/fs/cdfs/cdfs.c + * FILE: drivers/fs/cdfs/cdfs.c * PURPOSE: CDROM (ISO 9660) filesystem driver * PROGRAMMER: Art Yerkes - * UPDATE HISTORY: + * Eric Kohl */ /* INCLUDES *****************************************************************/ @@ -58,7 +58,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, NTSTATUS Status; UNICODE_STRING DeviceName = UNICODE_STRING_INITIALIZER(L"\\Cdfs"); - DPRINT("CDFS 0.0.2\n"); + DPRINT("CDFS 0.0.3\n"); Status = IoCreateDevice(DriverObject, sizeof(CDFS_GLOBAL_DATA), diff --git a/reactos/drivers/fs/cdfs/cdfs.h b/reactos/drivers/fs/cdfs/cdfs.h index 570774339d2..14162bfdc87 100644 --- a/reactos/drivers/fs/cdfs/cdfs.h +++ b/reactos/drivers/fs/cdfs/cdfs.h @@ -141,13 +141,14 @@ typedef struct _CDINFO typedef struct { + ERESOURCE VcbResource; ERESOURCE DirResource; -// ERESOURCE FatResource; KSPIN_LOCK FcbListLock; LIST_ENTRY FcbListHead; PVPB Vpb; + PDEVICE_OBJECT VolumeDevice; PDEVICE_OBJECT StorageDevice; PFILE_OBJECT StreamFileObject; @@ -174,7 +175,6 @@ typedef struct _FCB WCHAR ShortName[13]; USHORT ShortNameLength; -// ERESOURCE PagingIoResource; ERESOURCE MainResource; LIST_ENTRY FcbListEntry; @@ -346,10 +346,6 @@ CdfsSetInformation(PDEVICE_OBJECT DeviceObject, /* fsctl.c */ -NTSTATUS -CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject, - PCDINFO CdInfo); - NTSTATUS STDCALL CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); diff --git a/reactos/drivers/fs/cdfs/create.c b/reactos/drivers/fs/cdfs/create.c index 88367b440b8..6d39df83973 100644 --- a/reactos/drivers/fs/cdfs/create.c +++ b/reactos/drivers/fs/cdfs/create.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: create.c,v 1.9 2003/11/09 11:20:28 ekohl Exp $ +/* $Id: create.c,v 1.10 2003/11/10 11:32:08 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,8 +35,6 @@ #include "cdfs.h" -//#define MEDIA_CHANGE_SUPPORT - /* FUNCTIONS ****************************************************************/ @@ -91,10 +89,6 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt, PFCB Fcb; NTSTATUS Status; PWSTR AbsFileName = NULL; -#ifdef MEDIA_CHANGE_SUPPORT - ULONG MediaChangeCount = 0; - ULONG BufferSize; -#endif DPRINT("CdfsOpenFile(%08lx, %08lx, %S)\n", DeviceExt, FileObject, FileName); @@ -108,54 +102,44 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt, FileName = AbsFileName; if (!NT_SUCCESS(Status)) { - return(Status); + return Status; } - 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, + NULL, + 0, TRUE); DPRINT ("Status %lx\n", Status); if (Status == STATUS_VERIFY_REQUIRED) { - CDINFO CdInfo; - DPRINT1 ("Media change detected!\n"); + PDEVICE_OBJECT DeviceToVerify; - Status = CdfsGetVolumeData (DeviceExt->StorageDevice, - &CdInfo); + DPRINT1 ("Media change detected!\n"); + DPRINT1 ("Device %p\n", DeviceExt->VolumeDevice); + + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), + NULL); + + Status = IoVerifyVolume (DeviceToVerify, + FALSE); if (!NT_SUCCESS(Status)) { - DPRINT1 ("CdfsGetVolumeData() failed (Status %lx)\n", Status); + DPRINT1 ("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) @@ -197,12 +181,10 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt, if (AbsFileName) ExFreePool (AbsFileName); - return Status; + return Status; } - - static NTSTATUS CdfsCreateFile(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -245,22 +227,22 @@ CdfsCreateFile(PDEVICE_OBJECT DeviceObject, FileObject->FileName.Buffer); if (NT_SUCCESS(Status)) - { - Fcb = FileObject->FsContext; - /* - * Check the file has the requested attributes - */ - if (RequestedOptions & FILE_NON_DIRECTORY_FILE && CdfsFCBIsDirectory(Fcb)) { - CdfsCloseFile (DeviceExt, FileObject); - return STATUS_FILE_IS_A_DIRECTORY; - } - if (RequestedOptions & FILE_DIRECTORY_FILE && !CdfsFCBIsDirectory(Fcb)) - { - CdfsCloseFile (DeviceExt, FileObject); - return STATUS_NOT_A_DIRECTORY; - } - } + Fcb = FileObject->FsContext; + + /* Check whether the file has the requested attributes */ + if (RequestedOptions & FILE_NON_DIRECTORY_FILE && CdfsFCBIsDirectory(Fcb)) + { + CdfsCloseFile (DeviceExt, FileObject); + return STATUS_FILE_IS_A_DIRECTORY; + } + + if (RequestedOptions & FILE_DIRECTORY_FILE && !CdfsFCBIsDirectory(Fcb)) + { + CdfsCloseFile (DeviceExt, FileObject); + return STATUS_NOT_A_DIRECTORY; + } + } /* * If the directory containing the file to open doesn't exist then @@ -269,7 +251,7 @@ CdfsCreateFile(PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0; Irp->IoStatus.Status = Status; - return(Status); + return Status; } @@ -302,7 +284,7 @@ ByeBye: IoCompleteRequest(Irp, NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT); - return(Status); + return Status; } /* EOF */ diff --git a/reactos/drivers/fs/cdfs/fsctl.c b/reactos/drivers/fs/cdfs/fsctl.c index cc00fc01686..bf9cb815f56 100644 --- a/reactos/drivers/fs/cdfs/fsctl.c +++ b/reactos/drivers/fs/cdfs/fsctl.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: fsctl.c,v 1.15 2003/11/09 11:20:28 ekohl Exp $ +/* $Id: fsctl.c,v 1.16 2003/11/10 11:32:08 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -179,7 +179,7 @@ CdfsGetSVDData(PUCHAR Buffer, } -NTSTATUS +static NTSTATUS CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject, PCDINFO CdInfo) { @@ -353,6 +353,7 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject, NewDeviceObject->Vpb = DeviceToMount->Vpb; + DeviceExt->VolumeDevice = NewDeviceObject; DeviceExt->StorageDevice = DeviceToMount; DeviceExt->StorageDevice->Vpb->DeviceObject = NewDeviceObject; DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice; @@ -407,8 +408,8 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject, goto ByeBye; } + ExInitializeResourceLite(&DeviceExt->VcbResource); ExInitializeResourceLite(&DeviceExt->DirResource); -// ExInitializeResourceLite(&DeviceExt->FatResource); KeInitializeSpinLock(&DeviceExt->FcbListLock); InitializeListHead(&DeviceExt->FcbListHead); @@ -439,12 +440,13 @@ static NTSTATUS CdfsVerifyVolume(PDEVICE_OBJECT DeviceObject, PIRP Irp) { + PDEVICE_EXTENSION DeviceExt; PDEVICE_OBJECT DeviceToVerify; PIO_STACK_LOCATION Stack; NTSTATUS Status; CDINFO CdInfo; - DPRINT1("CdfsVerifyVolume() called\n"); + DPRINT1 ("CdfsVerifyVolume() called\n"); #if 0 if (DeviceObject != CdfsGlobalData->DeviceObject) @@ -454,25 +456,50 @@ CdfsVerifyVolume(PDEVICE_OBJECT DeviceObject, } #endif - Stack = IoGetCurrentIrpStackLocation(Irp); + DeviceExt = DeviceObject->DeviceExtension; + + Stack = IoGetCurrentIrpStackLocation (Irp); DeviceToVerify = Stack->Parameters.VerifyVolume.DeviceObject; - DPRINT("Device object %p Device to verify %p\n", DeviceObject, DeviceToVerify); + ExAcquireResourceExclusiveLite (&DeviceExt->VcbResource, + TRUE); - CdInfo.SerialNumber = ~DeviceToVerify->Vpb->SerialNumber; - - Status = CdfsGetVolumeData(DeviceToVerify, &CdInfo); - - if (NT_SUCCESS(Status)) + if (!(DeviceToVerify->Flags & DO_VERIFY_VOLUME)) { - DPRINT("Current serial number %08lx Vpb serial number %08lx\n", - CdInfo.SerialNumber, DeviceToVerify->Vpb->SerialNumber); - - if (CdInfo.SerialNumber != DeviceToVerify->Vpb->SerialNumber) - Status = STATUS_WRONG_VOLUME; + DPRINT1 ("Volume has been verified!\n"); + ExReleaseResourceLite (&DeviceExt->VcbResource); + return STATUS_SUCCESS; } - return(Status); + DPRINT1 ("Device object %p Device to verify %p\n", DeviceObject, DeviceToVerify); + + Status = CdfsGetVolumeData (DeviceToVerify, + &CdInfo); + if (NT_SUCCESS(Status) && + CdInfo.SerialNumber == DeviceToVerify->Vpb->SerialNumber && + CdInfo.VolumeLabelLength == DeviceToVerify->Vpb->VolumeLabelLength && + !wcsncmp (CdInfo.VolumeLabel, DeviceToVerify->Vpb->VolumeLabel, CdInfo.VolumeLabelLength)) + { + DPRINT1 ("Same volume!\n"); + + /* FIXME: Flush and purge metadata */ + + Status = STATUS_SUCCESS; + } + else + { + DPRINT1 ("Different volume!\n"); + + /* FIXME: force volume dismount */ + + Status = STATUS_WRONG_VOLUME; + } + + DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; + + ExReleaseResourceLite (&DeviceExt->VcbResource); + + return Status; } @@ -490,7 +517,7 @@ CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject, switch (Stack->MinorFunction) { case IRP_MN_USER_FS_REQUEST: - DPRINT("CDFS: IRP_MN_USER_FS_REQUEST\n"); + DPRINT1("CDFS: IRP_MN_USER_FS_REQUEST\n"); Status = STATUS_INVALID_DEVICE_REQUEST; break; @@ -505,7 +532,7 @@ CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject, break; default: - DPRINT("CDFS FSC: MinorFunction %d\n", Stack->MinorFunction); + DPRINT1("CDFS FSC: MinorFunction %d\n", Stack->MinorFunction); Status = STATUS_INVALID_DEVICE_REQUEST; break; } diff --git a/reactos/drivers/fs/cdfs/makefile b/reactos/drivers/fs/cdfs/makefile index 5dbb1639dac..20c6815844e 100644 --- a/reactos/drivers/fs/cdfs/makefile +++ b/reactos/drivers/fs/cdfs/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.5 2003/04/05 09:37:42 chorns Exp $ +# $Id: makefile,v 1.6 2003/11/10 11:32:08 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -11,8 +11,12 @@ TARGET_NAME = cdfs TARGET_OBJECTS = $(TARGET_NAME).o close.o common.o create.o dirctl.o \ fcb.o finfo.o fsctl.o misc.o rw.o volinfo.o cleanup.o +DEP_OBJECTS = $(TARGET_OBJECTS) + include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk +include $(TOOLS_PATH)/depend.mk + # EOF