mirror of
https://github.com/reactos/reactos.git
synced 2025-04-07 06:14:44 +00:00
Added support for accessing the raw volume.
svn path=/trunk/; revision=2911
This commit is contained in:
parent
11cc443546
commit
d31b1c24ca
3 changed files with 56 additions and 9 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue