Added support for accessing the raw volume.

svn path=/trunk/; revision=2911
This commit is contained in:
Hartmut Birr 2002-05-05 20:18:33 +00:00
parent 11cc443546
commit d31b1c24ca
3 changed files with 56 additions and 9 deletions

View file

@ -1,4 +1,4 @@
/* $Id: close.c,v 1.9 2001/11/02 22:44:34 hbirr Exp $
/* $Id: close.c,v 1.10 2002/05/05 20:18:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -39,12 +39,18 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
{
return STATUS_SUCCESS;
}
if (FileObject->FileName.Buffer)
pFcb = pCcb->pFcb;
if (pFcb->Flags & FCB_IS_VOLUME)
{
DPRINT1("Volume\n");
pFcb->RefCount--;
FileObject->FsContext2 = NULL;
}
else if (FileObject->FileName.Buffer)
{
// This a FO, that was created outside from FSD.
// Some FO's are created with IoCreateStreamFileObject() insid from FSD.
// This FO's haven't a FileName.
pFcb = pCcb->pFcb;
if (FileObject->DeletePending)
{
if (pFcb->Flags & FCB_DELETE_PENDING)

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.39 2002/03/18 22:37:12 hbirr Exp $
/* $Id: create.c,v 1.40 2002/05/05 20:18:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -583,6 +583,43 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp)
DeviceExt = DeviceObject->DeviceExtension;
assert (DeviceExt);
if (FileObject->FileName.Length == 0 && FileObject->RelatedFileObject == NULL)
{
/* This a open operation for the volume itself */
if (RequestedDisposition == FILE_CREATE ||
RequestedDisposition == FILE_OVERWRITE_IF ||
RequestedDisposition == FILE_SUPERSEDE)
{
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
return STATUS_ACCESS_DENIED;
}
if (RequestedOptions & FILE_DIRECTORY_FILE)
{
Irp->IoStatus.Status = STATUS_NOT_A_DIRECTORY;
return STATUS_NOT_A_DIRECTORY;
}
pFcb = DeviceExt->VolumeFcb;
pCcb = ExAllocatePoolWithTag (NonPagedPool, sizeof (VFATCCB), TAG_CCB);
if (pCcb == NULL)
{
Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
return STATUS_INSUFFICIENT_RESOURCES;
}
memset(pCcb, 0, sizeof(VFATCCB));
FileObject->Flags |= FO_FCB_IS_VALID;
FileObject->SectionObjectPointers = &pFcb->SectionObjectPointers;
FileObject->FsContext = (PVOID) &pFcb->RFCB;
FileObject->FsContext2 = pCcb;
pCcb->pFcb = pFcb;
pCcb->PtrFileObject = FileObject;
pFcb->pDevExt = DeviceExt;
pFcb->RefCount++;
Irp->IoStatus.Information = FILE_OPENED;
Irp->IoStatus.Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
/*
* Check for illegal characters in the file name
*/

View file

@ -1,4 +1,4 @@
/* $Id: vfat.h,v 1.40 2002/03/18 22:37:13 hbirr Exp $ */
/* $Id: vfat.h,v 1.41 2002/05/05 20:18:33 hbirr Exp $ */
#include <ddk/ntifs.h>
@ -113,9 +113,12 @@ typedef struct
ULONG BytesPerCluster;
ULONG NumberOfClusters;
ULONG FatType;
ULONG Sectors;
}
FATINFO, *PFATINFO;
struct _VFATFCB;
typedef struct
{
ERESOURCE DirResource;
@ -131,6 +134,7 @@ typedef struct
ULONG AvailableClusters;
BOOLEAN AvailableClustersValid;
ULONG Flags;
struct _VFATFCB * VolumeFcb;
}
DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
@ -148,6 +152,7 @@ extern PVFAT_GLOBAL_DATA VfatGlobalData;
#define FCB_DELETE_PENDING 0x0002
#define FCB_IS_FAT 0x0004
#define FCB_IS_PAGE_FILE 0x0008
#define FCB_IS_VOLUME 0x0010
typedef struct _VFATFCB
{
@ -482,7 +487,7 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
NTSTATUS vfatExtendSpace (PDEVICE_EXTENSION pDeviceExt,
PFILE_OBJECT pFileObject,
ULONG NewSize);
/*
NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt,
PFILE_OBJECT FileObject,
PVOID Buffer,
@ -498,7 +503,6 @@ NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt,
ULONG ReadOffset,
PULONG LengthRead,
ULONG NoCache);
*/
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
PVFATFCB Fcb,
@ -517,11 +521,11 @@ VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
PIRP Irp);
/*
PVOID VfatGetUserBuffer(IN PIRP);
NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
IN LOCK_OPERATION);
*/
/* EOF */