Finished media change support, except for prper volume dismount.

Added dependency checks.

svn path=/trunk/; revision=6600
This commit is contained in:
Eric Kohl 2003-11-10 11:32:08 +00:00
parent bbb4ce681e
commit 2a681979b8
5 changed files with 93 additions and 84 deletions

View file

@ -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),

View file

@ -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);

View file

@ -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 */

View file

@ -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;
}

View file

@ -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