mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 21:28:48 +00:00
[fastfat_new]
- Add an internal routine for opening root DCB (a stub for now). - Add code for checking if this is a relative or absolute open. Start implementing absolute opening part. svn path=/trunk/; revision=43203
This commit is contained in:
parent
dfe3bd48b3
commit
6c1fab522b
|
@ -13,6 +13,24 @@
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
IO_STATUS_BLOCK
|
||||||
|
NTAPI
|
||||||
|
FatiOpenRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PVCB Vcb,
|
||||||
|
IN PACCESS_MASK DesiredAccess,
|
||||||
|
IN USHORT ShareAccess,
|
||||||
|
IN ULONG CreateDisposition)
|
||||||
|
{
|
||||||
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
|
||||||
|
DPRINT1("Opening root directory\n");
|
||||||
|
|
||||||
|
Iosb.Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
return Iosb;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
@ -36,6 +54,7 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
PVCB Vcb, DecodedVcb;
|
PVCB Vcb, DecodedVcb;
|
||||||
PFCB Fcb;
|
PFCB Fcb;
|
||||||
PCCB Ccb;
|
PCCB Ccb;
|
||||||
|
PFCB ParentDcb;
|
||||||
|
|
||||||
/* IRP data */
|
/* IRP data */
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
|
@ -51,7 +70,7 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
|
||||||
/* Misc */
|
/* Misc */
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
//IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
PIO_STACK_LOCATION IrpSp;
|
PIO_STACK_LOCATION IrpSp;
|
||||||
|
|
||||||
/* Get current IRP stack location */
|
/* Get current IRP stack location */
|
||||||
|
@ -184,10 +203,10 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
|
||||||
// TODO: Make sure EAs aren't supported on FAT32
|
// TODO: Make sure EAs aren't supported on FAT32
|
||||||
|
|
||||||
|
/* Check if it's a volume open request */
|
||||||
if (FileName.Length == 0)
|
if (FileName.Length == 0)
|
||||||
{
|
{
|
||||||
/* It is a volume open request, check related FO to be sure */
|
/* Test related FO to be sure */
|
||||||
|
|
||||||
if (!RelatedFO ||
|
if (!RelatedFO ||
|
||||||
FatDecodeFileObject(RelatedFO, &DecodedVcb, &Fcb, &Ccb) == UserVolumeOpen)
|
FatDecodeFileObject(RelatedFO, &DecodedVcb, &Fcb, &Ccb) == UserVolumeOpen)
|
||||||
{
|
{
|
||||||
|
@ -197,6 +216,58 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if this is a relative open */
|
||||||
|
if (RelatedFO)
|
||||||
|
{
|
||||||
|
// RelatedFO will be a parent directory
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Absolute open */
|
||||||
|
if ((FileName.Length == sizeof(WCHAR)) &&
|
||||||
|
(FileName.Buffer[0] == L'\\'))
|
||||||
|
{
|
||||||
|
/* Check if it's ok to open it */
|
||||||
|
if (NonDirectoryFile)
|
||||||
|
{
|
||||||
|
DPRINT1("Trying to open root dir as a file\n");
|
||||||
|
|
||||||
|
/* Cleanup and return */
|
||||||
|
FatReleaseVcb(IrpContext, Vcb);
|
||||||
|
return STATUS_FILE_IS_A_DIRECTORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check delete on close on a root dir */
|
||||||
|
if (DeleteOnClose)
|
||||||
|
{
|
||||||
|
/* Cleanup and return */
|
||||||
|
FatReleaseVcb(IrpContext, Vcb);
|
||||||
|
return STATUS_CANNOT_DELETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call root directory open routine */
|
||||||
|
Iosb = FatiOpenRootDcb(IrpContext,
|
||||||
|
FileObject,
|
||||||
|
Vcb,
|
||||||
|
DesiredAccess,
|
||||||
|
ShareAccess,
|
||||||
|
CreateDisposition);
|
||||||
|
|
||||||
|
Irp->IoStatus.Information = Iosb.Information;
|
||||||
|
|
||||||
|
/* Cleanup and return */
|
||||||
|
FatReleaseVcb(IrpContext, Vcb);
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Not a root dir */
|
||||||
|
ParentDcb = Vcb->RootDcb;
|
||||||
|
DPRINT1("ParentDcb %p\n", ParentDcb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//return Iosb.Status;
|
//return Iosb.Status;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,8 +170,9 @@ typedef struct _VCB
|
||||||
ULONG RootDirentSectors;
|
ULONG RootDirentSectors;
|
||||||
LONGLONG BeyondLastClusterInFat;
|
LONGLONG BeyondLastClusterInFat;
|
||||||
FAT_METHODS Methods;
|
FAT_METHODS Methods;
|
||||||
/* Root Directory Fcb: */
|
|
||||||
struct _FCB *RootFcb;
|
/* Root Directory Control block */
|
||||||
|
struct _FCB *RootDcb;
|
||||||
|
|
||||||
ULONG MediaChangeCount;
|
ULONG MediaChangeCount;
|
||||||
} VCB, *PVCB;
|
} VCB, *PVCB;
|
||||||
|
|
Loading…
Reference in a new issue